mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import {msg, Trans} from '@lingui/macro'
2import {useLingui} from '@lingui/react'
3
4import {LANG_DROPDOWN_HITSLOP} from '#/lib/constants'
5import {codeToLanguageName} from '#/locale/helpers'
6import {
7 toPostLanguages,
8 useLanguagePrefs,
9 useLanguagePrefsApi,
10} from '#/state/preferences/languages'
11import {atoms as a, useTheme} from '#/alf'
12import {Button, type ButtonProps} from '#/components/Button'
13import * as Dialog from '#/components/Dialog'
14import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRightIcon} from '#/components/icons/Chevron'
15import {Globe_Stroke2_Corner0_Rounded as GlobeIcon} from '#/components/icons/Globe'
16import * as Menu from '#/components/Menu'
17import {Text} from '#/components/Typography'
18import {PostLanguageSelectDialog} from './PostLanguageSelectDialog'
19
20export function PostLanguageSelect() {
21 const {_} = useLingui()
22 const langPrefs = useLanguagePrefs()
23 const setLangPrefs = useLanguagePrefsApi()
24 const languageDialogControl = Dialog.useDialogControl()
25
26 const dedupedHistory = Array.from(
27 new Set([...langPrefs.postLanguageHistory, langPrefs.postLanguage]),
28 )
29
30 if (
31 dedupedHistory.length === 1 &&
32 dedupedHistory[0] === langPrefs.postLanguage
33 ) {
34 return (
35 <>
36 <LanguageBtn onPress={languageDialogControl.open} />
37 <PostLanguageSelectDialog control={languageDialogControl} />
38 </>
39 )
40 }
41
42 return (
43 <>
44 <Menu.Root>
45 <Menu.Trigger label={_(msg`Select post language`)}>
46 {({props}) => <LanguageBtn {...props} />}
47 </Menu.Trigger>
48 <Menu.Outer>
49 <Menu.Group>
50 {dedupedHistory.map(historyItem => {
51 const langCodes = historyItem.split(',')
52 const langName = langCodes
53 .map(code => codeToLanguageName(code, langPrefs.appLanguage))
54 .join(' + ')
55 return (
56 <Menu.Item
57 key={historyItem}
58 label={_(msg`Select ${langName}`)}
59 onPress={() => setLangPrefs.setPostLanguage(historyItem)}>
60 <Menu.ItemText>{langName}</Menu.ItemText>
61 <Menu.ItemRadio
62 selected={historyItem === langPrefs.postLanguage}
63 />
64 </Menu.Item>
65 )
66 })}
67 </Menu.Group>
68 <Menu.Divider />
69 <Menu.Item
70 label={_(msg`More languages...`)}
71 onPress={languageDialogControl.open}>
72 <Menu.ItemText>
73 <Trans>More languages...</Trans>
74 </Menu.ItemText>
75 <Menu.ItemIcon icon={ChevronRightIcon} />
76 </Menu.Item>
77 </Menu.Outer>
78 </Menu.Root>
79
80 <PostLanguageSelectDialog control={languageDialogControl} />
81 </>
82 )
83}
84
85function LanguageBtn(props: Omit<ButtonProps, 'label' | 'children'>) {
86 const {_} = useLingui()
87 const langPrefs = useLanguagePrefs()
88 const t = useTheme()
89
90 const postLanguagesPref = toPostLanguages(langPrefs.postLanguage)
91
92 return (
93 <Button
94 testID="selectLangBtn"
95 size="small"
96 hitSlop={LANG_DROPDOWN_HITSLOP}
97 label={_(
98 msg({
99 message: `Post language selection`,
100 comment: `Accessibility label for button that opens dialog to choose post language settings`,
101 }),
102 )}
103 accessibilityHint={_(msg`Opens post language settings`)}
104 style={[a.mr_xs]}
105 {...props}>
106 {({pressed, hovered}) => {
107 const color =
108 pressed || hovered ? t.palette.primary_300 : t.palette.primary_500
109 if (postLanguagesPref.length > 0) {
110 return (
111 <Text
112 style={[
113 {color},
114 a.font_semi_bold,
115 a.text_sm,
116 a.leading_snug,
117 {maxWidth: 100},
118 ]}
119 numberOfLines={1}>
120 {postLanguagesPref
121 .map(lang => codeToLanguageName(lang, langPrefs.appLanguage))
122 .join(', ')}
123 </Text>
124 )
125 } else {
126 return <GlobeIcon size="xs" style={{color}} />
127 }
128 }}
129 </Button>
130 )
131}