mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at remove-hackfix 131 lines 4.2 kB view raw
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}