diff --git a/src/components/Divider.tsx b/src/components/Divider.tsx index e4891aacb..ec7a7356a 100644 --- a/src/components/Divider.tsx +++ b/src/components/Divider.tsx @@ -1,18 +1,11 @@ import {View} from 'react-native' -import {atoms as a, flatten, useTheme, ViewStyleProp} from '#/alf' +import {atoms as a, useTheme, type ViewStyleProp} from '#/alf' export function Divider({style}: ViewStyleProp) { const t = useTheme() return ( - + ) } diff --git a/src/components/FeedCard.tsx b/src/components/FeedCard.tsx index f94692e5b..33905dacd 100644 --- a/src/components/FeedCard.tsx +++ b/src/components/FeedCard.tsx @@ -214,7 +214,7 @@ export function DescriptionPlaceholder() { export function Likes({count}: {count: number}) { const t = useTheme() return ( - + Liked by diff --git a/src/components/ListCard.tsx b/src/components/ListCard.tsx index 30156ee0d..e34830ea9 100644 --- a/src/components/ListCard.tsx +++ b/src/components/ListCard.tsx @@ -1,10 +1,10 @@ import React from 'react' import {View} from 'react-native' import { - AppBskyGraphDefs, + type AppBskyGraphDefs, AtUri, moderateUserList, - ModerationUI, + type ModerationUI, } from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -22,10 +22,10 @@ import { Outer, SaveButton, } from '#/components/FeedCard' -import {Link as InternalLink, LinkProps} from '#/components/Link' +import {Link as InternalLink, type LinkProps} from '#/components/Link' import * as Hider from '#/components/moderation/Hider' import {Text} from '#/components/Typography' -import * as bsky from '#/types/bsky' +import type * as bsky from '#/types/bsky' /* * This component is based on `FeedCard` and is tightly coupled with that @@ -50,7 +50,9 @@ type Props = { showPinButton?: boolean } -export function Default(props: Props) { +export function Default( + props: Props & Omit, +) { const {view, showPinButton} = props const moderationOpts = useModerationOpts() const moderation = moderationOpts diff --git a/src/components/Post/Embed/FeedEmbed.tsx b/src/components/Post/Embed/FeedEmbed.tsx index fad4cd4d8..47d59e346 100644 --- a/src/components/Post/Embed/FeedEmbed.tsx +++ b/src/components/Post/Embed/FeedEmbed.tsx @@ -1,10 +1,9 @@ -import React from 'react' -import {StyleSheet} from 'react-native' +import {useMemo} from 'react' import {moderateFeedGenerator} from '@atproto/api' -import {usePalette} from '#/lib/hooks/usePalette' import {useModerationOpts} from '#/state/preferences/moderation-opts' -import {FeedSourceCard} from '#/view/com/feeds/FeedSourceCard' +import {atoms as a, useTheme} from '#/alf' +import * as FeedCard from '#/components/FeedCard' import {ContentHider} from '#/components/moderation/ContentHider' import {type EmbedType} from '#/types/bsky/post' import {type CommonProps} from './types' @@ -14,13 +13,22 @@ export function FeedEmbed({ }: CommonProps & { embed: EmbedType<'feed'> }) { - const pal = usePalette('default') + const t = useTheme() return ( - + + + + + + + + + ) } @@ -30,23 +38,16 @@ export function ModeratedFeedEmbed({ embed: EmbedType<'feed'> }) { const moderationOpts = useModerationOpts() - const moderation = React.useMemo(() => { + const moderation = useMemo(() => { return moderationOpts ? moderateFeedGenerator(embed.view, moderationOpts) : undefined }, [embed.view, moderationOpts]) return ( - + ) } - -const styles = StyleSheet.create({ - customFeedOuter: { - borderWidth: StyleSheet.hairlineWidth, - borderRadius: 8, - paddingHorizontal: 12, - paddingVertical: 12, - }, -}) diff --git a/src/components/Post/Embed/ListEmbed.tsx b/src/components/Post/Embed/ListEmbed.tsx index 82685d271..c1450bdcf 100644 --- a/src/components/Post/Embed/ListEmbed.tsx +++ b/src/components/Post/Embed/ListEmbed.tsx @@ -1,5 +1,4 @@ -import React from 'react' -import {View} from 'react-native' +import {useMemo} from 'react' import {moderateUserList} from '@atproto/api' import {useModerationOpts} from '#/state/preferences/moderation-opts' @@ -16,10 +15,10 @@ export function ListEmbed({ }) { const t = useTheme() return ( - - - + ) } @@ -29,13 +28,15 @@ export function ModeratedListEmbed({ embed: EmbedType<'list'> }) { const moderationOpts = useModerationOpts() - const moderation = React.useMemo(() => { + const moderation = useMemo(() => { return moderationOpts ? moderateUserList(embed.view, moderationOpts) : undefined }, [embed.view, moderationOpts]) return ( - + ) diff --git a/src/components/Post/Embed/index.tsx b/src/components/Post/Embed/index.tsx index ace85dc98..9c5444b27 100644 --- a/src/components/Post/Embed/index.tsx +++ b/src/components/Post/Embed/index.tsx @@ -268,64 +268,60 @@ export function QuoteEmbed({ const [hover, setHover] = React.useState(false) return ( { - setHover(true) - }} - onPointerLeave={() => { - setHover(false) - }}> + style={[a.mt_sm]} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)}> - - - - - - {moderation ? ( - - ) : null} - {richText ? ( - - ) : null} - {quote.embed && ( - - )} - + {({active}) => ( + <> + {!active && } + + + + + {moderation ? ( + + ) : null} + {richText ? ( + + ) : null} + {quote.embed && ( + + )} + + + )} ) diff --git a/src/components/moderation/ContentHider.tsx b/src/components/moderation/ContentHider.tsx index 9e94a413c..549a1b9f0 100644 --- a/src/components/moderation/ContentHider.tsx +++ b/src/components/moderation/ContentHider.tsx @@ -23,20 +23,23 @@ export function ContentHider({ modui, ignoreMute, style, + activeStyle, childContainerStyle, children, -}: React.PropsWithChildren<{ +}: { testID?: string modui: ModerationUI | undefined ignoreMute?: boolean style?: StyleProp + activeStyle?: StyleProp childContainerStyle?: StyleProp -}>) { + children?: React.ReactNode | ((props: {active: boolean}) => React.ReactNode) +}) { const blur = modui?.blurs[0] if (!blur || (ignoreMute && isJustAMute(modui))) { return ( - {children} + {typeof children === 'function' ? children({active: false}) : children} ) } @@ -44,9 +47,9 @@ export function ContentHider({ - {children} + {typeof children === 'function' ? children({active: true}) : children} ) } diff --git a/src/view/com/feeds/FeedSourceCard.tsx b/src/view/com/feeds/FeedSourceCard.tsx index 3a658755a..18e2807a8 100644 --- a/src/view/com/feeds/FeedSourceCard.tsx +++ b/src/view/com/feeds/FeedSourceCard.tsx @@ -1,50 +1,33 @@ -import React from 'react' +import {type StyleProp, View, type ViewStyle} from 'react-native' import { - Linking, - Pressable, - StyleProp, - StyleSheet, - View, - ViewStyle, -} from 'react-native' -import {AtUri} from '@atproto/api' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' + type $Typed, + AppBskyFeedDefs, + type AppBskyGraphDefs, + AtUri, +} from '@atproto/api' import {msg, Plural, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {useNavigationDeduped} from '#/lib/hooks/useNavigationDeduped' -import {usePalette} from '#/lib/hooks/usePalette' import {sanitizeHandle} from '#/lib/strings/handles' -import {s} from '#/lib/styles' -import {logger} from '#/logger' -import {FeedSourceInfo, useFeedSourceInfoQuery} from '#/state/queries/feed' import { - useAddSavedFeedsMutation, - usePreferencesQuery, - UsePreferencesQueryResponse, - useRemoveFeedMutation, -} from '#/state/queries/preferences' + type FeedSourceInfo, + hydrateFeedGenerator, + hydrateList, + useFeedSourceInfoQuery, +} from '#/state/queries/feed' import {FeedLoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder' -import * as Toast from '#/view/com/util/Toast' -import {useTheme} from '#/alf' -import {atoms as a} from '#/alf' -import {shouldClickOpenNewTab} from '#/components/Link' -import * as Prompt from '#/components/Prompt' +import {UserAvatar} from '#/view/com/util/UserAvatar' +import {atoms as a, useTheme} from '#/alf' +import {Link} from '#/components/Link' import {RichText} from '#/components/RichText' -import {Text} from '../util/text/Text' -import {UserAvatar} from '../util/UserAvatar' +import {Text} from '#/components/Typography' +import {MissingFeed} from './MissingFeed' -export function FeedSourceCard({ - feedUri, - style, - showSaveBtn = false, - showDescription = false, - showLikes = false, - pinOnSave = false, - showMinimalPlaceholder, - hideTopBorder, -}: { +type FeedSourceCardProps = { feedUri: string + feedData?: + | $Typed + | $Typed style?: StyleProp showSaveBtn?: boolean showDescription?: boolean @@ -52,22 +35,41 @@ export function FeedSourceCard({ pinOnSave?: boolean showMinimalPlaceholder?: boolean hideTopBorder?: boolean -}) { - const {data: preferences} = usePreferencesQuery() - const {data: feed} = useFeedSourceInfoQuery({uri: feedUri}) + link?: boolean +} + +export function FeedSourceCard({ + feedUri, + feedData, + ...props +}: FeedSourceCardProps) { + if (feedData) { + let feed: FeedSourceInfo + if (AppBskyFeedDefs.isGeneratorView(feedData)) { + feed = hydrateFeedGenerator(feedData) + } else { + feed = hydrateList(feedData) + } + return + } else { + return + } +} + +export function FeedSourceCardWithoutData({ + feedUri, + ...props +}: Omit) { + const {data: feed, error} = useFeedSourceInfoQuery({ + uri: feedUri, + }) return ( ) } @@ -75,80 +77,26 @@ export function FeedSourceCard({ export function FeedSourceCardLoaded({ feedUri, feed, - preferences, style, - showSaveBtn = false, showDescription = false, showLikes = false, - pinOnSave = false, showMinimalPlaceholder, hideTopBorder, + link = true, + error, }: { feedUri: string feed?: FeedSourceInfo - preferences?: UsePreferencesQueryResponse style?: StyleProp - showSaveBtn?: boolean showDescription?: boolean showLikes?: boolean - pinOnSave?: boolean showMinimalPlaceholder?: boolean hideTopBorder?: boolean + link?: boolean + error?: unknown }) { const t = useTheme() - const pal = usePalette('default') const {_} = useLingui() - const removePromptControl = Prompt.usePromptControl() - const navigation = useNavigationDeduped() - - const {isPending: isAddSavedFeedPending, mutateAsync: addSavedFeeds} = - useAddSavedFeedsMutation() - const {isPending: isRemovePending, mutateAsync: removeFeed} = - useRemoveFeedMutation() - - const savedFeedConfig = preferences?.savedFeeds?.find( - f => f.value === feedUri, - ) - const isSaved = Boolean(savedFeedConfig) - - const onSave = React.useCallback(async () => { - if (!feed || isSaved) return - - try { - await addSavedFeeds([ - { - type: 'feed', - value: feed.uri, - pinned: pinOnSave, - }, - ]) - Toast.show(_(msg`Added to my feeds`)) - } catch (e) { - Toast.show(_(msg`There was an issue contacting your server`), 'xmark') - logger.error('Failed to save feed', {message: e}) - } - }, [_, feed, pinOnSave, addSavedFeeds, isSaved]) - - const onUnsave = React.useCallback(async () => { - if (!savedFeedConfig) return - - try { - await removeFeed(savedFeedConfig) - // await item.unsave() - Toast.show(_(msg`Removed from my feeds`)) - } catch (e) { - Toast.show(_(msg`There was an issue contacting your server`), 'xmark') - logger.error('Failed to unsave feed', {message: e}) - } - }, [_, removeFeed, savedFeedConfig]) - - const onToggleSaved = React.useCallback(async () => { - if (isSaved) { - removePromptControl.open() - } else { - await onSave() - } - }, [isSaved, removePromptControl, onSave]) /* * LOAD STATE @@ -156,200 +104,117 @@ export function FeedSourceCardLoaded({ * This state also captures the scenario where a feed can't load for whatever * reason. */ - if (!feed || !preferences) - return ( - - {showMinimalPlaceholder ? ( - - ) : ( - - )} - - {showSaveBtn && ( - - - - )} - - ) + if (!feed) { + if (error) { + return ( + + ) + } - return ( - <> - { - const shouldOpenInNewTab = shouldClickOpenNewTab(e) - if (feed.type === 'feed') { - if (shouldOpenInNewTab) { - Linking.openURL( - `/profile/${feed.creatorDid}/feed/${new AtUri(feed.uri).rkey}`, - ) - } else { - navigation.push('ProfileFeed', { - name: feed.creatorDid, - rkey: new AtUri(feed.uri).rkey, - }) - } - } else if (feed.type === 'list') { - if (shouldOpenInNewTab) { - Linking.openURL( - `/profile/${feed.creatorDid}/lists/${new AtUri(feed.uri).rkey}`, - ) - } else { - navigation.push('ProfileList', { - name: feed.creatorDid, - rkey: new AtUri(feed.uri).rkey, - }) - } - } - }} - key={feed.uri}> - - - - - - - {feed.displayName} - - - {feed.type === 'feed' ? ( - Feed by {sanitizeHandle(feed.creatorHandle, '@')} - ) : ( - List by {sanitizeHandle(feed.creatorHandle, '@')} - )} - - + showTopBorder={false} + showLowerPlaceholder={!showMinimalPlaceholder} + /> + ) + } - {showSaveBtn && ( - - - {isSaved ? ( - - ) : ( - - )} - - - )} + const inner = ( + <> + + + - - {showDescription && feed.description ? ( - - ) : null} - - {showLikes && feed.type === 'feed' ? ( - - - Liked by{' '} - - + + + {feed.displayName} - ) : null} - - - + + {feed.type === 'feed' ? ( + Feed by {sanitizeHandle(feed.creatorHandle, '@')} + ) : ( + List by {sanitizeHandle(feed.creatorHandle, '@')} + )} + + + + {showDescription && feed.description ? ( + + ) : null} + {showLikes && feed.type === 'feed' ? ( + + + Liked by{' '} + + + + ) : null} ) -} -const styles = StyleSheet.create({ - container: { - paddingHorizontal: 18, - paddingVertical: 20, - flexDirection: 'column', - flex: 1, - gap: 14, - }, - border: { - borderTopWidth: StyleSheet.hairlineWidth, - }, - headerContainer: { - flexDirection: 'row', - }, - headerTextContainer: { - flexDirection: 'column', - columnGap: 4, - flex: 1, - }, - description: { - flex: 1, - flexWrap: 'wrap', - }, - btn: { - paddingVertical: 6, - }, -}) + if (link) { + return ( + + {inner} + + ) + } else { + return ( + + {inner} + + ) + } +} diff --git a/src/view/com/feeds/MissingFeed.tsx b/src/view/com/feeds/MissingFeed.tsx new file mode 100644 index 000000000..3d281a731 --- /dev/null +++ b/src/view/com/feeds/MissingFeed.tsx @@ -0,0 +1,222 @@ +import {type StyleProp, View, type ViewStyle} from 'react-native' +import {AtUri} from '@atproto/api' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {cleanError} from '#/lib/strings/errors' +import {isNative, isWeb} from '#/platform/detection' +import {useModerationOpts} from '#/state/preferences/moderation-opts' +import {getFeedTypeFromUri} from '#/state/queries/feed' +import {useProfileQuery} from '#/state/queries/profile' +import {atoms as a, useTheme, web} from '#/alf' +import {Button, ButtonText} from '#/components/Button' +import * as Dialog from '#/components/Dialog' +import {Divider} from '#/components/Divider' +import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' +import * as ProfileCard from '#/components/ProfileCard' +import {Text} from '#/components/Typography' + +export function MissingFeed({ + style, + hideTopBorder, + uri, + error, +}: { + style?: StyleProp + hideTopBorder?: boolean + uri: string + error?: unknown +}) { + const t = useTheme() + const {_} = useLingui() + const control = Dialog.useDialogControl() + + const type = getFeedTypeFromUri(uri) + + return ( + <> + + + + + + + + ) +} + +function DialogInner({ + uri, + type, + error, +}: { + uri: string + type: 'feed' | 'list' + error: unknown +}) { + const control = Dialog.useDialogContext() + const t = useTheme() + const {_} = useLingui() + const atUri = new AtUri(uri) + const {data: profile, isError: isProfileError} = useProfileQuery({ + did: atUri.host, + }) + const moderationOpts = useModerationOpts() + + return ( + + + + {type === 'feed' ? ( + Could not connect to feed service + ) : ( + Deleted list + )} + + + {type === 'feed' ? ( + + We could not connect to the service that provides this custom + feed. It may be temporarily unavailable and experiencing issues, + or permanently unavailable. + + ) : ( + We could not find this list. It was probably deleted. + )} + + + + {type === 'feed' ? ( + Feed creator + ) : ( + List creator + )} + + {profile && moderationOpts && ( + + control.close()}> + + + + + + + )} + {isProfileError && ( + + Could not find profile + + )} + {type === 'feed' && ( + <> + + Feed identifier + + + {atUri.rkey} + + + )} + {error instanceof Error && ( + <> + + Error message + + + {cleanError(error.message)} + + + )} + + {isNative && ( + + )} + + + ) +} diff --git a/src/view/com/notifications/NotificationFeedItem.tsx b/src/view/com/notifications/NotificationFeedItem.tsx index 89e2d20e7..4de21e598 100644 --- a/src/view/com/notifications/NotificationFeedItem.tsx +++ b/src/view/com/notifications/NotificationFeedItem.tsx @@ -671,10 +671,12 @@ let NotificationFeedItem = ({ {item.type === 'feedgen-like' && item.subjectUri ? ( @@ -252,12 +251,7 @@ export function FeedLoadingPlaceholder({ {showLowerPlaceholder && ( - - + )} @@ -352,8 +346,7 @@ const styles = StyleSheet.create({ }, avatar: { borderRadius: 999, - marginRight: 10, - marginLeft: 8, + marginRight: 12, }, notification: { flexDirection: 'row', diff --git a/src/view/screens/SavedFeeds.tsx b/src/view/screens/SavedFeeds.tsx index 9ae3dbd8d..b244c7558 100644 --- a/src/view/screens/SavedFeeds.tsx +++ b/src/view/screens/SavedFeeds.tsx @@ -36,6 +36,7 @@ import {FilterTimeline_Stroke2_Corner0_Rounded as FilterTimeline} from '#/compon import {FloppyDisk_Stroke2_Corner0_Rounded as SaveIcon} from '#/components/icons/FloppyDisk' import * as Layout from '#/components/Layout' import {Loader} from '#/components/Loader' +import {Text as NewText} from '#/components/Typography' type Props = NativeStackScreenProps export function SavedFeeds({}: Props) { @@ -296,7 +297,7 @@ function ListItem({ @@ -391,26 +392,17 @@ function ListItem({ function FollowingFeedCard() { const t = useTheme() return ( - + - - + + Following - + ) -- 2.51.2 From 22bda086d0f2e6e8656d7eb79dea7b551e587736 Mon Sep 17 00:00:00 2001 From: pfrazee <1270099+pfrazee@users.noreply.github.com> Date: Thu, 10 Jul 2025 02:44:40 +0000 Subject: [PATCH 2/2] Nightly source-language update --- src/locale/locales/en/messages.po | 170 +++++++++++++++++++----------- 1 file changed, 109 insertions(+), 61 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index d84849097..fb7a09283 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -162,6 +162,14 @@ msgstr "" msgid "{0} reacted {1} to {2}" msgstr "" +#: src/view/com/feeds/FeedSourceCard.tsx:187 +msgid "{0}, a feed by {1}, liked by {2}" +msgstr "" + +#: src/view/com/feeds/FeedSourceCard.tsx:188 +msgid "{0}, a list by {1}" +msgstr "" + #: src/view/com/util/UserAvatar.tsx:570 #: src/view/com/util/UserAvatar.tsx:588 msgid "{0}'s avatar" @@ -733,10 +741,6 @@ msgstr "" msgid "Add to lists" msgstr "" -#: src/view/com/feeds/FeedSourceCard.tsx:269 -msgid "Add to my feeds" -msgstr "" - #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:156 msgid "Add user to list" msgstr "" @@ -746,10 +750,6 @@ msgstr "" msgid "Added to list" msgstr "" -#: src/view/com/feeds/FeedSourceCard.tsx:125 -msgid "Added to my feeds" -msgstr "" - #: src/components/moderation/ReportDialog/index.tsx:418 msgid "Additional details (limit 300 characters)" msgstr "" @@ -758,7 +758,7 @@ msgstr "" msgid "Adult" msgstr "" -#: src/components/moderation/ContentHider.tsx:113 +#: src/components/moderation/ContentHider.tsx:116 #: src/lib/moderation/useGlobalLabelStrings.ts:34 #: src/lib/moderation/useModerationCauseDescription.ts:148 #: src/view/com/composer/labels/LabelsBtn.tsx:127 @@ -1111,10 +1111,6 @@ msgstr "" msgid "Are you sure you want to leave this conversation? Your messages will be deleted for you, but not for the other participant." msgstr "" -#: src/view/com/feeds/FeedSourceCard.tsx:319 -msgid "Are you sure you want to remove {0} from your feeds?" -msgstr "" - #: src/components/FeedCard.tsx:340 msgid "Are you sure you want to remove this from your feeds?" msgstr "" @@ -1718,6 +1714,10 @@ msgstr "" msgid "Clear search query" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:87 +msgid "Click for information" +msgstr "" + #: src/view/screens/Support.tsx:41 msgid "click here" msgstr "" @@ -1775,6 +1775,8 @@ msgstr "" #: src/components/verification/VerifierDialog.tsx:144 #: src/components/WhoCanReply.tsx:200 #: src/components/WhoCanReply.tsx:207 +#: src/view/com/feeds/MissingFeed.tsx:208 +#: src/view/com/feeds/MissingFeed.tsx:215 #: src/view/com/modals/ChangePassword.tsx:279 #: src/view/com/modals/ChangePassword.tsx:282 msgid "Close" @@ -1851,7 +1853,7 @@ msgstr "" msgid "Collapse list of users" msgstr "" -#: src/view/com/notifications/NotificationFeedItem.tsx:799 +#: src/view/com/notifications/NotificationFeedItem.tsx:801 msgid "Collapses list of users for a given notification" msgstr "" @@ -2157,6 +2159,18 @@ msgstr "" msgid "Copyright Policy" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:41 +msgid "Could not connect to custom feed" +msgstr "" + +#: src/view/com/feeds/MissingFeed.tsx:133 +msgid "Could not connect to feed service" +msgstr "" + +#: src/view/com/feeds/MissingFeed.tsx:182 +msgid "Could not find profile" +msgstr "" + #: src/components/dms/LeaveConvoPrompt.tsx:35 #: src/components/dms/ReportDialog.tsx:310 msgid "Could not leave chat" @@ -2423,6 +2437,13 @@ msgstr "" msgid "Deleted Account" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:42 +#: src/view/com/feeds/MissingFeed.tsx:75 +#: src/view/com/feeds/MissingFeed.tsx:127 +#: src/view/com/feeds/MissingFeed.tsx:135 +msgid "Deleted list" +msgstr "" + #: src/view/com/post-thread/PostThread.tsx:474 msgid "Deleted post." msgstr "" @@ -3014,6 +3035,10 @@ msgstr "" msgid "Error loading preference" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:198 +msgid "Error message" +msgstr "" + #: src/screens/Settings/components/ExportCarDialog.tsx:47 msgid "Error occurred while saving file" msgstr "" @@ -3367,10 +3392,18 @@ msgid "Feed" msgstr "" #: src/components/FeedCard.tsx:139 -#: src/view/com/feeds/FeedSourceCard.tsx:253 +#: src/view/com/feeds/FeedSourceCard.tsx:150 msgid "Feed by {0}" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:152 +msgid "Feed creator" +msgstr "" + +#: src/view/com/feeds/MissingFeed.tsx:188 +msgid "Feed identifier" +msgstr "" + #: src/screens/Profile/components/ProfileFeedHeader.tsx:354 msgid "Feed menu" msgstr "" @@ -3379,6 +3412,10 @@ msgstr "" msgid "Feed toggle" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:73 +msgid "Feed unavailable" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:102 #: src/view/shell/desktop/RightNav.tsx:103 #: src/view/shell/Drawer.tsx:357 @@ -3396,18 +3433,18 @@ msgstr "" #: src/screens/StarterPack/StarterPackScreen.tsx:190 #: src/view/screens/Feeds.tsx:511 #: src/view/screens/Profile.tsx:230 -#: src/view/screens/SavedFeeds.tsx:103 +#: src/view/screens/SavedFeeds.tsx:104 #: src/view/shell/desktop/LeftNav.tsx:673 #: src/view/shell/Drawer.tsx:519 msgid "Feeds" msgstr "" -#: src/view/screens/SavedFeeds.tsx:205 +#: src/view/screens/SavedFeeds.tsx:206 msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information." msgstr "" #: src/components/FeedCard.tsx:282 -#: src/view/screens/SavedFeeds.tsx:85 +#: src/view/screens/SavedFeeds.tsx:86 msgctxt "toast" msgid "Feeds updated!" msgstr "" @@ -3577,7 +3614,7 @@ msgstr "" #: src/screens/VideoFeed/index.tsx:848 #: src/view/com/post-thread/PostThreadFollowBtn.tsx:134 #: src/view/screens/Feeds.tsx:602 -#: src/view/screens/SavedFeeds.tsx:429 +#: src/view/screens/SavedFeeds.tsx:420 msgid "Following" msgstr "" @@ -3924,13 +3961,13 @@ msgstr "" msgid "Hidden by your moderation settings." msgstr "" -#: src/components/ListCard.tsx:130 +#: src/components/ListCard.tsx:132 msgid "Hidden list" msgstr "" #: src/components/interstitials/Trending.tsx:131 #: src/components/interstitials/TrendingVideos.tsx:140 -#: src/components/moderation/ContentHider.tsx:200 +#: src/components/moderation/ContentHider.tsx:203 #: src/components/moderation/LabelPreference.tsx:135 #: src/components/moderation/PostHider.tsx:134 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:712 @@ -3942,7 +3979,7 @@ msgstr "" msgid "Hide" msgstr "" -#: src/view/com/notifications/NotificationFeedItem.tsx:806 +#: src/view/com/notifications/NotificationFeedItem.tsx:808 msgctxt "action" msgid "Hide" msgstr "" @@ -3993,7 +4030,7 @@ msgstr "" msgid "Hide trending videos?" msgstr "" -#: src/view/com/notifications/NotificationFeedItem.tsx:797 +#: src/view/com/notifications/NotificationFeedItem.tsx:799 msgid "Hide user list" msgstr "" @@ -4002,7 +4039,7 @@ msgstr "" msgid "Hide verification badges" msgstr "" -#: src/components/moderation/ContentHider.tsx:151 +#: src/components/moderation/ContentHider.tsx:154 #: src/components/moderation/PostHider.tsx:89 msgid "Hides the content" msgstr "" @@ -4332,11 +4369,11 @@ msgstr "" msgid "Keep me posted" msgstr "" -#: src/components/moderation/ContentHider.tsx:231 +#: src/components/moderation/ContentHider.tsx:234 msgid "Labeled by {0}." msgstr "" -#: src/components/moderation/ContentHider.tsx:229 +#: src/components/moderation/ContentHider.tsx:232 msgid "Labeled by the author." msgstr "" @@ -4409,11 +4446,11 @@ msgstr "" msgid "Learn more about self hosting your PDS." msgstr "" -#: src/components/moderation/ContentHider.tsx:149 +#: src/components/moderation/ContentHider.tsx:152 msgid "Learn more about the moderation applied to this content" msgstr "" -#: src/components/moderation/ContentHider.tsx:215 +#: src/components/moderation/ContentHider.tsx:218 msgid "Learn more about the moderation applied to this content." msgstr "" @@ -4432,7 +4469,7 @@ msgstr "" msgid "Learn more about what is public on Bluesky." msgstr "" -#: src/components/moderation/ContentHider.tsx:239 +#: src/components/moderation/ContentHider.tsx:242 #: src/view/com/auth/server-input/index.tsx:220 msgid "Learn more." msgstr "" @@ -4533,7 +4570,7 @@ msgid "Liked By" msgstr "" #: src/components/FeedCard.tsx:218 -#: src/view/com/feeds/FeedSourceCard.tsx:303 +#: src/view/com/feeds/FeedSourceCard.tsx:172 msgid "Liked by {0, plural, one {# user} other {# users}}" msgstr "" @@ -4586,8 +4623,8 @@ msgctxt "toast" msgid "List blocked" msgstr "" -#: src/components/ListCard.tsx:150 -#: src/view/com/feeds/FeedSourceCard.tsx:255 +#: src/components/ListCard.tsx:152 +#: src/view/com/feeds/FeedSourceCard.tsx:152 msgid "List by {0}" msgstr "" @@ -4599,6 +4636,10 @@ msgstr "" msgid "List by you" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:154 +msgid "List creator" +msgstr "" + #: src/view/screens/ProfileList.tsx:485 msgctxt "toast" msgid "List deleted" @@ -4866,7 +4907,7 @@ msgstr "" msgid "Moderation details" msgstr "" -#: src/components/ListCard.tsx:149 +#: src/components/ListCard.tsx:151 #: src/view/com/modals/UserAddRemoveLists.tsx:222 msgid "Moderation list by {0}" msgstr "" @@ -5743,7 +5784,7 @@ msgstr "" msgid "Opens password reset form" msgstr "" -#: src/view/com/notifications/NotificationFeedItem.tsx:900 +#: src/view/com/notifications/NotificationFeedItem.tsx:902 #: src/view/com/util/UserAvatar.tsx:592 msgid "Opens this profile" msgstr "" @@ -5926,7 +5967,7 @@ msgstr "" msgid "Pinned {0} to Home" msgstr "" -#: src/view/screens/SavedFeeds.tsx:130 +#: src/view/screens/SavedFeeds.tsx:131 msgid "Pinned Feeds" msgstr "" @@ -6508,7 +6549,6 @@ msgstr "" #: src/components/StarterPack/Wizard/WizardListCard.tsx:102 #: src/components/StarterPack/Wizard/WizardListCard.tsx:109 #: src/screens/Settings/Settings.tsx:567 -#: src/view/com/feeds/FeedSourceCard.tsx:322 #: src/view/com/modals/UserAddRemoveLists.tsx:235 #: src/view/com/posts/PostFeedErrorMessage.tsx:217 msgid "Remove" @@ -6557,10 +6597,8 @@ msgstr "" #: src/screens/Profile/components/ProfileFeedHeader.tsx:319 #: src/screens/Profile/components/ProfileFeedHeader.tsx:325 -#: src/view/com/feeds/FeedSourceCard.tsx:190 -#: src/view/com/feeds/FeedSourceCard.tsx:268 #: src/view/screens/ProfileList.tsx:528 -#: src/view/screens/SavedFeeds.tsx:349 +#: src/view/screens/SavedFeeds.tsx:350 msgid "Remove from my feeds" msgstr "" @@ -6574,7 +6612,6 @@ msgid "Remove from saved feeds" msgstr "" #: src/components/FeedCard.tsx:338 -#: src/view/com/feeds/FeedSourceCard.tsx:317 msgid "Remove from your feeds?" msgstr "" @@ -6636,10 +6673,6 @@ msgstr "" msgid "Removed from list" msgstr "" -#: src/view/com/feeds/FeedSourceCard.tsx:138 -msgid "Removed from my feeds" -msgstr "" - #: src/screens/List/ListHiddenScreen.tsx:94 msgid "Removed from saved feeds" msgstr "" @@ -7033,7 +7066,7 @@ msgstr "" #: src/view/com/composer/photos/ImageAltTextDialog.tsx:153 #: src/view/com/composer/photos/ImageAltTextDialog.tsx:163 #: src/view/com/modals/CreateOrEditList.tsx:315 -#: src/view/screens/SavedFeeds.tsx:116 +#: src/view/screens/SavedFeeds.tsx:117 msgid "Save" msgstr "" @@ -7049,8 +7082,8 @@ msgstr "" #: src/components/activity-notifications/SubscribeProfileDialog.tsx:191 #: src/components/activity-notifications/SubscribeProfileDialog.tsx:200 -#: src/view/screens/SavedFeeds.tsx:112 -#: src/view/screens/SavedFeeds.tsx:116 +#: src/view/screens/SavedFeeds.tsx:113 +#: src/view/screens/SavedFeeds.tsx:117 msgid "Save changes" msgstr "" @@ -7076,7 +7109,7 @@ msgstr "" msgid "Save to my feeds" msgstr "" -#: src/view/screens/SavedFeeds.tsx:171 +#: src/view/screens/SavedFeeds.tsx:172 msgid "Saved Feeds" msgstr "" @@ -7091,8 +7124,8 @@ msgstr "" #: src/components/dms/ChatEmptyPill.tsx:33 #: src/components/NewskieDialog.tsx:105 -#: src/view/com/notifications/NotificationFeedItem.tsx:745 -#: src/view/com/notifications/NotificationFeedItem.tsx:770 +#: src/view/com/notifications/NotificationFeedItem.tsx:747 +#: src/view/com/notifications/NotificationFeedItem.tsx:772 msgid "Say hello!" msgstr "" @@ -7211,7 +7244,7 @@ msgstr "" msgid "See jobs at Bluesky" msgstr "" -#: src/view/screens/SavedFeeds.tsx:212 +#: src/view/screens/SavedFeeds.tsx:213 msgid "See this guide" msgstr "" @@ -7574,7 +7607,7 @@ msgstr "" msgid "Shared Preferences Tester" msgstr "" -#: src/components/moderation/ContentHider.tsx:200 +#: src/components/moderation/ContentHider.tsx:203 #: src/components/moderation/LabelPreference.tsx:137 #: src/components/moderation/PostHider.tsx:134 msgid "Show" @@ -7695,7 +7728,7 @@ msgstr "" msgid "Shows other accounts you can switch to" msgstr "" -#: src/components/moderation/ContentHider.tsx:152 +#: src/components/moderation/ContentHider.tsx:155 #: src/components/moderation/PostHider.tsx:89 msgid "Shows the content" msgstr "" @@ -8095,6 +8128,14 @@ msgstr "" msgid "Tags only" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:89 +msgid "Tap for information" +msgstr "" + +#: src/view/com/feeds/MissingFeed.tsx:44 +msgid "Tap for more information" +msgstr "" + #: src/components/ContextMenu/Backdrop.ios.tsx:54 #: src/components/ContextMenu/Backdrop.ios.tsx:80 #: src/components/ContextMenu/Backdrop.tsx:46 @@ -8317,7 +8358,7 @@ msgstr "" #: src/screens/Profile/components/ProfileFeedHeader.tsx:178 #: src/view/screens/ProfileList.tsx:375 #: src/view/screens/ProfileList.tsx:394 -#: src/view/screens/SavedFeeds.tsx:92 +#: src/view/screens/SavedFeeds.tsx:93 msgid "There was an issue contacting the server" msgstr "" @@ -8326,11 +8367,6 @@ msgstr "" msgid "There was an issue contacting the server, please check your internet connection and try again." msgstr "" -#: src/view/com/feeds/FeedSourceCard.tsx:127 -#: src/view/com/feeds/FeedSourceCard.tsx:140 -msgid "There was an issue contacting your server" -msgstr "" - #: src/view/com/notifications/NotificationFeed.tsx:124 msgid "There was an issue fetching notifications. Tap here to try again." msgstr "" @@ -8805,6 +8841,10 @@ msgstr "" msgid "Unable to delete" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:126 +msgid "Unavailable feed information" +msgstr "" + #: src/components/dms/MessagesListBlockedFooter.tsx:97 #: src/components/dms/MessagesListBlockedFooter.tsx:104 #: src/components/dms/MessagesListBlockedFooter.tsx:112 @@ -9455,6 +9495,14 @@ msgstr "" msgid "Watch now" msgstr "" +#: src/view/com/feeds/MissingFeed.tsx:140 +msgid "We could not connect to the service that provides this custom feed. It may be temporarily unavailable and experiencing issues, or permanently unavailable." +msgstr "" + +#: src/view/com/feeds/MissingFeed.tsx:146 +msgid "We could not find this list. It was probably deleted." +msgstr "" + #: src/screens/Hashtag.tsx:205 msgid "We couldn't find any results for that hashtag." msgstr "" @@ -9822,11 +9870,11 @@ msgstr "" msgid "You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer." msgstr "" -#: src/view/screens/SavedFeeds.tsx:144 +#: src/view/screens/SavedFeeds.tsx:145 msgid "You don't have any pinned feeds." msgstr "" -#: src/view/screens/SavedFeeds.tsx:184 +#: src/view/screens/SavedFeeds.tsx:185 msgid "You don't have any saved feeds." msgstr ""