Add a little more safety
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
import {test, expect} from '@jest/globals'
|
||||
|
||||
import {sanitizeAppLanguageSetting} from '#/locale/helpers'
|
||||
import {AppLanguage} from '#/locale/languages'
|
||||
|
||||
test('sanitizeAppLanguageSetting', () => {
|
||||
expect(sanitizeAppLanguageSetting('en')).toBe(AppLanguage.en)
|
||||
expect(sanitizeAppLanguageSetting('hi')).toBe(AppLanguage.hi)
|
||||
expect(sanitizeAppLanguageSetting('foo')).toBe(AppLanguage.en)
|
||||
expect(sanitizeAppLanguageSetting('en,fr')).toBe(AppLanguage.en)
|
||||
expect(sanitizeAppLanguageSetting('fr,en')).toBe(AppLanguage.en)
|
||||
})
|
||||
@@ -100,9 +100,7 @@ export function getTranslatorLink(text: string, lang: string): string {
|
||||
* and selects a new option, at which point we'll re-save their choice, which
|
||||
* should then be a valid option.
|
||||
*/
|
||||
export function sanitizeAppLanguageSetting(
|
||||
appLanguage: AppLanguage | string,
|
||||
): AppLanguage {
|
||||
export function sanitizeAppLanguageSetting(appLanguage: string): AppLanguage {
|
||||
const langs = appLanguage.split(',').filter(Boolean)
|
||||
|
||||
for (const lang of langs) {
|
||||
|
||||
@@ -10,13 +10,13 @@ export enum AppLanguage {
|
||||
}
|
||||
|
||||
interface AppLanguageConfig {
|
||||
code2: string
|
||||
code2: AppLanguage
|
||||
name: string
|
||||
}
|
||||
|
||||
export const APP_LANGUAGES: AppLanguageConfig[] = [
|
||||
{code2: 'en', name: 'English'},
|
||||
{code2: 'hi', name: 'हिंदी'},
|
||||
{code2: AppLanguage.en, name: 'English'},
|
||||
{code2: AppLanguage.hi, name: 'हिंदी'},
|
||||
]
|
||||
|
||||
export const LANGUAGES: Language[] = [
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import React from 'react'
|
||||
import * as persisted from '#/state/persisted'
|
||||
import {AppLanguage} from '#/locale/languages'
|
||||
|
||||
type SetStateCb = (
|
||||
s: persisted.Schema['languagePrefs'],
|
||||
@@ -11,7 +12,7 @@ type ApiContext = {
|
||||
toggleContentLanguage: (code2: string) => void
|
||||
togglePostLanguage: (code2: string) => void
|
||||
savePostLanguageToHistory: () => void
|
||||
setAppLanguage: (code2: string) => void
|
||||
setAppLanguage: (code2: AppLanguage) => void
|
||||
}
|
||||
|
||||
const stateContext = React.createContext<StateContext>(
|
||||
@@ -23,7 +24,7 @@ const apiContext = React.createContext<ApiContext>({
|
||||
toggleContentLanguage: (_: string) => {},
|
||||
togglePostLanguage: (_: string) => {},
|
||||
savePostLanguageToHistory: () => {},
|
||||
setAppLanguage: (_: string) => {},
|
||||
setAppLanguage: (_: AppLanguage) => {},
|
||||
})
|
||||
|
||||
export function Provider({children}: React.PropsWithChildren<{}>) {
|
||||
@@ -106,7 +107,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
|
||||
.slice(0, 6),
|
||||
}))
|
||||
},
|
||||
setAppLanguage(code2: string) {
|
||||
setAppLanguage(code2: AppLanguage) {
|
||||
setStateWrapped(s => ({...s, appLanguage: code2}))
|
||||
},
|
||||
}),
|
||||
|
||||
@@ -61,7 +61,7 @@ export function LanguageSettingsScreen(_props: Props) {
|
||||
(value: Parameters<PickerSelectProps['onValueChange']>[0]) => {
|
||||
if (!value) return
|
||||
if (langPrefs.appLanguage !== value) {
|
||||
setLangPrefs.setAppLanguage(value)
|
||||
setLangPrefs.setAppLanguage(sanitizeAppLanguageSetting(value))
|
||||
}
|
||||
},
|
||||
[langPrefs, setLangPrefs],
|
||||
|
||||
Reference in New Issue
Block a user