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