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 ""