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