import {of, Observable } from 'rxjs'; import { filter, take, switchMap } from 'rxjs/operators'; import { Injectable } from '@angular/core'; import { SDK } from '../../../../../shared/sdk/sdk.interface'; import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; import { SdkService } from '../../../../../shared/sdk/sdk.service'; import { SdkError } from '../../../../../shared/errors/sdkError'; import { Locale } from '../interfaces/locale.interface'; @Injectable() export class LocalesApiService { _defaultLang = 'en_US'; lang: string = this._defaultLang; get sdk (): Observable { return this.fbService.sdk .pipe( filter((FB: SDK) => Boolean(FB)), take(1) ); } _locales: Array; locales$ = this.sdk .pipe( switchMap((FB: SDK) => { if (this._locales) { return of(this._locales); } return Observable.create((observer) => { FB.api(`/search`, { type: 'adlocale', limit: 500, locale: this.lang }, (response) => { if (response.error) { observer.error(new SdkError(response.error)); } else { observer.next(response.data); observer.complete(); } }); }); }) ); constructor (private fbService: SdkService, private translateService: TranslateService) { this.translateService.onLangChange.subscribe((event: LangChangeEvent) => { this.lang = event.lang; }); this.locales$ .pipe( take(1) ) .subscribe((locales: Array) => this._locales = locales); } }