core-app-api: AppLanguageSelector tweaks to allow creation without storage

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2023-09-14 17:23:01 +02:00
parent 207f17acea
commit 7bb7a0fa1d
2 changed files with 17 additions and 16 deletions
@@ -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,
});
@@ -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,
});
}