An ATproto social media client -- with an independent Appview.
at main 1.3 kB view raw
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}