core-app-api: AppLanguageSelector tweaks to allow creation without storage
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
+3
-3
@@ -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,
|
||||
});
|
||||
|
||||
|
||||
+14
-13
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user