Bluesky app fork with some witchin' additions 馃挮 witchsky.app
bluesky fork client
119
fork

Configure Feed

Select the types of activity you want to include in your feed.

at a876aae44ea07494ebea9727350aa060b81f317b 108 lines 4.1 kB view raw
1import {View} from 'react-native' 2import {msg} from '@lingui/core/macro' 3import {useLingui} from '@lingui/react' 4import {Trans} from '@lingui/react/macro' 5 6import { 7 type CommonNavigatorParams, 8 type NativeStackScreenProps, 9} from '#/lib/routes/types' 10import { 11 normalizeSort, 12 normalizeView, 13 useThreadPreferences, 14} from '#/state/queries/preferences/useThreadPreferences' 15import {atoms as a, useTheme} from '#/alf' 16import * as Toggle from '#/components/forms/Toggle' 17import {Bubbles_Stroke2_Corner2_Rounded as BubblesIcon} from '#/components/icons/Bubble' 18import {Tree_Stroke2_Corner0_Rounded as TreeIcon} from '#/components/icons/Tree' 19import * as Layout from '#/components/Layout' 20import {Text} from '#/components/Typography' 21import * as SettingsList from './components/SettingsList' 22 23type Props = NativeStackScreenProps<CommonNavigatorParams, 'PreferencesThreads'> 24export function ThreadPreferencesScreen({}: Props) { 25 const t = useTheme() 26 const {_} = useLingui() 27 const {sort, setSort, view, setView} = useThreadPreferences({save: true}) 28 29 return ( 30 <Layout.Screen testID="threadPreferencesScreen"> 31 <Layout.Header.Outer> 32 <Layout.Header.BackButton /> 33 <Layout.Header.Content> 34 <Layout.Header.TitleText> 35 <Trans>Thread Preferences</Trans> 36 </Layout.Header.TitleText> 37 </Layout.Header.Content> 38 <Layout.Header.Slot /> 39 </Layout.Header.Outer> 40 <Layout.Content> 41 <SettingsList.Container> 42 <SettingsList.Group> 43 <SettingsList.ItemIcon icon={BubblesIcon} /> 44 <SettingsList.ItemText> 45 <Trans>Sort replies</Trans> 46 </SettingsList.ItemText> 47 <View style={[a.w_full, a.gap_md]}> 48 <Text style={[a.flex_1, t.atoms.text_contrast_medium]}> 49 <Trans>Sort replies to the same post by:</Trans> 50 </Text> 51 <Toggle.Group 52 label={_(msg`Sort replies by`)} 53 type="radio" 54 values={sort ? [sort] : []} 55 onChange={values => setSort(normalizeSort(values[0]))}> 56 <View style={[a.gap_sm, a.flex_1]}> 57 <Toggle.Item name="top" label={_(msg`Top replies first`)}> 58 <Toggle.Radio /> 59 <Toggle.LabelText> 60 <Trans>Top replies first</Trans> 61 </Toggle.LabelText> 62 </Toggle.Item> 63 <Toggle.Item 64 name="oldest" 65 label={_(msg`Oldest replies first`)}> 66 <Toggle.Radio /> 67 <Toggle.LabelText> 68 <Trans>Oldest replies first</Trans> 69 </Toggle.LabelText> 70 </Toggle.Item> 71 <Toggle.Item 72 name="newest" 73 label={_(msg`Newest replies first`)}> 74 <Toggle.Radio /> 75 <Toggle.LabelText> 76 <Trans>Newest replies first</Trans> 77 </Toggle.LabelText> 78 </Toggle.Item> 79 </View> 80 </Toggle.Group> 81 </View> 82 </SettingsList.Group> 83 84 <SettingsList.Group> 85 <SettingsList.ItemIcon icon={TreeIcon} /> 86 <SettingsList.ItemText> 87 <Trans>Tree view</Trans> 88 </SettingsList.ItemText> 89 <Toggle.Item 90 type="checkbox" 91 name="threaded-mode" 92 label={_(msg`Tree view`)} 93 value={view === 'tree'} 94 onChange={value => 95 setView(normalizeView({treeViewEnabled: value})) 96 } 97 style={[a.w_full, a.gap_md]}> 98 <Toggle.LabelText style={[a.flex_1]}> 99 <Trans>Show post replies in a threaded tree view</Trans> 100 </Toggle.LabelText> 101 <Toggle.Platform /> 102 </Toggle.Item> 103 </SettingsList.Group> 104 </SettingsList.Container> 105 </Layout.Content> 106 </Layout.Screen> 107 ) 108}