{"version":3,"file":"jsverse-transloco-persist-lang.mjs","sources":["../../../../libs/transloco-persist-lang/src/lib/persist-lang.config.ts","../../../../libs/transloco-persist-lang/src/lib/persist-lang.service.ts","../../../../libs/transloco-persist-lang/src/lib/cookie-storage.ts","../../../../libs/transloco-persist-lang/src/lib/persist-lang.providers.ts","../../../../libs/transloco-persist-lang/src/jsverse-transloco-persist-lang.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nimport { PersistStorage } from './persist-lang.types';\n\nexport interface GetLangParams {\n  cachedLang: string | null;\n  browserLang?: string;\n  cultureLang: string;\n  defaultLang: string;\n}\n\nexport interface PersistLangConfig {\n  storageKey?: string;\n  getLangFn?(langs: GetLangParams): string;\n}\n\nexport const TRANSLOCO_PERSIST_LANG_STORAGE =\n  new InjectionToken<PersistStorage>('TRANSLOCO_PERSIST_LANG_STORAGE');\n\nexport const TRANSLOCO_PERSIST_LANG_CONFIG =\n  new InjectionToken<PersistLangConfig>('TRANSLOCO_PERSIST_LANG_CONFIG');\n","import {\n  getBrowserCultureLang,\n  getBrowserLang,\n  isBrowser,\n  TranslocoService,\n} from '@jsverse/transloco';\nimport { isFunction } from '@jsverse/utils';\nimport { Subscription } from 'rxjs';\nimport { skip } from 'rxjs/operators';\nimport { inject, Injectable, OnDestroy } from '@angular/core';\n\nimport {\n  TRANSLOCO_PERSIST_LANG_CONFIG,\n  TRANSLOCO_PERSIST_LANG_STORAGE,\n} from './persist-lang.config';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslocoPersistLangService implements OnDestroy {\n  private service = inject(TranslocoService);\n  private storage = inject(TRANSLOCO_PERSIST_LANG_STORAGE);\n  private config = inject(TRANSLOCO_PERSIST_LANG_CONFIG);\n\n  private subscription: Subscription | null = null;\n  private storageKey = this.config.storageKey || 'translocoLang';\n\n  constructor() {\n    if (isBrowser()) {\n      this.init();\n    }\n  }\n\n  getCachedLang(): string | null {\n    return isBrowser() ? this.storage.getItem(this.storageKey) : null;\n  }\n\n  clear() {\n    isBrowser() && this.storage.removeItem(this.storageKey);\n  }\n\n  private updateStorageOnLangChange(): Subscription {\n    return this.service.langChanges$.pipe(skip(1)).subscribe((lang) => {\n      this.save(lang);\n    });\n  }\n\n  private init() {\n    // We need to first set the cached lang and then listen to changes\n    this.setActiveLang();\n    this.subscription?.unsubscribe();\n    this.subscription = this.updateStorageOnLangChange();\n  }\n\n  private setActiveLang() {\n    const cachedLang = this.storage.getItem(this.storageKey);\n    const defaultLang = this.service.config.defaultLang;\n    let activeLang = cachedLang || defaultLang;\n\n    if (isFunction(this.config.getLangFn)) {\n      const browserLang = getBrowserLang();\n      const cultureLang = getBrowserCultureLang();\n      activeLang = this.config.getLangFn({\n        browserLang,\n        defaultLang,\n        cultureLang,\n        cachedLang,\n      });\n    }\n\n    if (activeLang) {\n      this.service.setActiveLang(activeLang);\n    }\n  }\n\n  private save(lang: string) {\n    if (!this.service.config.prodMode) {\n      console.log(\n        `%c 🍻 Saving ${lang} to storage`,\n        'background: #fff; color: #2196F3;',\n      );\n    }\n    this.storage.setItem(this.storageKey, lang);\n  }\n\n  ngOnDestroy() {\n    this.subscription?.unsubscribe();\n    // Caretaker note: it's important to clean up references to subscriptions since they save the `next`\n    // callback within its `destination` property, preventing classes from being GC'd.\n    this.subscription = null;\n  }\n}\n","import { PersistStorage } from './persist-lang.types';\n\nconst millisecondsInHour = 3_600_000;\nconst hoursInMonth = 720;\n\nexport function cookiesStorage(cookieExpiry = hoursInMonth): PersistStorage {\n  return {\n    getItem(key: string) {\n      const name = encodeURIComponent(key);\n      const regexp = new RegExp(\n        '(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)',\n        'g',\n      );\n      const result = regexp.exec(document.cookie);\n\n      return result ? decodeURIComponent(result[1]) : null;\n    },\n    setItem(key: string, value: string) {\n      const name = encodeURIComponent(key);\n      const date = new Date();\n      date.setTime(date.getTime() + cookieExpiry * millisecondsInHour);\n      document.cookie = `${name}=${encodeURIComponent(\n        value,\n      )};expires=${date.toUTCString()};path=/`;\n    },\n    // eslint-disable-next-line  @typescript-eslint/no-empty-function\n    removeItem(): void {},\n  };\n}\n","import {\n  APP_INITIALIZER,\n  ClassProvider,\n  ExistingProvider,\n  FactoryProvider,\n  makeEnvironmentProviders,\n  ValueProvider,\n} from '@angular/core';\n\nimport {\n  PersistLangConfig,\n  TRANSLOCO_PERSIST_LANG_CONFIG,\n  TRANSLOCO_PERSIST_LANG_STORAGE,\n} from './persist-lang.config';\nimport { TranslocoPersistLangService } from './persist-lang.service';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n\ntype providerValue =\n  | Pick<ValueProvider, 'useValue'>\n  | Pick<ClassProvider, 'useClass'>\n  | Pick<ExistingProvider, 'useExisting'>\n  | Pick<FactoryProvider, 'useFactory' | 'deps'>;\nexport function provideTranslocoPersistLang({\n  storage,\n  ...config\n}: PersistLangConfig & { storage: providerValue }) {\n  return makeEnvironmentProviders([\n    {\n      provide: TRANSLOCO_PERSIST_LANG_CONFIG,\n      useValue: config ?? {},\n    },\n    // Initialize the service\n    {\n      provide: APP_INITIALIZER,\n      useFactory: () => noop,\n      multi: true,\n      deps: [TranslocoPersistLangService],\n    },\n    {\n      provide: TRANSLOCO_PERSIST_LANG_STORAGE,\n      ...storage,\n    },\n  ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}