Bluesky app fork with some witchin' additions 馃挮
witchsky.app
bluesky
fork
client
1import {useCallback} from 'react'
2import {View} from 'react-native'
3import {msg} from '@lingui/core/macro'
4import {useLingui} from '@lingui/react'
5import {Trans} from '@lingui/react/macro'
6
7import {PROD_DEFAULT_FEED} from '#/lib/constants'
8import {logger} from '#/logger'
9import {
10 usePreferencesQuery,
11 useRemoveFeedMutation,
12 useReplaceForYouWithDiscoverFeedMutation,
13} from '#/state/queries/preferences'
14import {useSetSelectedFeed} from '#/state/shell/selected-feed'
15import {atoms as a, useTheme} from '#/alf'
16import {Button, ButtonIcon, ButtonText} from '#/components/Button'
17import {InlineLinkText} from '#/components/Link'
18import {Loader} from '#/components/Loader'
19import * as Toast from '#/components/Toast'
20import {Text} from '#/components/Typography'
21
22export function FeedShutdownMsg({feedUri}: {feedUri: string}) {
23 const t = useTheme()
24 const {_} = useLingui()
25 const setSelectedFeed = useSetSelectedFeed()
26 const {data: preferences} = usePreferencesQuery()
27 const {mutateAsync: removeFeed, isPending: isRemovePending} =
28 useRemoveFeedMutation()
29 const {mutateAsync: replaceFeedWithDiscover, isPending: isReplacePending} =
30 useReplaceForYouWithDiscoverFeedMutation()
31
32 const feedConfig = preferences?.savedFeeds?.find(
33 f => f.value === feedUri && f.pinned,
34 )
35 const discoverFeedConfig = preferences?.savedFeeds?.find(
36 f => f.value === PROD_DEFAULT_FEED('whats-hot'),
37 )
38 const hasFeedPinned = Boolean(feedConfig)
39 const hasDiscoverPinned = Boolean(discoverFeedConfig?.pinned)
40
41 const onRemoveFeed = useCallback(async () => {
42 try {
43 if (feedConfig) {
44 await removeFeed(feedConfig)
45 Toast.show(_(msg`Removed from your feeds`))
46 }
47 if (hasDiscoverPinned) {
48 setSelectedFeed(`feedgen|${PROD_DEFAULT_FEED('whats-hot')}`)
49 }
50 } catch (err: any) {
51 Toast.show(
52 _(
53 msg`There was an issue updating your feeds, please check your internet connection and try again.`,
54 ),
55 {
56 type: 'warning',
57 },
58 )
59 logger.error('Failed to update feeds', {message: err})
60 }
61 }, [removeFeed, feedConfig, _, hasDiscoverPinned, setSelectedFeed])
62
63 const onReplaceFeed = useCallback(async () => {
64 try {
65 await replaceFeedWithDiscover({
66 forYouFeedConfig: feedConfig,
67 discoverFeedConfig,
68 })
69 setSelectedFeed(`feedgen|${PROD_DEFAULT_FEED('whats-hot')}`)
70 Toast.show(_(msg`The feed has been replaced with Discover.`))
71 } catch (err: any) {
72 Toast.show(
73 _(
74 msg`There was an issue updating your feeds, please check your internet connection and try again.`,
75 ),
76 {
77 type: 'warning',
78 },
79 )
80 logger.error('Failed to update feeds', {message: err})
81 }
82 }, [
83 replaceFeedWithDiscover,
84 discoverFeedConfig,
85 feedConfig,
86 setSelectedFeed,
87 _,
88 ])
89
90 const isProcessing = isReplacePending || isRemovePending
91 return (
92 <View
93 style={[
94 a.py_3xl,
95 a.px_2xl,
96 a.gap_xl,
97 t.atoms.border_contrast_low,
98 a.border_t,
99 ]}>
100 <Text style={[a.text_5xl, a.font_semi_bold, t.atoms.text, a.text_center]}>
101 :(
102 </Text>
103 <Text style={[a.text_md, a.leading_snug, t.atoms.text, a.text_center]}>
104 <Trans>
105 This feed is no longer online. We are showing{' '}
106 <InlineLinkText
107 label={_(msg`The Discover feed`)}
108 to="/profile/bsky.app/feed/whats-hot"
109 style={[a.text_md]}>
110 Discover
111 </InlineLinkText>{' '}
112 instead.
113 </Trans>
114 </Text>
115 {hasFeedPinned ? (
116 <View style={[a.flex_row, a.justify_center, a.gap_sm]}>
117 <Button
118 variant="outline"
119 color="primary"
120 size="small"
121 label={_(msg`Remove feed`)}
122 disabled={isProcessing}
123 onPress={onRemoveFeed}>
124 <ButtonText>
125 <Trans>Remove feed</Trans>
126 </ButtonText>
127 {isRemovePending && <ButtonIcon icon={Loader} />}
128 </Button>
129 {!hasDiscoverPinned && (
130 <Button
131 variant="solid"
132 color="primary"
133 size="small"
134 label={_(msg`Replace with Discover`)}
135 disabled={isProcessing}
136 onPress={onReplaceFeed}>
137 <ButtonText>
138 <Trans>Replace with Discover</Trans>
139 </ButtonText>
140 {isReplacePending && <ButtonIcon icon={Loader} />}
141 </Button>
142 )}
143 </View>
144 ) : undefined}
145 </View>
146 )
147}