Bluesky app fork with some witchin' additions 馃挮 witchsky.app
bluesky fork client
at main 116 lines 3.7 kB view raw
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}