+64
src/screens/Settings/DeerSettings.tsx
+64
src/screens/Settings/DeerSettings.tsx
···
81
81
useShowExternalShareButtons,
82
82
} from '#/state/preferences/external-share-buttons'
83
83
import {
84
+
useSetTerminologyPreference,
85
+
useTerminologyPreference,
86
+
} from '#/state/preferences/terminology-preference'
87
+
import {
84
88
useHideFeedsPromoTab,
85
89
useSetHideFeedsPromoTab,
86
90
} from '#/state/preferences/hide-feeds-promo-tab'
···
467
471
const showLinkInHandle = useShowLinkInHandle()
468
472
const setShowLinkInHandle = useSetShowLinkInHandle()
469
473
474
+
const terminologyPreference = useTerminologyPreference()
475
+
const setTerminologyPreference = useSetTerminologyPreference()
476
+
470
477
const [gates, setGatesView] = useState(Object.assign({
471
478
alt_share_icon: false,
472
479
debug_show_feedcontext: false,
···
651
658
{customAppViewDid && _(` Currently ${customAppViewDid}`)}
652
659
</Trans>
653
660
</Admonition>
661
+
</SettingsList.Item>
662
+
663
+
<SettingsList.Group contentContainerStyle={[a.gap_sm]}>
664
+
<SettingsList.ItemIcon icon={PaintRollerIcon} />
665
+
<SettingsList.ItemText>
666
+
<Trans>Terminology</Trans>
667
+
</SettingsList.ItemText>
668
+
</SettingsList.Group>
669
+
670
+
<SettingsList.Item>
671
+
<Admonition type="info" style={[a.flex_1]}>
672
+
<Trans>
673
+
Choose your preferred terminology for posts throughout the app.
674
+
</Trans>
675
+
</Admonition>
676
+
</SettingsList.Item>
677
+
678
+
<SettingsList.Item>
679
+
<Toggle.Item
680
+
name="terminology_skeet"
681
+
label={_(msg`Use "skeet(s)"`)}
682
+
value={terminologyPreference === 'skeet'}
683
+
onChange={() => setTerminologyPreference('skeet')}
684
+
style={[a.w_full]}>
685
+
<Toggle.LabelText style={[a.flex_1]}>
686
+
<Trans>Use "skeet(s)"</Trans>
687
+
</Toggle.LabelText>
688
+
<Toggle.Radio />
689
+
</Toggle.Item>
690
+
</SettingsList.Item>
691
+
692
+
<SettingsList.Item>
693
+
<Toggle.Item
694
+
name="terminology_post"
695
+
label={_(msg`Use "post(s)"`)}
696
+
value={terminologyPreference === 'post'}
697
+
onChange={() => setTerminologyPreference('post')}
698
+
style={[a.w_full]}>
699
+
<Toggle.LabelText style={[a.flex_1]}>
700
+
<Trans>Use "post(s)"</Trans>
701
+
</Toggle.LabelText>
702
+
<Toggle.Radio />
703
+
</Toggle.Item>
704
+
</SettingsList.Item>
705
+
706
+
<SettingsList.Item>
707
+
<Toggle.Item
708
+
name="terminology_spell"
709
+
label={_(msg`Use "spell(s)"`)}
710
+
value={terminologyPreference === 'spell'}
711
+
onChange={() => setTerminologyPreference('spell')}
712
+
style={[a.w_full]}>
713
+
<Toggle.LabelText style={[a.flex_1]}>
714
+
<Trans>Use "spell(s)"</Trans>
715
+
</Toggle.LabelText>
716
+
<Toggle.Radio />
717
+
</Toggle.Item>
654
718
</SettingsList.Item>
655
719
656
720
<SettingsList.Group contentContainerStyle={[a.gap_sm]}>
+2
src/state/persisted/schema.ts
+2
src/state/persisted/schema.ts
···
169
169
hideUnreplyablePosts: z.boolean().optional(),
170
170
171
171
showExternalShareButtons: z.boolean().optional(),
172
+
terminologyPreference: z.enum(['skeet', 'post', 'spell']).optional(),
172
173
173
174
/** @deprecated */
174
175
mutedThreads: z.array(z.string()),
···
272
273
highQualityImages: false,
273
274
hideUnreplyablePosts: false,
274
275
showExternalShareButtons: false,
276
+
terminologyPreference: 'skeet',
275
277
}
276
278
277
279
export function tryParse(rawData: string): Schema | undefined {
+8
-1
src/state/preferences/index.tsx
+8
-1
src/state/preferences/index.tsx
···
37
37
import {Provider as RepostCarouselProvider} from './repost-carousel-enabled'
38
38
import {Provider as ShowLinkInHandleProvider} from './show-link-in-handle'
39
39
import {Provider as SubtitlesProvider} from './subtitles'
40
+
import {Provider as TerminologyPreferenceProvider} from './terminology-preference'
40
41
import {Provider as TrendingSettingsProvider} from './trending'
41
42
import {Provider as UsedStarterPacksProvider} from './used-starter-packs'
42
43
···
59
60
export {useLabelDefinitions} from './label-defs'
60
61
export {useLanguagePrefs, useLanguagePrefsApi} from './languages'
61
62
export {useSetSubtitlesEnabled, useSubtitlesEnabled} from './subtitles'
63
+
export {
64
+
useTerminologyPreference,
65
+
useSetTerminologyPreference,
66
+
} from './terminology-preference'
62
67
63
68
export function Provider({children}: React.PropsWithChildren<{}>) {
64
69
return (
···
101
106
<EnableSquareAvatarsProvider>
102
107
<EnableSquareButtonsProvider>
103
108
<DisableVerifyEmailReminderProvider>
104
-
{children}
109
+
<TerminologyPreferenceProvider>
110
+
{children}
111
+
</TerminologyPreferenceProvider>
105
112
</DisableVerifyEmailReminderProvider>
106
113
</EnableSquareButtonsProvider>
107
114
</EnableSquareAvatarsProvider>
+52
src/state/preferences/terminology-preference.tsx
+52
src/state/preferences/terminology-preference.tsx
···
1
+
import React from 'react'
2
+
3
+
import * as persisted from '#/state/persisted'
4
+
5
+
type StateContext = persisted.Schema['terminologyPreference']
6
+
type SetContext = (v: persisted.Schema['terminologyPreference']) => void
7
+
8
+
const stateContext = React.createContext<StateContext>(
9
+
persisted.defaults.terminologyPreference,
10
+
)
11
+
const setContext = React.createContext<SetContext>(
12
+
(_: persisted.Schema['terminologyPreference']) => {},
13
+
)
14
+
15
+
export function Provider({children}: React.PropsWithChildren<{}>) {
16
+
const [state, setState] = React.useState(
17
+
persisted.get('terminologyPreference'),
18
+
)
19
+
20
+
const setStateWrapped = React.useCallback(
21
+
(terminologyPreference: persisted.Schema['terminologyPreference']) => {
22
+
setState(terminologyPreference)
23
+
persisted.write('terminologyPreference', terminologyPreference)
24
+
},
25
+
[setState],
26
+
)
27
+
28
+
React.useEffect(() => {
29
+
return persisted.onUpdate(
30
+
'terminologyPreference',
31
+
nextTerminologyPreference => {
32
+
setState(nextTerminologyPreference)
33
+
},
34
+
)
35
+
}, [setStateWrapped])
36
+
37
+
return (
38
+
<stateContext.Provider value={state}>
39
+
<setContext.Provider value={setStateWrapped}>
40
+
{children}
41
+
</setContext.Provider>
42
+
</stateContext.Provider>
43
+
)
44
+
}
45
+
46
+
export function useTerminologyPreference() {
47
+
return React.useContext(stateContext)
48
+
}
49
+
50
+
export function useSetTerminologyPreference() {
51
+
return React.useContext(setContext)
52
+
}