mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React from 'react'
2import {View} from 'react-native'
3import RNPickerSelect, {PickerSelectProps} from 'react-native-picker-select'
4import {useQueryClient} from '@tanstack/react-query'
5
6import {sanitizeAppLanguageSetting} from '#/locale/helpers'
7import {APP_LANGUAGES} from '#/locale/languages'
8import {useLanguagePrefs, useLanguagePrefsApi} from '#/state/preferences'
9import {resetPostsFeedQueries} from '#/state/queries/post-feed'
10import {atoms as a, useTheme} from '#/alf'
11import {ChevronBottom_Stroke2_Corner0_Rounded as ChevronDown} from '#/components/icons/Chevron'
12
13export function AppLanguageDropdown() {
14 const t = useTheme()
15
16 const queryClient = useQueryClient()
17 const langPrefs = useLanguagePrefs()
18 const setLangPrefs = useLanguagePrefsApi()
19 const sanitizedLang = sanitizeAppLanguageSetting(langPrefs.appLanguage)
20
21 const onChangeAppLanguage = React.useCallback(
22 (value: Parameters<PickerSelectProps['onValueChange']>[0]) => {
23 if (!value) return
24 if (sanitizedLang !== value) {
25 setLangPrefs.setAppLanguage(sanitizeAppLanguageSetting(value))
26 }
27 setLangPrefs.setPrimaryLanguage(value)
28 setLangPrefs.setContentLanguage(value)
29
30 // reset feeds to refetch content
31 resetPostsFeedQueries(queryClient)
32 },
33 [sanitizedLang, setLangPrefs, queryClient],
34 )
35
36 return (
37 <View style={a.relative}>
38 <RNPickerSelect
39 placeholder={{}}
40 value={sanitizedLang}
41 onValueChange={onChangeAppLanguage}
42 items={APP_LANGUAGES.filter(l => Boolean(l.code2)).map(l => ({
43 label: l.name,
44 value: l.code2,
45 key: l.code2,
46 }))}
47 useNativeAndroidPickerStyle={false}
48 style={{
49 inputAndroid: {
50 color: t.atoms.text_contrast_medium.color,
51 fontSize: 16,
52 paddingRight: 12 + 4,
53 },
54 inputIOS: {
55 color: t.atoms.text.color,
56 fontSize: 16,
57 paddingRight: 12 + 4,
58 },
59 }}
60 />
61
62 <View
63 style={[
64 a.absolute,
65 a.inset_0,
66 {left: 'auto'},
67 {pointerEvents: 'none'},
68 a.align_center,
69 a.justify_center,
70 ]}>
71 <ChevronDown fill={t.atoms.text.color} size="xs" />
72 </View>
73 </View>
74 )
75}