Bluesky app fork with some witchin' additions 馃挮
witchsky.app
bluesky
fork
client
1import React from 'react'
2import {View} from 'react-native'
3import {TID} from '@atproto/common-web'
4import {msg} from '@lingui/core/macro'
5import {useLingui} from '@lingui/react'
6import {Trans} from '@lingui/react/macro'
7
8import {DISCOVER_SAVED_FEED, TIMELINE_SAVED_FEED} from '#/lib/constants'
9import {useOverwriteSavedFeedsMutation} from '#/state/queries/preferences'
10import {type UsePreferencesQueryResponse} from '#/state/queries/preferences'
11import {CenteredView} from '#/view/com/util/Views'
12import {atoms as a} from '#/alf'
13import {Button, ButtonIcon, ButtonText} from '#/components/Button'
14import {useHeaderOffset} from '#/components/hooks/useHeaderOffset'
15import {ListSparkle_Stroke2_Corner0_Rounded as ListSparkle} from '#/components/icons/ListSparkle'
16import {PlusLarge_Stroke2_Corner0_Rounded as Plus} from '#/components/icons/Plus'
17import {Link} from '#/components/Link'
18import {Text} from '#/components/Typography'
19
20export function NoFeedsPinned({
21 preferences,
22}: {
23 preferences: UsePreferencesQueryResponse
24}) {
25 const {_} = useLingui()
26 const headerOffset = useHeaderOffset()
27 const {isPending, mutateAsync: overwriteSavedFeeds} =
28 useOverwriteSavedFeedsMutation()
29
30 const addRecommendedFeeds = React.useCallback(async () => {
31 let skippedTimeline = false
32 let skippedDiscover = false
33 let remainingSavedFeeds = []
34
35 // remove first instance of both timeline and discover, since we're going to overwrite them
36 for (const savedFeed of preferences.savedFeeds) {
37 if (savedFeed.type === 'timeline' && !skippedTimeline) {
38 skippedTimeline = true
39 } else if (
40 savedFeed.value === DISCOVER_SAVED_FEED.value &&
41 !skippedDiscover
42 ) {
43 skippedDiscover = true
44 } else {
45 remainingSavedFeeds.push(savedFeed)
46 }
47 }
48
49 const toSave = [
50 {
51 ...DISCOVER_SAVED_FEED,
52 pinned: true,
53 id: TID.nextStr(),
54 },
55 {
56 ...TIMELINE_SAVED_FEED,
57 pinned: true,
58 id: TID.nextStr(),
59 },
60 ...remainingSavedFeeds,
61 ]
62
63 await overwriteSavedFeeds(toSave)
64 }, [overwriteSavedFeeds, preferences.savedFeeds])
65
66 return (
67 <CenteredView sideBorders style={[a.h_full_vh]}>
68 <View
69 style={[
70 a.align_center,
71 a.h_full_vh,
72 a.py_3xl,
73 a.px_xl,
74 {
75 paddingTop: headerOffset + a.py_3xl.paddingTop,
76 },
77 ]}>
78 <View style={[a.align_center, a.gap_sm, a.pb_xl]}>
79 <Text style={[a.text_xl, a.font_semi_bold]}>
80 <Trans>Whoops!</Trans>
81 </Text>
82 <Text
83 style={[a.text_md, a.text_center, a.leading_snug, {maxWidth: 340}]}>
84 <Trans>
85 Looks like you unpinned all your feeds. But don't worry, you can
86 add some below 馃槃
87 </Trans>
88 </Text>
89 </View>
90
91 <View style={[a.flex_row, a.gap_md, a.justify_center, a.flex_wrap]}>
92 <Button
93 disabled={isPending}
94 label={_(msg`Apply default recommended feeds`)}
95 size="large"
96 variant="solid"
97 color="primary"
98 onPress={addRecommendedFeeds}>
99 <ButtonIcon icon={Plus} position="left" />
100 <ButtonText>{_(msg`Add recommended feeds`)}</ButtonText>
101 </Button>
102
103 <Link
104 label={_(msg`Browse other feeds`)}
105 to="/feeds"
106 size="large"
107 variant="solid"
108 color="secondary">
109 <ButtonIcon icon={ListSparkle} position="left" />
110 <ButtonText>{_(msg`Browse other feeds`)}</ButtonText>
111 </Link>
112 </View>
113 </View>
114 </CenteredView>
115 )
116}