{"version":3,"file":"app-language.context-Berbuaa0.js","sources":["../../../src/packages/language/global-contexts/app-language.context.ts"],"sourcesContent":["import { UmbLanguageCollectionRepository } from '../collection/index.js';\r\nimport type { UmbLanguageDetailModel } from '../types.js';\r\nimport { UMB_APP_LANGUAGE_CONTEXT } from './app-language.context-token.js';\r\nimport { UmbArrayState, UmbObjectState, createObservablePart } from '@umbraco-cms/backoffice/observable-api';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { UmbContextBase } from '@umbraco-cms/backoffice/class-api';\r\nimport type { UmbApi } from '@umbraco-cms/backoffice/extension-api';\r\nimport { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';\r\nimport { UmbReadOnlyStateManager } from '@umbraco-cms/backoffice/utils';\r\nimport { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user';\r\n\r\n// TODO: Make a store for the App Languages.\r\n// TODO: Implement default language end-point, in progress at backend team, so we can avoid getting all languages.\r\nexport class UmbAppLanguageContext extends UmbContextBase implements UmbApi {\r\n\t#languages = new UmbArrayState([], (x) => x.unique);\r\n\r\n\t#appLanguage = new UmbObjectState(undefined);\r\n\tpublic readonly appLanguage = this.#appLanguage.asObservable();\r\n\tpublic readonly appLanguageCulture = this.#appLanguage.asObservablePart((x) => x?.unique);\r\n\r\n\tpublic readonly appLanguageReadOnlyState = new UmbReadOnlyStateManager(this);\r\n\r\n\tpublic readonly appDefaultLanguage = createObservablePart(this.#languages.asObservable(), (languages) =>\r\n\t\tlanguages.find((language) => language.isDefault),\r\n\t);\r\n\r\n\tpublic readonly moreThanOneLanguage = this.#languages.asObservablePart((x) => x.length > 1);\r\n\r\n\t#languageCollectionRepository = new UmbLanguageCollectionRepository(this);\r\n\t#currentUserAllowedLanguages: Array = [];\r\n\t#currentUserHasAccessToAllLanguages = false;\r\n\r\n\t#readOnlyStateIdentifier = 'UMB_LANGUAGE_PERMISSION_';\r\n\t#localStorageKey = 'umb:appLanguage';\r\n\r\n\tconstructor(host: UmbControllerHost) {\r\n\t\tsuper(host, UMB_APP_LANGUAGE_CONTEXT);\r\n\r\n\t\t// TODO: We need to ensure this request is called every time the user logs in, but this should be done somewhere across the app and not here [JOV]\r\n\t\tthis.consumeContext(UMB_AUTH_CONTEXT, (authContext) => {\r\n\t\t\tthis.observe(authContext.isAuthorized, (isAuthorized) => {\r\n\t\t\t\tif (!isAuthorized) return;\r\n\t\t\t\tthis.#observeLanguages();\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tthis.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => {\r\n\t\t\tthis.observe(context.languages, (languages) => {\r\n\t\t\t\tthis.#currentUserAllowedLanguages = languages || [];\r\n\t\t\t\tthis.#setIsReadOnly();\r\n\t\t\t});\r\n\r\n\t\t\tthis.observe(context.hasAccessToAllLanguages, (hasAccessToAllLanguages) => {\r\n\t\t\t\tthis.#currentUserHasAccessToAllLanguages = hasAccessToAllLanguages || false;\r\n\t\t\t\tthis.#setIsReadOnly();\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tgetAppCulture() {\r\n\t\treturn this.#appLanguage.getValue()?.unique;\r\n\t}\r\n\r\n\tsetLanguage(unique: string) {\r\n\t\t// clear the previous read-only state\r\n\t\tconst appLanguage = this.#appLanguage.getValue();\r\n\t\tif (appLanguage?.unique) {\r\n\t\t\tthis.appLanguageReadOnlyState.removeState(this.#readOnlyStateIdentifier + appLanguage.unique);\r\n\t\t}\r\n\r\n\t\t// find the language\r\n\t\tconst language = this.#findLanguage(unique);\r\n\r\n\t\tif (!language) {\r\n\t\t\tthrow new Error(`Language with unique ${unique} not found`);\r\n\t\t}\r\n\r\n\t\t// set the new language\r\n\t\tthis.#appLanguage.update(language);\r\n\r\n\t\t// store the new language in local storage\r\n\t\tlocalStorage.setItem(this.#localStorageKey, language?.unique);\r\n\r\n\t\t// set the new read-only state\r\n\t\tthis.#setIsReadOnly();\r\n\t}\r\n\r\n\tasync #observeLanguages() {\r\n\t\tconst { data } = await this.#languageCollectionRepository.requestCollection({});\r\n\r\n\t\t// TODO: make this observable / update when languages are added/removed/updated\r\n\t\tif (data) {\r\n\t\t\tthis.#languages.setValue(data.items);\r\n\r\n\t\t\t// If the app language is not set, set it to the default language\r\n\t\t\tif (!this.#appLanguage.getValue()) {\r\n\t\t\t\tthis.#initAppLanguage();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t#initAppLanguage() {\r\n\t\t// get the selected language from local storage\r\n\t\tconst uniqueFromLocalStorage = localStorage.getItem(this.#localStorageKey);\r\n\r\n\t\tif (uniqueFromLocalStorage) {\r\n\t\t\tconst language = this.#findLanguage(uniqueFromLocalStorage);\r\n\t\t\tif (language) {\r\n\t\t\t\tthis.setLanguage(language.unique);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst defaultLanguage = this.#languages.getValue().find((x) => x.isDefault);\r\n\t\t// TODO: do we always have a default language?\r\n\t\t// do we always get the default language on the first request, or could it be on page 2?\r\n\t\t// in that case do we then need an endpoint to get the default language?\r\n\t\tif (!defaultLanguage?.unique) return;\r\n\t\tthis.setLanguage(defaultLanguage.unique);\r\n\t}\r\n\r\n\t#findLanguage(unique: string) {\r\n\t\treturn this.#languages.getValue().find((x) => x.unique === unique);\r\n\t}\r\n\r\n\t#setIsReadOnly() {\r\n\t\tconst appLanguage = this.#appLanguage.getValue();\r\n\r\n\t\tif (!appLanguage) {\r\n\t\t\tthis.appLanguageReadOnlyState.clear();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst unique = this.#readOnlyStateIdentifier + appLanguage.unique;\r\n\t\tthis.appLanguageReadOnlyState.removeState(unique);\r\n\r\n\t\tif (this.#currentUserHasAccessToAllLanguages) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst isReadOnly = !this.#currentUserAllowedLanguages.includes(appLanguage.unique);\r\n\r\n\t\tif (isReadOnly) {\r\n\t\t\tconst readOnlyState = {\r\n\t\t\t\tunique,\r\n\t\t\t\tmessage: 'You do not have permission to edit to this culture',\r\n\t\t\t};\r\n\r\n\t\t\tthis.appLanguageReadOnlyState.addState(readOnlyState);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// Default export to enable this as a globalContext extension js:\r\nexport default UmbAppLanguageContext;\r\n"],"names":["UmbAppLanguageContext","UmbContextBase","host","UMB_APP_LANGUAGE_CONTEXT","#languages","UmbArrayState","x","#appLanguage","UmbObjectState","UmbReadOnlyStateManager","createObservablePart","languages","language","#languageCollectionRepository","UmbLanguageCollectionRepository","#currentUserAllowedLanguages","#currentUserHasAccessToAllLanguages","#readOnlyStateIdentifier","#localStorageKey","UMB_AUTH_CONTEXT","authContext","isAuthorized","#observeLanguages","UMB_CURRENT_USER_CONTEXT","context","#setIsReadOnly","hasAccessToAllLanguages","unique","appLanguage","#findLanguage","data","#initAppLanguage","uniqueFromLocalStorage","defaultLanguage","readOnlyState"],"mappings":"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"}