An ATproto social media client -- with an independent Appview.
1import React from 'react'
2import {msg} from '@lingui/macro'
3import {useLingui} from '@lingui/react'
4
5import {sanitizeAppLanguageSetting} from '#/locale/helpers'
6import {APP_LANGUAGES} from '#/locale/languages'
7import * as Select from '#/components/Select'
8
9export function LanguageSelect({
10 value,
11 onChange,
12 items = APP_LANGUAGES.map(l => ({
13 label: l.name,
14 value: l.code2,
15 })),
16}: {
17 value?: string
18 onChange: (value: string) => void
19 items?: {label: string; value: string}[]
20}) {
21 const {_} = useLingui()
22
23 const handleOnChange = React.useCallback(
24 (value: string) => {
25 if (!value) return
26 onChange(sanitizeAppLanguageSetting(value))
27 },
28 [onChange],
29 )
30
31 return (
32 <Select.Root
33 value={value ? sanitizeAppLanguageSetting(value) : undefined}
34 onValueChange={handleOnChange}>
35 <Select.Trigger label={_(msg`Select language`)}>
36 <Select.ValueText placeholder={_(msg`Select language`)} />
37 <Select.Icon />
38 </Select.Trigger>
39 <Select.Content
40 renderItem={({label, value}) => (
41 <Select.Item value={value} label={label}>
42 <Select.ItemIndicator />
43 <Select.ItemText>{label}</Select.ItemText>
44 </Select.Item>
45 )}
46 items={items}
47 />
48 </Select.Root>
49 )
50}