Merge branch 'main' into patch-1

zio/stable
SnackpackWayne 2023-12-27 22:38:01 +01:00 committed by GitHub
commit 52cb777c94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 221 additions and 122 deletions

View File

@ -336,7 +336,11 @@ func (srv *Server) WebPost(c echo.Context) error {
data["postView"] = postView data["postView"] = postView
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path) data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path)
if postView.Embed != nil && postView.Embed.EmbedImages_View != nil { if postView.Embed != nil && postView.Embed.EmbedImages_View != nil {
data["imgThumbUrl"] = postView.Embed.EmbedImages_View.Images[0].Thumb var thumbUrls []string
for i := range postView.Embed.EmbedImages_View.Images {
thumbUrls = append(thumbUrls, postView.Embed.EmbedImages_View.Images[i].Thumb)
}
data["imgThumbUrls"] = thumbUrls
} }
return c.Render(http.StatusOK, "post.html", data) return c.Render(http.StatusOK, "post.html", data)
} }

View File

@ -25,8 +25,10 @@
<meta name="description" content="{{ postView.Record.Val.Text }}"> <meta name="description" content="{{ postView.Record.Val.Text }}">
<meta property="og:description" content="{{ postView.Record.Val.Text }}"> <meta property="og:description" content="{{ postView.Record.Val.Text }}">
{% endif -%} {% endif -%}
{%- if imgThumbUrl %} {%- if imgThumbUrls %}
{% for imgThumbUrl in imgThumbUrls %}
<meta property="og:image" content="{{ imgThumbUrl }}"> <meta property="og:image" content="{{ imgThumbUrl }}">
{% endfor %}
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:card" content="summary_large_image">
{%- elif postView.Author.Avatar %} {%- elif postView.Author.Avatar %}
{# Don't use avatar image in cards; usually looks bad #} {# Don't use avatar image in cards; usually looks bad #}

View File

@ -1,9 +1,7 @@
import {isWeb} from 'platform/detection'
import React, {ReactNode, createContext, useContext} from 'react' import React, {ReactNode, createContext, useContext} from 'react'
import { import {
AppState,
TextStyle, TextStyle,
useColorScheme as useColorScheme_BUGGY, useColorScheme,
ViewStyle, ViewStyle,
ColorSchemeName, ColorSchemeName,
} from 'react-native' } from 'react-native'
@ -97,37 +95,11 @@ function getTheme(theme: ColorSchemeName) {
return theme === 'dark' ? darkTheme : defaultTheme return theme === 'dark' ? darkTheme : defaultTheme
} }
/**
* With RN iOS, we can only "trust" the color scheme reported while the app is
* active. This is a workaround until the bug is fixed upstream.
*
* @see https://github.com/bluesky-social/social-app/pull/1417#issuecomment-1719868504
* @see https://github.com/facebook/react-native/pull/39439
*/
function useColorScheme_FIXED() {
const colorScheme = useColorScheme_BUGGY()
const [currentColorScheme, setCurrentColorScheme] =
React.useState<ColorSchemeName>(colorScheme)
React.useEffect(() => {
// we don't need to be updating state on web
if (isWeb) return
const subscription = AppState.addEventListener('change', state => {
const isActive = state === 'active'
if (!isActive) return
setCurrentColorScheme(colorScheme)
})
return () => subscription.remove()
}, [colorScheme])
return isWeb ? colorScheme : currentColorScheme
}
export const ThemeProvider: React.FC<ThemeProviderProps> = ({ export const ThemeProvider: React.FC<ThemeProviderProps> = ({
theme, theme,
children, children,
}) => { }) => {
const colorScheme = useColorScheme_FIXED() const colorScheme = useColorScheme()
const themeValue = getTheme(theme === 'system' ? colorScheme : theme) const themeValue = getTheme(theme === 'system' ? colorScheme : theme)
return ( return (

View File

@ -117,11 +117,7 @@ export class FeedViewPostsSlice {
} }
export class NoopFeedTuner { export class NoopFeedTuner {
private keyCounter = 0 reset() {}
reset() {
this.keyCounter = 0
}
tune( tune(
feed: FeedViewPost[], feed: FeedViewPost[],
_opts?: {dryRun: boolean; maintainOrder: boolean}, _opts?: {dryRun: boolean; maintainOrder: boolean},
@ -131,13 +127,13 @@ export class NoopFeedTuner {
} }
export class FeedTuner { export class FeedTuner {
private keyCounter = 0 seenKeys: Set<string> = new Set()
seenUris: Set<string> = new Set() seenUris: Set<string> = new Set()
constructor(public tunerFns: FeedTunerFn[]) {} constructor(public tunerFns: FeedTunerFn[]) {}
reset() { reset() {
this.keyCounter = 0 this.seenKeys.clear()
this.seenUris.clear() this.seenUris.clear()
} }
@ -218,11 +214,16 @@ export class FeedTuner {
} }
if (!dryRun) { if (!dryRun) {
for (const slice of slices) { slices = slices.filter(slice => {
if (this.seenKeys.has(slice._reactKey)) {
return false
}
for (const item of slice.items) { for (const item of slice.items) {
this.seenUris.add(item.post.uri) this.seenUris.add(item.post.uri)
} }
} this.seenKeys.add(slice._reactKey)
return true
})
} }
return slices return slices

View File

@ -7,7 +7,7 @@ import {messages as messagesHi} from '#/locale/locales/hi/messages'
import {messages as messagesJa} from '#/locale/locales/ja/messages' import {messages as messagesJa} from '#/locale/locales/ja/messages'
import {messages as messagesFr} from '#/locale/locales/fr/messages' import {messages as messagesFr} from '#/locale/locales/fr/messages'
import {messages as messagesDe} from '#/locale/locales/de/messages' import {messages as messagesDe} from '#/locale/locales/de/messages'
import {messages as messagesEs} from '#/locale/locales/de/messages' import {messages as messagesEs} from '#/locale/locales/es/messages'
import {sanitizeAppLanguageSetting} from '#/locale/helpers' import {sanitizeAppLanguageSetting} from '#/locale/helpers'
import {AppLanguage} from '#/locale/languages' import {AppLanguage} from '#/locale/languages'

View File

@ -105,11 +105,11 @@ msgstr "Details hinzufügen"
msgid "Add details to report" msgid "Add details to report"
msgstr "Details zum Report hinzufügen" msgstr "Details zum Report hinzufügen"
#: src/view/com/composer/Composer.tsx:438 #: src/view/com/composer/Composer.tsx:442
msgid "Add link card" msgid "Add link card"
msgstr "Link-Karte hinzufügen" msgstr "Link-Karte hinzufügen"
#: src/view/com/composer/Composer.tsx:441 #: src/view/com/composer/Composer.tsx:445
msgid "Add link card:" msgid "Add link card:"
msgstr "Link-Karte hinzufügen:" msgstr "Link-Karte hinzufügen:"
@ -335,18 +335,22 @@ msgstr "Kamera"
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "Darf nur Buchstaben, Zahlen, Leerzeichen, Bindestriche und Unterstriche enthalten. Muss mindestens 4 Zeichen lang sein, darf aber nicht länger als 32 Zeichen sein." msgstr "Darf nur Buchstaben, Zahlen, Leerzeichen, Bindestriche und Unterstriche enthalten. Muss mindestens 4 Zeichen lang sein, darf aber nicht länger als 32 Zeichen sein."
#: src/view/com/composer/Composer.tsx:285 #: src/view/com/composer/Composer.tsx:289
#: src/view/com/composer/Composer.tsx:288 src/view/com/modals/AltImage.tsx:128 #: src/view/com/composer/Composer.tsx:292
#: src/view/com/modals/AltImage.tsx:128
#: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220 src/view/com/modals/Confirm.tsx:88 #: src/view/com/modals/ChangeEmail.tsx:220
#: src/view/com/modals/Confirm.tsx:88
#: src/view/com/modals/CreateOrEditList.tsx:267 #: src/view/com/modals/CreateOrEditList.tsx:267
#: src/view/com/modals/CreateOrEditList.tsx:272 #: src/view/com/modals/CreateOrEditList.tsx:272
#: src/view/com/modals/DeleteAccount.tsx:150 #: src/view/com/modals/DeleteAccount.tsx:150
#: src/view/com/modals/DeleteAccount.tsx:223 #: src/view/com/modals/DeleteAccount.tsx:223
#: src/view/com/modals/EditImage.tsx:323 #: src/view/com/modals/EditImage.tsx:323
#: src/view/com/modals/EditProfile.tsx:248 #: src/view/com/modals/EditProfile.tsx:248
#: src/view/com/modals/LinkWarning.tsx:85 src/view/com/modals/Repost.tsx:73 #: src/view/com/modals/LinkWarning.tsx:85
#: src/view/com/modals/Waitlist.tsx:136 src/view/screens/Search/Search.tsx:584 #: src/view/com/modals/Repost.tsx:73
#: src/view/com/modals/Waitlist.tsx:136
#: src/view/screens/Search/Search.tsx:584
#: src/view/shell/desktop/Search.tsx:182 #: src/view/shell/desktop/Search.tsx:182
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
@ -651,6 +655,10 @@ msgstr "Entwicklungsserver"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "Entwickler-Tools" msgstr "Entwickler-Tools"
#: src/view/com/composer/Composer.tsx:210
msgid "Did you want to say anything?"
msgstr ""
#: src/view/com/composer/Composer.tsx:143 #: src/view/com/composer/Composer.tsx:143
msgid "Discard" msgid "Discard"
msgstr "Verwerfen" msgstr "Verwerfen"
@ -1346,7 +1354,7 @@ msgstr "Oh nein!"
msgid "Okay" msgid "Okay"
msgstr "Okay" msgstr "Okay"
#: src/view/com/composer/Composer.tsx:354 #: src/view/com/composer/Composer.tsx:358
msgid "One or more images is missing alt text." msgid "One or more images is missing alt text."
msgstr "Bei einem oder mehreren Bildern fehlt der Alt-Text." msgstr "Bei einem oder mehreren Bildern fehlt der Alt-Text."
@ -1467,7 +1475,11 @@ msgstr "Bitte gib auch dein Passwort ein:"
msgid "Please tell us why you think this content warning was incorrectly applied!" msgid "Please tell us why you think this content warning was incorrectly applied!"
msgstr "Bitte teile uns mit, warum du denkst, dass diese Inhaltswarnung falsch angewendet wurde!" msgstr "Bitte teile uns mit, warum du denkst, dass diese Inhaltswarnung falsch angewendet wurde!"
#: src/view/com/composer/Composer.tsx:337 #: src/view/com/composer/Composer.tsx:214
msgid "Please wait for your link card to finish loading"
msgstr ""
#: src/view/com/composer/Composer.tsx:341
#: src/view/com/post-thread/PostThread.tsx:225 #: src/view/com/post-thread/PostThread.tsx:225
#: src/view/screens/PostThread.tsx:80 #: src/view/screens/PostThread.tsx:80
msgid "Post" msgid "Post"
@ -2274,7 +2286,7 @@ msgstr "Wer antworten kann"
msgid "Wide" msgid "Wide"
msgstr "Breit" msgstr "Breit"
#: src/view/com/composer/Composer.tsx:409 #: src/view/com/composer/Composer.tsx:413
msgid "Write post" msgid "Write post"
msgstr "Beitrag verfassen" msgstr "Beitrag verfassen"

View File

@ -130,11 +130,11 @@ msgstr ""
msgid "Add details to report" msgid "Add details to report"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:438 #: src/view/com/composer/Composer.tsx:442
msgid "Add link card" msgid "Add link card"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:441 #: src/view/com/composer/Composer.tsx:445
msgid "Add link card:" msgid "Add link card:"
msgstr "" msgstr ""
@ -373,8 +373,8 @@ msgstr ""
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:285 #: src/view/com/composer/Composer.tsx:289
#: src/view/com/composer/Composer.tsx:288 #: src/view/com/composer/Composer.tsx:292
#: src/view/com/modals/AltImage.tsx:128 #: src/view/com/modals/AltImage.tsx:128
#: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/ChangeEmail.tsx:220
@ -705,6 +705,10 @@ msgstr ""
msgid "Developer Tools" msgid "Developer Tools"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:210
msgid "Did you want to say anything?"
msgstr ""
#: src/view/com/composer/Composer.tsx:143 #: src/view/com/composer/Composer.tsx:143
msgid "Discard" msgid "Discard"
msgstr "" msgstr ""
@ -1492,7 +1496,7 @@ msgstr ""
msgid "Okay" msgid "Okay"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:354 #: src/view/com/composer/Composer.tsx:358
msgid "One or more images is missing alt text." msgid "One or more images is missing alt text."
msgstr "" msgstr ""
@ -1620,7 +1624,11 @@ msgstr ""
#~ msgid "Please tell us why you think this decision was incorrect." #~ msgid "Please tell us why you think this decision was incorrect."
#~ msgstr "" #~ msgstr ""
#: src/view/com/composer/Composer.tsx:337 #: src/view/com/composer/Composer.tsx:214
msgid "Please wait for your link card to finish loading"
msgstr ""
#: src/view/com/composer/Composer.tsx:341
#: src/view/com/post-thread/PostThread.tsx:225 #: src/view/com/post-thread/PostThread.tsx:225
#: src/view/screens/PostThread.tsx:80 #: src/view/screens/PostThread.tsx:80
msgid "Post" msgid "Post"
@ -2497,7 +2505,7 @@ msgstr ""
msgid "Wide" msgid "Wide"
msgstr "" msgstr ""
#: src/view/com/composer/Composer.tsx:409 #: src/view/com/composer/Composer.tsx:413
msgid "Write post" msgid "Write post"
msgstr "" msgstr ""

View File

@ -110,11 +110,11 @@ msgstr "Agregar detalles"
msgid "Add details to report" msgid "Add details to report"
msgstr "Agregar detalles al informe" msgstr "Agregar detalles al informe"
#: src/view/com/composer/Composer.tsx:438 #: src/view/com/composer/Composer.tsx:442
msgid "Add link card" msgid "Add link card"
msgstr "Agregar una tarjeta de enlace" msgstr "Agregar una tarjeta de enlace"
#: src/view/com/composer/Composer.tsx:441 #: src/view/com/composer/Composer.tsx:445
msgid "Add link card:" msgid "Add link card:"
msgstr "Agregar una tarjeta de enlace:" msgstr "Agregar una tarjeta de enlace:"
@ -345,8 +345,8 @@ msgstr "Cámara"
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "Sólo puede contener letras, números, espacios, guiones y guiones bajos. Debe tener al menos 4 caracteres, pero no más de 32." msgstr "Sólo puede contener letras, números, espacios, guiones y guiones bajos. Debe tener al menos 4 caracteres, pero no más de 32."
#: src/view/com/composer/Composer.tsx:285 #: src/view/com/composer/Composer.tsx:289
#: src/view/com/composer/Composer.tsx:288 #: src/view/com/composer/Composer.tsx:292
#: src/view/com/modals/AltImage.tsx:128 #: src/view/com/modals/AltImage.tsx:128
#: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/ChangeEmail.tsx:220
@ -669,6 +669,10 @@ msgstr "Servidor de desarrollo"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "Herramientas de desarrollador" msgstr "Herramientas de desarrollador"
#: src/view/com/composer/Composer.tsx:210
msgid "Did you want to say anything?"
msgstr ""
#: src/view/com/composer/Composer.tsx:143 #: src/view/com/composer/Composer.tsx:143
msgid "Discard" msgid "Discard"
msgstr "Descartar" msgstr "Descartar"
@ -1398,7 +1402,7 @@ msgstr "¡Qué problema!"
msgid "Okay" msgid "Okay"
msgstr "Está bien" msgstr "Está bien"
#: src/view/com/composer/Composer.tsx:354 #: src/view/com/composer/Composer.tsx:358
msgid "One or more images is missing alt text." msgid "One or more images is missing alt text."
msgstr "Falta el texto alternativo en una o varias imágenes." msgstr "Falta el texto alternativo en una o varias imágenes."
@ -1526,7 +1530,11 @@ msgstr ""
#~ msgid "Please tell us why you think this decision was incorrect." #~ msgid "Please tell us why you think this decision was incorrect."
#~ msgstr "Por favor, dinos por qué crees que esta decisión fue incorrecta." #~ msgstr "Por favor, dinos por qué crees que esta decisión fue incorrecta."
#: src/view/com/composer/Composer.tsx:337 #: src/view/com/composer/Composer.tsx:214
msgid "Please wait for your link card to finish loading"
msgstr ""
#: src/view/com/composer/Composer.tsx:341
#: src/view/com/post-thread/PostThread.tsx:225 #: src/view/com/post-thread/PostThread.tsx:225
#: src/view/screens/PostThread.tsx:80 #: src/view/screens/PostThread.tsx:80
msgid "Post" msgid "Post"
@ -2358,7 +2366,7 @@ msgstr "Quién puede responder"
msgid "Wide" msgid "Wide"
msgstr "Ancho" msgstr "Ancho"
#: src/view/com/composer/Composer.tsx:409 #: src/view/com/composer/Composer.tsx:413
msgid "Write post" msgid "Write post"
msgstr "Redactar una publicación" msgstr "Redactar una publicación"

View File

@ -110,11 +110,11 @@ msgstr "Ajouter des détails"
msgid "Add details to report" msgid "Add details to report"
msgstr "Ajouter des détails au rapport" msgstr "Ajouter des détails au rapport"
#: src/view/com/composer/Composer.tsx:438 #: src/view/com/composer/Composer.tsx:442
msgid "Add link card" msgid "Add link card"
msgstr "Ajouter une carte link card" msgstr "Ajouter une carte link card"
#: src/view/com/composer/Composer.tsx:441 #: src/view/com/composer/Composer.tsx:445
msgid "Add link card:" msgid "Add link card:"
msgstr "Ajouter une carte link card :" msgstr "Ajouter une carte link card :"
@ -345,8 +345,8 @@ msgstr "Caméra"
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "Ne peut contenir que des lettres, des chiffres, des espaces, des tirets et des tirets bas. La longueur doit être dau moins 4 caractères, mais pas plus de 32." msgstr "Ne peut contenir que des lettres, des chiffres, des espaces, des tirets et des tirets bas. La longueur doit être dau moins 4 caractères, mais pas plus de 32."
#: src/view/com/composer/Composer.tsx:285 #: src/view/com/composer/Composer.tsx:289
#: src/view/com/composer/Composer.tsx:288 #: src/view/com/composer/Composer.tsx:292
#: src/view/com/modals/AltImage.tsx:128 #: src/view/com/modals/AltImage.tsx:128
#: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/ChangeEmail.tsx:220
@ -669,6 +669,10 @@ msgstr "Serveur de dév"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "Outils du dév" msgstr "Outils du dév"
#: src/view/com/composer/Composer.tsx:210
msgid "Did you want to say anything?"
msgstr ""
#: src/view/com/composer/Composer.tsx:143 #: src/view/com/composer/Composer.tsx:143
msgid "Discard" msgid "Discard"
msgstr "Ignorer" msgstr "Ignorer"
@ -1398,7 +1402,7 @@ msgstr "Oh non !"
msgid "Okay" msgid "Okay"
msgstr "Daccord" msgstr "Daccord"
#: src/view/com/composer/Composer.tsx:354 #: src/view/com/composer/Composer.tsx:358
msgid "One or more images is missing alt text." msgid "One or more images is missing alt text."
msgstr "Une ou plusieurs images nont pas de texte alt." msgstr "Une ou plusieurs images nont pas de texte alt."
@ -1526,7 +1530,11 @@ msgstr ""
#~ msgid "Please tell us why you think this decision was incorrect." #~ msgid "Please tell us why you think this decision was incorrect."
#~ msgstr "Dites-nous pourquoi vous pensez que cette décision était incorrecte." #~ msgstr "Dites-nous pourquoi vous pensez que cette décision était incorrecte."
#: src/view/com/composer/Composer.tsx:337 #: src/view/com/composer/Composer.tsx:214
msgid "Please wait for your link card to finish loading"
msgstr ""
#: src/view/com/composer/Composer.tsx:341
#: src/view/com/post-thread/PostThread.tsx:225 #: src/view/com/post-thread/PostThread.tsx:225
#: src/view/screens/PostThread.tsx:80 #: src/view/screens/PostThread.tsx:80
msgid "Post" msgid "Post"
@ -2358,7 +2366,7 @@ msgstr "Qui peut répondre ?"
msgid "Wide" msgid "Wide"
msgstr "Large" msgstr "Large"
#: src/view/com/composer/Composer.tsx:409 #: src/view/com/composer/Composer.tsx:413
msgid "Write post" msgid "Write post"
msgstr "Rédiger une publication" msgstr "Rédiger une publication"

View File

@ -130,11 +130,11 @@ msgstr "विवरण जोड़ें"
msgid "Add details to report" msgid "Add details to report"
msgstr "रिपोर्ट करने के लिए विवरण जोड़ें" msgstr "रिपोर्ट करने के लिए विवरण जोड़ें"
#: src/view/com/composer/Composer.tsx:438 #: src/view/com/composer/Composer.tsx:442
msgid "Add link card" msgid "Add link card"
msgstr "लिंक कार्ड जोड़ें" msgstr "लिंक कार्ड जोड़ें"
#: src/view/com/composer/Composer.tsx:441 #: src/view/com/composer/Composer.tsx:445
msgid "Add link card:" msgid "Add link card:"
msgstr "लिंक कार्ड जोड़ें:" msgstr "लिंक कार्ड जोड़ें:"
@ -373,8 +373,8 @@ msgstr "कैमरा"
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "केवल अक्षर, संख्या, रिक्त स्थान, डैश और अंडरस्कोर हो सकते हैं। कम से कम 4 अक्षर लंबा होना चाहिए, लेकिन 32 अक्षरों से अधिक लंबा नहीं होना चाहिए।।" msgstr "केवल अक्षर, संख्या, रिक्त स्थान, डैश और अंडरस्कोर हो सकते हैं। कम से कम 4 अक्षर लंबा होना चाहिए, लेकिन 32 अक्षरों से अधिक लंबा नहीं होना चाहिए।।"
#: src/view/com/composer/Composer.tsx:285 #: src/view/com/composer/Composer.tsx:289
#: src/view/com/composer/Composer.tsx:288 #: src/view/com/composer/Composer.tsx:292
#: src/view/com/modals/AltImage.tsx:128 #: src/view/com/modals/AltImage.tsx:128
#: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/ChangeEmail.tsx:220
@ -701,6 +701,10 @@ msgstr "देव सर्वर"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "डेवलपर उपकरण" msgstr "डेवलपर उपकरण"
#: src/view/com/composer/Composer.tsx:210
msgid "Did you want to say anything?"
msgstr ""
#: src/view/com/composer/Composer.tsx:143 #: src/view/com/composer/Composer.tsx:143
msgid "Discard" msgid "Discard"
msgstr "" msgstr ""
@ -1484,7 +1488,7 @@ msgstr "अरे नहीं!"
msgid "Okay" msgid "Okay"
msgstr "ठीक है" msgstr "ठीक है"
#: src/view/com/composer/Composer.tsx:354 #: src/view/com/composer/Composer.tsx:358
msgid "One or more images is missing alt text." msgid "One or more images is missing alt text."
msgstr "एक या अधिक छवियाँ alt पाठ याद आती हैं।।" msgstr "एक या अधिक छवियाँ alt पाठ याद आती हैं।।"
@ -1612,7 +1616,11 @@ msgstr ""
#~ msgid "Please tell us why you think this decision was incorrect." #~ msgid "Please tell us why you think this decision was incorrect."
#~ msgstr "" #~ msgstr ""
#: src/view/com/composer/Composer.tsx:337 #: src/view/com/composer/Composer.tsx:214
msgid "Please wait for your link card to finish loading"
msgstr ""
#: src/view/com/composer/Composer.tsx:341
#: src/view/com/post-thread/PostThread.tsx:225 #: src/view/com/post-thread/PostThread.tsx:225
#: src/view/screens/PostThread.tsx:80 #: src/view/screens/PostThread.tsx:80
msgid "Post" msgid "Post"
@ -2489,7 +2497,7 @@ msgstr ""
msgid "Wide" msgid "Wide"
msgstr "चौड़ा" msgstr "चौड़ा"
#: src/view/com/composer/Composer.tsx:409 #: src/view/com/composer/Composer.tsx:413
msgid "Write post" msgid "Write post"
msgstr "पोस्ट लिखो" msgstr "पोस्ट लिखो"

View File

@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Hima-Zinn\n" "Last-Translator: noritada\n"
"Language-Team: Hima-Zinn, tkusano, dolciss, oboenikui, noritada\n" "Language-Team: Hima-Zinn, tkusano, dolciss, oboenikui, noritada\n"
"Plural-Forms: \n" "Plural-Forms: \n"
@ -110,11 +110,11 @@ msgstr "詳細を追加"
msgid "Add details to report" msgid "Add details to report"
msgstr "レポートに詳細を追加" msgstr "レポートに詳細を追加"
#: src/view/com/composer/Composer.tsx:438 #: src/view/com/composer/Composer.tsx:442
msgid "Add link card" msgid "Add link card"
msgstr "リンクカードを追加" msgstr "リンクカードを追加"
#: src/view/com/composer/Composer.tsx:441 #: src/view/com/composer/Composer.tsx:445
msgid "Add link card:" msgid "Add link card:"
msgstr "リンクカードを追加:" msgstr "リンクカードを追加:"
@ -345,8 +345,8 @@ msgstr "カメラ"
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "文字、数字、スペース、ハイフン、およびアンダースコアのみが使用可能です。長さは4文字以上32文字以下である必要があります。" msgstr "文字、数字、スペース、ハイフン、およびアンダースコアのみが使用可能です。長さは4文字以上32文字以下である必要があります。"
#: src/view/com/composer/Composer.tsx:285 #: src/view/com/composer/Composer.tsx:289
#: src/view/com/composer/Composer.tsx:288 #: src/view/com/composer/Composer.tsx:292
#: src/view/com/modals/AltImage.tsx:128 #: src/view/com/modals/AltImage.tsx:128
#: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/ChangeEmail.tsx:220
@ -669,6 +669,10 @@ msgstr "開発者サーバー"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "開発者ツール" msgstr "開発者ツール"
#: src/view/com/composer/Composer.tsx:210
msgid "Did you want to say anything?"
msgstr ""
#: src/view/com/composer/Composer.tsx:143 #: src/view/com/composer/Composer.tsx:143
msgid "Discard" msgid "Discard"
msgstr "破棄" msgstr "破棄"
@ -771,7 +775,7 @@ msgstr "メールアドレス:"
#: src/view/screens/PreferencesHomeFeed.tsx:138 #: src/view/screens/PreferencesHomeFeed.tsx:138
msgid "Enable this setting to only see replies between people you follow." msgid "Enable this setting to only see replies between people you follow."
msgstr "この設定を有効にすると、フォローしているユーザー間の返信だけが表示されます。" msgstr "この設定を有効にすると、自分がフォローしているユーザーからの返信だけが表示されます。"
#: src/view/screens/Profile.tsx:426 #: src/view/screens/Profile.tsx:426
msgid "End of feed" msgid "End of feed"
@ -878,11 +882,11 @@ msgstr "何人かのユーザーをフォローして開始します。興味を
#: src/view/com/modals/Threadgate.tsx:98 #: src/view/com/modals/Threadgate.tsx:98
msgid "Followed users" msgid "Followed users"
msgstr "フォローしているユーザー" msgstr "自分がフォローしているユーザー"
#: src/view/screens/PreferencesHomeFeed.tsx:145 #: src/view/screens/PreferencesHomeFeed.tsx:145
msgid "Followed users only" msgid "Followed users only"
msgstr "フォローされたユーザーのみ" msgstr "自分がフォローしているユーザーのみ"
#: src/view/screens/ProfileFollowers.tsx:25 #: src/view/screens/ProfileFollowers.tsx:25
msgid "Followers" msgid "Followers"
@ -1011,7 +1015,7 @@ msgstr "ホーム"
#: src/view/screens/PreferencesHomeFeed.tsx:95 #: src/view/screens/PreferencesHomeFeed.tsx:95
#: src/view/screens/Settings.tsx:481 #: src/view/screens/Settings.tsx:481
msgid "Home Feed Preferences" msgid "Home Feed Preferences"
msgstr "ホームフィード設定" msgstr "ホームフィード設定"
#: src/view/com/auth/login/ForgotPasswordForm.tsx:114 #: src/view/com/auth/login/ForgotPasswordForm.tsx:114
msgid "Hosting provider" msgid "Hosting provider"
@ -1144,7 +1148,7 @@ msgstr "このフィードをいいね"
#: src/view/screens/PostLikedBy.tsx:27 #: src/view/screens/PostLikedBy.tsx:27
#: src/view/screens/ProfileFeedLikedBy.tsx:27 #: src/view/screens/ProfileFeedLikedBy.tsx:27
msgid "Liked by" msgid "Liked by"
msgstr "いいねした" msgstr "いいねしたユーザー"
#: src/view/screens/Profile.tsx:164 #: src/view/screens/Profile.tsx:164
msgid "Likes" msgid "Likes"
@ -1156,7 +1160,7 @@ msgstr "いいね"
#: src/view/com/modals/CreateOrEditList.tsx:186 #: src/view/com/modals/CreateOrEditList.tsx:186
msgid "List Avatar" msgid "List Avatar"
msgstr "リストアバター" msgstr "リストアバター"
#: src/view/com/modals/CreateOrEditList.tsx:199 #: src/view/com/modals/CreateOrEditList.tsx:199
msgid "List Name" msgid "List Name"
@ -1172,15 +1176,15 @@ msgstr "リスト"
#: src/view/com/post-thread/PostThread.tsx:259 #: src/view/com/post-thread/PostThread.tsx:259
#: src/view/com/post-thread/PostThread.tsx:267 #: src/view/com/post-thread/PostThread.tsx:267
msgid "Load more posts" msgid "Load more posts"
msgstr "より多くの投稿をロード" msgstr "投稿をさらにロード"
#: src/view/screens/Notifications.tsx:144 #: src/view/screens/Notifications.tsx:144
msgid "Load new notifications" msgid "Load new notifications"
msgstr "新しい通知をロード" msgstr "最新の通知をロード"
#: src/view/com/feeds/FeedPage.tsx:189 #: src/view/com/feeds/FeedPage.tsx:189
msgid "Load new posts" msgid "Load new posts"
msgstr "投稿をロード" msgstr "最新の投稿をロード"
#: src/view/com/composer/text-input/mobile/Autocomplete.tsx:95 #: src/view/com/composer/text-input/mobile/Autocomplete.tsx:95
msgid "Loading..." msgid "Loading..."
@ -1278,19 +1282,19 @@ msgstr "スレッドをミュート"
#: src/view/screens/Moderation.tsx:109 #: src/view/screens/Moderation.tsx:109
msgid "Muted accounts" msgid "Muted accounts"
msgstr "ミュートされたアカウント" msgstr "ミュート中のアカウント"
#: src/view/screens/ModerationMutedAccounts.tsx:107 #: src/view/screens/ModerationMutedAccounts.tsx:107
msgid "Muted Accounts" msgid "Muted Accounts"
msgstr "ミュートされたアカウント" msgstr "ミュート中のアカウント"
#: src/view/screens/ModerationMutedAccounts.tsx:115 #: src/view/screens/ModerationMutedAccounts.tsx:115
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
msgstr "ミュートをされたアカウントは、フィードと通知からの投稿が削除されます。ミュートの設定は完全に非公開です。" msgstr "ミュート中のアカウントの投稿は、フィードや通知から取り除かれます。ミュートの設定は完全に非公開です。"
#: src/view/screens/ProfileList.tsx:272 #: src/view/screens/ProfileList.tsx:272
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them." msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
msgstr "ミュートは非公開です。ミュートをされたアカウントはあなたと引き続き関わることができますが、そのアカウントの投稿や通知を受信することはできません。" msgstr "ミュートの設定は非公開です。ミュート中のアカウントはあなたと引き続き関わることができますが、そのアカウントの投稿や通知を受信することはできません。"
#: src/view/com/modals/BirthDateSettings.tsx:56 #: src/view/com/modals/BirthDateSettings.tsx:56
msgid "My Birthday" msgid "My Birthday"
@ -1410,7 +1414,7 @@ msgstr "ちょっと!"
msgid "Okay" msgid "Okay"
msgstr "OK" msgstr "OK"
#: src/view/com/composer/Composer.tsx:354 #: src/view/com/composer/Composer.tsx:358
msgid "One or more images is missing alt text." msgid "One or more images is missing alt text."
msgstr "1つもしくは複数の画像にALTテキストがありません。" msgstr "1つもしくは複数の画像にALTテキストがありません。"
@ -1538,7 +1542,11 @@ msgstr ""
#~ msgid "Please tell us why you think this decision was incorrect." #~ msgid "Please tell us why you think this decision was incorrect."
#~ msgstr "この判断が誤っていると考える理由を教えてください。" #~ msgstr "この判断が誤っていると考える理由を教えてください。"
#: src/view/com/composer/Composer.tsx:337 #: src/view/com/composer/Composer.tsx:214
msgid "Please wait for your link card to finish loading"
msgstr ""
#: src/view/com/composer/Composer.tsx:341
#: src/view/com/post-thread/PostThread.tsx:225 #: src/view/com/post-thread/PostThread.tsx:225
#: src/view/screens/PostThread.tsx:80 #: src/view/screens/PostThread.tsx:80
msgid "Post" msgid "Post"
@ -1726,7 +1734,7 @@ msgstr "リポストまたは引用"
#: src/view/screens/PostRepostedBy.tsx:27 #: src/view/screens/PostRepostedBy.tsx:27
msgid "Reposted by" msgid "Reposted by"
msgstr "リポストした" msgstr "リポストしたユーザー"
#: src/view/com/modals/ChangeEmail.tsx:181 #: src/view/com/modals/ChangeEmail.tsx:181
#: src/view/com/modals/ChangeEmail.tsx:183 #: src/view/com/modals/ChangeEmail.tsx:183
@ -1881,15 +1889,15 @@ msgstr "新しいパスワードを設定"
#: src/view/screens/PreferencesHomeFeed.tsx:216 #: src/view/screens/PreferencesHomeFeed.tsx:216
msgid "Set this setting to \"No\" to hide all quote posts from your feed. Reposts will still be visible." msgid "Set this setting to \"No\" to hide all quote posts from your feed. Reposts will still be visible."
msgstr "フィードから全ての引用を非表示にするには、この設定を「いいえ」にします。リポストは引き続き表示されます。" msgstr "フィード内の引用をすべて非表示にするには、この設定を「いいえ」にします。リポストは引き続き表示されます。"
#: src/view/screens/PreferencesHomeFeed.tsx:113 #: src/view/screens/PreferencesHomeFeed.tsx:113
msgid "Set this setting to \"No\" to hide all replies from your feed." msgid "Set this setting to \"No\" to hide all replies from your feed."
msgstr "フィードから全ての返信を非表示にするには、この設定を「いいえ」にします。" msgstr "フィード内の返信をすべて非表示にするには、この設定を「いいえ」にします。"
#: src/view/screens/PreferencesHomeFeed.tsx:182 #: src/view/screens/PreferencesHomeFeed.tsx:182
msgid "Set this setting to \"No\" to hide all reposts from your feed." msgid "Set this setting to \"No\" to hide all reposts from your feed."
msgstr "フィードから全てのリポストを非表示にするには、この設定を「いいえ」にします。" msgstr "フィード内のリポストをすべて非表示にするには、この設定を「いいえ」にします。"
#: src/view/screens/PreferencesThreads.tsx:116 #: src/view/screens/PreferencesThreads.tsx:116
msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature." msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature."
@ -1943,7 +1951,7 @@ msgstr "返信を表示"
#: src/view/screens/PreferencesThreads.tsx:94 #: src/view/screens/PreferencesThreads.tsx:94
msgid "Show replies by people you follow before all other replies." msgid "Show replies by people you follow before all other replies."
msgstr "他のすべての返信の前に、フォローしている人からの返信を表示します。" msgstr "自分がフォローしているユーザーからの返信を、他のすべての返信の前に表示します。"
#: src/view/screens/PreferencesHomeFeed.tsx:179 #: src/view/screens/PreferencesHomeFeed.tsx:179
msgid "Show Reposts" msgid "Show Reposts"
@ -2364,13 +2372,13 @@ msgstr "アルゴリズムによるフィードにはどの言語を使用しま
#: src/view/com/composer/threadgate/ThreadgateBtn.tsx:47 #: src/view/com/composer/threadgate/ThreadgateBtn.tsx:47
#: src/view/com/modals/Threadgate.tsx:66 #: src/view/com/modals/Threadgate.tsx:66
msgid "Who can reply" msgid "Who can reply"
msgstr "返信できる" msgstr "返信できるユーザー"
#: src/view/com/modals/crop-image/CropImage.web.tsx:102 #: src/view/com/modals/crop-image/CropImage.web.tsx:102
msgid "Wide" msgid "Wide"
msgstr "ワイド" msgstr "ワイド"
#: src/view/com/composer/Composer.tsx:409 #: src/view/com/composer/Composer.tsx:413
msgid "Write post" msgid "Write post"
msgstr "投稿を書く" msgstr "投稿を書く"

View File

@ -89,6 +89,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
// update & broadcast // update & broadcast
setNumUnread('') setNumUnread('')
broadcast.postMessage({event: ''}) broadcast.postMessage({event: ''})
if (isNative) {
Notifications.setBadgeCountAsync(0)
}
}, },
async checkUnread({invalidate}: {invalidate?: boolean} = {}) { async checkUnread({invalidate}: {invalidate?: boolean} = {}) {

View File

@ -156,7 +156,7 @@ async function fetchSubjects(
): Promise<Map<string, AppBskyFeedDefs.PostView>> { ): Promise<Map<string, AppBskyFeedDefs.PostView>> {
const uris = new Set<string>() const uris = new Set<string>()
for (const notif of groupedNotifs) { for (const notif of groupedNotifs) {
if (notif.subjectUri) { if (notif.subjectUri && !notif.subjectUri.includes('feed.generator')) {
uris.add(notif.subjectUri) uris.add(notif.subjectUri)
} }
} }
@ -216,6 +216,8 @@ function getSubjectUri(
? notif.record.subject?.uri ? notif.record.subject?.uri
: undefined : undefined
} }
} else if (type === 'feedgen-like') {
return notif.reasonSubject
} }
} }

View File

@ -207,7 +207,11 @@ export const ComposePost = observer(function ComposePost({
setError('') setError('')
if (richtext.text.trim().length === 0 && gallery.isEmpty && !extLink) { if (richtext.text.trim().length === 0 && gallery.isEmpty && !extLink) {
setError('Did you want to say anything?') setError(_(msg`Did you want to say anything?`))
return
}
if (extLink?.isLoading) {
setError(_(msg`Please wait for your link card to finish loading`))
return return
} }
@ -438,7 +442,7 @@ export const ComposePost = observer(function ComposePost({
accessibilityLabel={_(msg`Add link card`)} accessibilityLabel={_(msg`Add link card`)}
accessibilityHint={`Creates a card with a thumbnail. The card links to ${url}`}> accessibilityHint={`Creates a card with a thumbnail. The card links to ${url}`}>
<Text style={pal.text}> <Text style={pal.text}>
<Trans>Add link card:</Trans> <Trans>Add link card:</Trans>{' '}
<Text style={[pal.link, s.ml5]}>{toShortUrl(url)}</Text> <Text style={[pal.link, s.ml5]}>{toShortUrl(url)}</Text>
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>

View File

@ -69,7 +69,7 @@ export function Component({
<ScrollView> <ScrollView>
<Text style={[pal.text, styles.description]}> <Text style={[pal.text, styles.description]}>
Choose "Everybody" or "Nobody" <Trans>Choose "Everybody" or "Nobody"</Trans>
</Text> </Text>
<View style={{flexDirection: 'row', gap: 6, paddingHorizontal: 6}}> <View style={{flexDirection: 'row', gap: 6, paddingHorizontal: 6}}>
<Selectable <Selectable
@ -86,7 +86,7 @@ export function Component({
/> />
</View> </View>
<Text style={[pal.text, styles.description]}> <Text style={[pal.text, styles.description]}>
Or combine these options: <Trans>Or combine these options:</Trans>
</Text> </Text>
<View style={{flexDirection: 'column', gap: 4, paddingHorizontal: 6}}> <View style={{flexDirection: 'column', gap: 4, paddingHorizontal: 6}}>
<Selectable <Selectable

View File

@ -42,6 +42,7 @@ import {TimeElapsed} from '../util/TimeElapsed'
import {isWeb} from 'platform/detection' import {isWeb} from 'platform/detection'
import {Trans, msg} from '@lingui/macro' import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {FeedSourceCard} from '../feeds/FeedSourceCard'
const MAX_AUTHORS = 5 const MAX_AUTHORS = 5
@ -112,7 +113,7 @@ let FeedItem = ({
] ]
}, [item, moderationOpts]) }, [item, moderationOpts])
if (item.subjectUri && !item.subject) { if (item.subjectUri && !item.subject && item.type !== 'feedgen-like') {
// don't render anything if the target post was deleted or unfindable // don't render anything if the target post was deleted or unfindable
return <View /> return <View />
} }
@ -166,7 +167,7 @@ let FeedItem = ({
iconStyle = [s.blue3 as FontAwesomeIconStyle] iconStyle = [s.blue3 as FontAwesomeIconStyle]
} else if (item.type === 'feedgen-like') { } else if (item.type === 'feedgen-like') {
action = `liked your custom feed${ action = `liked your custom feed${
item.subjectUri ? ` '${new AtUri(item.subjectUri).rkey}}'` : '' item.subjectUri ? ` '${new AtUri(item.subjectUri).rkey}'` : ''
}` }`
icon = 'HeartIconSolid' icon = 'HeartIconSolid'
iconStyle = [ iconStyle = [
@ -256,6 +257,13 @@ let FeedItem = ({
{item.type === 'post-like' || item.type === 'repost' ? ( {item.type === 'post-like' || item.type === 'repost' ? (
<AdditionalPostText post={item.subject} /> <AdditionalPostText post={item.subject} />
) : null} ) : null}
{item.type === 'feedgen-like' && item.subjectUri ? (
<FeedSourceCard
feedUri={item.subjectUri}
style={[pal.view, pal.border, styles.feedcard]}
showLikes
/>
) : null}
</View> </View>
</Link> </Link>
) )
@ -496,6 +504,12 @@ const styles = StyleSheet.create({
marginLeft: 2, marginLeft: 2,
opacity: 0.8, opacity: 0.8,
}, },
feedcard: {
borderWidth: 1,
borderRadius: 8,
paddingVertical: 12,
marginTop: 6,
},
addedContainer: { addedContainer: {
paddingTop: 4, paddingTop: 4,

View File

@ -186,9 +186,9 @@ let PostThreadItemLoaded = ({
return makeProfileLink(post.author, 'post', urip.rkey, 'reposted-by') return makeProfileLink(post.author, 'post', urip.rkey, 'reposted-by')
}, [post.uri, post.author]) }, [post.uri, post.author])
const repostsTitle = 'Reposts of this post' const repostsTitle = 'Reposts of this post'
const isSelfLabeledPost = const isModeratedPost =
moderation.decisions.post.cause?.type === 'label' && moderation.decisions.post.cause?.type === 'label' &&
moderation.decisions.post.cause.label.src === currentAccount?.did moderation.decisions.post.cause.label.src !== currentAccount?.did
const translatorUrl = getTranslatorLink( const translatorUrl = getTranslatorLink(
record?.text || '', record?.text || '',
@ -335,7 +335,7 @@ let PostThreadItemLoaded = ({
postUri={post.uri} postUri={post.uri}
record={record} record={record}
showAppealLabelItem={ showAppealLabelItem={
post.author.did === currentAccount?.did && !isSelfLabeledPost post.author.did === currentAccount?.did && isModeratedPost
} }
style={{ style={{
paddingVertical: 6, paddingVertical: 6,
@ -539,6 +539,7 @@ let PostThreadItemLoaded = ({
timestamp={post.indexedAt} timestamp={post.indexedAt}
postHref={postHref} postHref={postHref}
showAvatar={isThreadedChild} showAvatar={isThreadedChild}
avatarModeration={moderation.avatar}
avatarSize={28} avatarSize={28}
displayNameType="md-bold" displayNameType="md-bold"
displayNameStyle={isThreadedChild && s.ml2} displayNameStyle={isThreadedChild && s.ml2}

View File

@ -34,6 +34,7 @@ import {countLines} from 'lib/strings/helpers'
import {useComposerControls} from '#/state/shell/composer' import {useComposerControls} from '#/state/shell/composer'
import {Shadow, usePostShadow, POST_TOMBSTONE} from '#/state/cache/post-shadow' import {Shadow, usePostShadow, POST_TOMBSTONE} from '#/state/cache/post-shadow'
import {FeedNameText} from '../util/FeedInfoText' import {FeedNameText} from '../util/FeedInfoText'
import {useSession} from '#/state/session'
export function FeedItem({ export function FeedItem({
post, post,
@ -102,10 +103,14 @@ let FeedItemInner = ({
}): React.ReactNode => { }): React.ReactNode => {
const {openComposer} = useComposerControls() const {openComposer} = useComposerControls()
const pal = usePalette('default') const pal = usePalette('default')
const {currentAccount} = useSession()
const href = useMemo(() => { const href = useMemo(() => {
const urip = new AtUri(post.uri) const urip = new AtUri(post.uri)
return makeProfileLink(post.author, 'post', urip.rkey) return makeProfileLink(post.author, 'post', urip.rkey)
}, [post.uri, post.author]) }, [post.uri, post.author])
const isModeratedPost =
moderation.decisions.post.cause?.type === 'label' &&
moderation.decisions.post.cause.label.src !== currentAccount?.did
const replyAuthorDid = useMemo(() => { const replyAuthorDid = useMemo(() => {
if (!record?.reply) { if (!record?.reply) {
@ -284,7 +289,14 @@ let FeedItemInner = ({
postEmbed={post.embed} postEmbed={post.embed}
postAuthor={post.author} postAuthor={post.author}
/> />
<PostCtrls post={post} record={record} onPressReply={onPressReply} /> <PostCtrls
post={post}
record={record}
onPressReply={onPressReply}
showAppealLabelItem={
post.author.did === currentAccount?.did && isModeratedPost
}
/>
</View> </View>
</View> </View>
</Link> </Link>

View File

@ -11,6 +11,7 @@ import {sanitizeHandle} from 'lib/strings/handles'
import {isAndroid} from 'platform/detection' import {isAndroid} from 'platform/detection'
import {TimeElapsed} from './TimeElapsed' import {TimeElapsed} from './TimeElapsed'
import {makeProfileLink} from 'lib/routes/links' import {makeProfileLink} from 'lib/routes/links'
import {ModerationUI} from '@atproto/api'
interface PostMetaOpts { interface PostMetaOpts {
author: { author: {
@ -23,6 +24,7 @@ interface PostMetaOpts {
postHref: string postHref: string
timestamp: string timestamp: string
showAvatar?: boolean showAvatar?: boolean
avatarModeration?: ModerationUI
avatarSize?: number avatarSize?: number
displayNameType?: TypographyVariant displayNameType?: TypographyVariant
displayNameStyle?: StyleProp<TextStyle> displayNameStyle?: StyleProp<TextStyle>
@ -41,7 +43,7 @@ let PostMeta = (opts: PostMetaOpts): React.ReactNode => {
<UserAvatar <UserAvatar
avatar={opts.author.avatar} avatar={opts.author.avatar}
size={opts.avatarSize || 16} size={opts.avatarSize || 16}
// TODO moderation moderation={opts.avatarModeration}
/> />
</View> </View>
)} )}

View File

@ -31,12 +31,14 @@ let PostCtrls = ({
big, big,
post, post,
record, record,
showAppealLabelItem,
style, style,
onPressReply, onPressReply,
}: { }: {
big?: boolean big?: boolean
post: Shadow<AppBskyFeedDefs.PostView> post: Shadow<AppBskyFeedDefs.PostView>
record: AppBskyFeedPost.Record record: AppBskyFeedPost.Record
showAppealLabelItem?: boolean
style?: StyleProp<ViewStyle> style?: StyleProp<ViewStyle>
onPressReply: () => void onPressReply: () => void
}): React.ReactNode => { }): React.ReactNode => {
@ -207,6 +209,7 @@ let PostCtrls = ({
postCid={post.cid} postCid={post.cid}
postUri={post.uri} postUri={post.uri}
record={record} record={record}
showAppealLabelItem={showAppealLabelItem}
style={styles.ctrlPad} style={styles.ctrlPad}
/> />
)} )}

View File

@ -1,6 +1,6 @@
import React from 'react' import React from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {useFocusEffect} from '@react-navigation/native' import {useFocusEffect, useIsFocused} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
import { import {
NativeStackScreenProps, NativeStackScreenProps,
@ -46,6 +46,7 @@ export function NotificationsScreen({}: Props) {
const unreadNotifs = useUnreadNotifications() const unreadNotifs = useUnreadNotifications()
const unreadApi = useUnreadNotificationsApi() const unreadApi = useUnreadNotificationsApi()
const hasNew = !!unreadNotifs const hasNew = !!unreadNotifs
const isScreenFocused = useIsFocused()
// event handlers // event handlers
// = // =
@ -83,8 +84,11 @@ export function NotificationsScreen({}: Props) {
}, [screen, setMinimalShellMode]), }, [screen, setMinimalShellMode]),
) )
React.useEffect(() => { React.useEffect(() => {
if (!isScreenFocused) {
return
}
return listenSoftReset(onPressLoadLatest) return listenSoftReset(onPressLoadLatest)
}, [onPressLoadLatest]) }, [onPressLoadLatest, isScreenFocused])
const ListHeaderComponent = React.useCallback(() => { const ListHeaderComponent = React.useCallback(() => {
if (isDesktop) { if (isDesktop) {

View File

@ -117,7 +117,7 @@ export function PreferencesHomeFeed({navigation}: Props) {
<ToggleButton <ToggleButton
testID="toggleRepliesBtn" testID="toggleRepliesBtn"
type="default-light" type="default-light"
label={showReplies ? 'Yes' : 'No'} label={showReplies ? _(msg`Yes`) : _(msg`No`)}
isSelected={showReplies} isSelected={showReplies}
onPress={() => onPress={() =>
setFeedViewPref({ setFeedViewPref({

View File

@ -57,6 +57,7 @@ import {useLikeMutation, useUnlikeMutation} from '#/state/queries/like'
import {useComposerControls} from '#/state/shell/composer' import {useComposerControls} from '#/state/shell/composer'
import {truncateAndInvalidate} from '#/state/queries/util' import {truncateAndInvalidate} from '#/state/queries/util'
import {isNative} from '#/platform/detection' import {isNative} from '#/platform/detection'
import {listenSoftReset} from '#/state/events'
const SECTION_TITLES = ['Posts', 'About'] const SECTION_TITLES = ['Posts', 'About']
@ -446,6 +447,7 @@ const FeedSection = React.forwardRef<SectionRef, FeedSectionProps>(
const [hasNew, setHasNew] = React.useState(false) const [hasNew, setHasNew] = React.useState(false)
const [isScrolledDown, setIsScrolledDown] = React.useState(false) const [isScrolledDown, setIsScrolledDown] = React.useState(false)
const queryClient = useQueryClient() const queryClient = useQueryClient()
const isScreenFocused = useIsFocused()
const onScrollToTop = useCallback(() => { const onScrollToTop = useCallback(() => {
scrollElRef.current?.scrollToOffset({ scrollElRef.current?.scrollToOffset({
@ -460,6 +462,13 @@ const FeedSection = React.forwardRef<SectionRef, FeedSectionProps>(
scrollToTop: onScrollToTop, scrollToTop: onScrollToTop,
})) }))
React.useEffect(() => {
if (!isScreenFocused) {
return
}
return listenSoftReset(onScrollToTop)
}, [onScrollToTop, isScreenFocused])
const renderPostsEmpty = useCallback(() => { const renderPostsEmpty = useCallback(() => {
return <EmptyState icon="feed" message="This feed is empty!" /> return <EmptyState icon="feed" message="This feed is empty!" />
}, []) }, [])

View File

@ -57,6 +57,7 @@ import {
} from '#/state/queries/preferences' } from '#/state/queries/preferences'
import {logger} from '#/logger' import {logger} from '#/logger'
import {useAnalytics} from '#/lib/analytics/analytics' import {useAnalytics} from '#/lib/analytics/analytics'
import {listenSoftReset} from '#/state/events'
const SECTION_TITLES_CURATE = ['Posts', 'About'] const SECTION_TITLES_CURATE = ['Posts', 'About']
const SECTION_TITLES_MOD = ['About'] const SECTION_TITLES_MOD = ['About']
@ -601,6 +602,7 @@ const FeedSection = React.forwardRef<SectionRef, FeedSectionProps>(
const queryClient = useQueryClient() const queryClient = useQueryClient()
const [hasNew, setHasNew] = React.useState(false) const [hasNew, setHasNew] = React.useState(false)
const [isScrolledDown, setIsScrolledDown] = React.useState(false) const [isScrolledDown, setIsScrolledDown] = React.useState(false)
const isScreenFocused = useIsFocused()
const onScrollToTop = useCallback(() => { const onScrollToTop = useCallback(() => {
scrollElRef.current?.scrollToOffset({ scrollElRef.current?.scrollToOffset({
@ -614,6 +616,13 @@ const FeedSection = React.forwardRef<SectionRef, FeedSectionProps>(
scrollToTop: onScrollToTop, scrollToTop: onScrollToTop,
})) }))
React.useEffect(() => {
if (!isScreenFocused) {
return
}
return listenSoftReset(onScrollToTop)
}, [onScrollToTop, isScreenFocused])
const renderPostsEmpty = useCallback(() => { const renderPostsEmpty = useCallback(() => {
return <EmptyState icon="feed" message="This feed is empty!" /> return <EmptyState icon="feed" message="This feed is empty!" />
}, []) }, [])

View File

@ -212,12 +212,17 @@ function SearchScreenPostResults({query}: {query: string}) {
const items = React.useMemo(() => { const items = React.useMemo(() => {
let temp: SearchResultSlice[] = [] let temp: SearchResultSlice[] = []
const seenUris = new Set()
for (const post of posts) { for (const post of posts) {
if (seenUris.has(post.uri)) {
continue
}
temp.push({ temp.push({
type: 'post', type: 'post',
key: post.uri, key: post.uri,
post, post,
}) })
seenUris.add(post.uri)
} }
if (isFetchingNextPage) { if (isFetchingNextPage) {