diff --git a/src/common/SelectableOptionsScreen.js b/src/common/SelectableOptionsScreen.js index ebf92e10318..c73dfe2d9ab 100644 --- a/src/common/SelectableOptionsScreen.js +++ b/src/common/SelectableOptionsScreen.js @@ -95,8 +95,8 @@ export default function SelectableOptionsScreen( ? items : items.filter(item => { // TODO: Is this the best way to filter? Where `title` and - // `subtitle` are present, behavior is matched to the language - // picker. + // `subtitle` are present, behavior is matched to an old + // implementation of the language picker. /* eslint-disable prefer-template */ const itemData = diff --git a/src/nav/AppNavigator.js b/src/nav/AppNavigator.js index f7fb809bc51..442e5f775b1 100644 --- a/src/nav/AppNavigator.js +++ b/src/nav/AppNavigator.js @@ -31,7 +31,6 @@ import PmConversationDetailsScreen from '../chat/PmConversationDetailsScreen'; import SearchMessagesScreen from '../search/SearchMessagesScreen'; import New1to1PmScreen from '../user-picker/New1to1PmScreen'; import ChatScreen from '../chat/ChatScreen'; -import LanguageScreen from '../settings/LanguageScreen'; import PasswordAuthScreen from '../start/PasswordAuthScreen'; import LightboxScreen from '../lightbox/LightboxScreen'; import NewGroupPmScreen from '../user-picker/NewGroupPmScreen'; @@ -67,7 +66,6 @@ export type AppNavigatorParamList = {| +'realm-input': RouteParamsOf, +'search-messages': RouteParamsOf, +'new-1to1-pm': RouteParamsOf, - +language: RouteParamsOf, +lightbox: RouteParamsOf, +'new-group-pm': RouteParamsOf, +'invite-users': RouteParamsOf, @@ -171,7 +169,6 @@ export default function AppNavigator(props: Props): Node { component={useHaveServerDataGate(SearchMessagesScreen)} /> - diff --git a/src/settings/LanguagePicker.js b/src/settings/LanguagePicker.js deleted file mode 100644 index bbec03813e5..00000000000 --- a/src/settings/LanguagePicker.js +++ /dev/null @@ -1,71 +0,0 @@ -/* @flow strict-local */ -import React, { PureComponent } from 'react'; -import type { Node, Context } from 'react'; -import { FlatList } from 'react-native'; - -import type { GetText } from '../types'; -import { TranslationContext } from '../boot/TranslationProvider'; -import OptionDivider from '../common/OptionDivider'; -import SelectableOptionRow from '../common/SelectableOptionRow'; -import languages from './languages'; -import type { Language } from './languages'; - -type Props = $ReadOnly<{| - value: string, - onValueChange: (tag: string) => void, - filter: string, -|}>; - -export default class LanguagePicker extends PureComponent { - static contextType: Context = TranslationContext; - context: GetText; - - getTranslatedLanguages: () => $ReadOnlyArray = () => - languages.map((language: Language) => { - const _ = this.context; - const translatedName = _(language.name); - return { - ...language, - name: translatedName, - }; - }); - - getFilteredLanguageList: string => $ReadOnlyArray = filter => { - const list = this.getTranslatedLanguages(); - - if (!filter) { - return list; - } - - return list.filter(item => { - const itemData = `${item.name.toUpperCase()} ${item.selfname.toUpperCase()}`; - const filterData = filter.toUpperCase(); - - return itemData.includes(filterData); - }); - }; - - render(): Node { - const { value, onValueChange, filter } = this.props; - const data = this.getFilteredLanguageList(filter); - - return ( - item.tag} - renderItem={({ item }) => ( - - )} - /> - ); - } -} diff --git a/src/settings/LanguageScreen.js b/src/settings/LanguageScreen.js deleted file mode 100644 index f6e13ce8696..00000000000 --- a/src/settings/LanguageScreen.js +++ /dev/null @@ -1,37 +0,0 @@ -/* @flow strict-local */ - -import React, { useState, useCallback } from 'react'; -import type { Node } from 'react'; - -import type { RouteProp } from '../react-navigation'; -import type { AppNavigationProp } from '../nav/AppNavigator'; -import { useGlobalSelector, useDispatch } from '../react-redux'; -import Screen from '../common/Screen'; -import LanguagePicker from './LanguagePicker'; -import { getGlobalSettings } from '../selectors'; -import { setGlobalSettings } from '../actions'; - -type Props = $ReadOnly<{| - navigation: AppNavigationProp<'language'>, - route: RouteProp<'language', void>, -|}>; - -export default function LanguageScreen(props: Props): Node { - const dispatch = useDispatch(); - const language = useGlobalSelector(state => getGlobalSettings(state).language); - - const [filter, setFilter] = useState(''); - - const handleLocaleChange = useCallback( - (value: string) => { - dispatch(setGlobalSettings({ language: value })); - }, - [dispatch], - ); - - return ( - - - - ); -} diff --git a/src/settings/SettingsScreen.js b/src/settings/SettingsScreen.js index 785ea39f34a..f0aae498dfc 100644 --- a/src/settings/SettingsScreen.js +++ b/src/settings/SettingsScreen.js @@ -31,6 +31,7 @@ import { showErrorAlert } from '../utils/info'; import { TranslationContext } from '../boot/TranslationProvider'; import { useNotificationReportsByIdentityKey } from './NotifTroubleshootingScreen'; import { keyOfIdentity } from '../account/accountMisc'; +import languages from './languages'; type Props = $ReadOnly<{| navigation: AppNavigationProp<'settings'>, @@ -42,6 +43,7 @@ export default function SettingsScreen(props: Props): Node { const browser = useGlobalSelector(state => getGlobalSettings(state).browser); const globalSettings = useGlobalSelector(getGlobalSettings); const markMessagesReadOnScroll = globalSettings.markMessagesReadOnScroll; + const language = useGlobalSelector(state => getGlobalSettings(state).language); const zulipVersion = useSelector(getServerVersion); const identity = useSelector(getIdentity); @@ -99,12 +101,20 @@ export default function SettingsScreen(props: Props): Node { navigation.push('notifications'); }} /> - { - navigation.push('language'); + navigation={navigation} + label="Language" + valueKey={language} + items={languages.map(l => ({ + key: l.tag, + title: { text: '{_}', values: { _: l.selfname } }, + subtitle: { text: '{_}', values: { _: l.name } }, + }))} + onValueChange={value => { + dispatch(setGlobalSettings({ language: value })); }} + search />