From 7bb7a0fa1d309b9c68dc0d37dbf60db41a15a770 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 14 Sep 2023 17:23:01 +0200 Subject: [PATCH] core-app-api: AppLanguageSelector tweaks to allow creation without storage Signed-off-by: Patrik Oldsberg --- .../AppLanguageSelector.test.ts | 6 ++--- .../AppLanguageApi/AppLanguageSelector.ts | 27 ++++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.test.ts b/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.test.ts index e24ccee0d2..702d5e642a 100644 --- a/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.test.ts +++ b/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.test.ts @@ -26,7 +26,7 @@ describe('AppLanguageSelector', () => { }); it('should select language', async () => { - const selector = AppLanguageSelector.createWithStorage(baseOptions); + const selector = AppLanguageSelector.create(baseOptions); expect(selector.getAvailableLanguages()).toEqual({ languages: ['en', 'de'], @@ -49,7 +49,7 @@ describe('AppLanguageSelector', () => { it('should return a new array of languages', () => { const languages = ['en', 'de']; - const selector = AppLanguageSelector.createWithStorage({ + const selector = AppLanguageSelector.create({ availableLanguages: languages, }); @@ -65,7 +65,7 @@ describe('AppLanguageSelector', () => { it('should skip duplicates', async () => { const languages = ['en', 'de']; - const selector = AppLanguageSelector.createWithStorage({ + const selector = AppLanguageSelector.create({ availableLanguages: languages, }); diff --git a/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.ts b/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.ts index 17bffdb9ab..9e69554412 100644 --- a/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.ts +++ b/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.ts @@ -25,7 +25,6 @@ const DEFAULT_LANGUAGE = 'en'; /** @alpha */ export interface AppLanguageSelectorOptions { - defaultLanguage?: string; availableLanguages?: string[]; } @@ -35,8 +34,8 @@ export interface AppLanguageSelectorOptions { * @alpha */ export class AppLanguageSelector implements AppLanguageApi { - static createWithStorage(options: AppLanguageSelectorOptions) { - const languages = options.availableLanguages ?? [DEFAULT_LANGUAGE]; + static create(options?: AppLanguageSelectorOptions) { + const languages = options?.availableLanguages ?? [DEFAULT_LANGUAGE]; if (languages.length !== new Set(languages).size) { throw new Error( `Supported languages may not contain duplicates, got '${languages.join( @@ -48,20 +47,22 @@ export class AppLanguageSelector implements AppLanguageApi { throw new Error(`Supported languages must include '${DEFAULT_LANGUAGE}'`); } - let initialLanguage = languages[0]; + return new AppLanguageSelector(languages); + } + + static createWithStorage(options?: AppLanguageSelectorOptions) { + const selector = AppLanguageSelector.create(options); if (!window.localStorage) { - return new AppLanguageSelector(languages, initialLanguage); + return selector; } - const storedLanguage = - window.localStorage.getItem(STORAGE_KEY) ?? undefined; + const storedLanguage = window.localStorage.getItem(STORAGE_KEY); + const { languages } = selector.getAvailableLanguages(); if (storedLanguage && languages.includes(storedLanguage)) { - initialLanguage = storedLanguage; + selector.setLanguage(storedLanguage); } - const selector = new AppLanguageSelector(languages, initialLanguage); - selector.language$().subscribe(({ language }) => { if (language !== window.localStorage.getItem(STORAGE_KEY)) { window.localStorage.setItem(STORAGE_KEY, language); @@ -84,11 +85,11 @@ export class AppLanguageSelector implements AppLanguageApi { #language: string; #subject: BehaviorSubject<{ language: string }>; - private constructor(languages: string[], initialLanguage: string) { + private constructor(languages: string[]) { this.#languages = languages; - this.#language = initialLanguage; + this.#language = languages[0]; this.#subject = new BehaviorSubject<{ language: string }>({ - language: initialLanguage, + language: this.#language, }); }