diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/constants.ts new file mode 100644 index 0000000000..751657e83d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/constants.ts @@ -0,0 +1,2 @@ +export const UMB_USER_CONFIG_REPOSITORY_ALIAS = 'Umb.Repository.User.Config'; +export const UMB_USER_CONFIG_STORE_ALIAS = 'Umb.Store.User.Config'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/index.ts new file mode 100644 index 0000000000..c848c34591 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/index.ts @@ -0,0 +1,2 @@ +export * from './constants.js'; +export * from './user-config.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/manifests.ts new file mode 100644 index 0000000000..0477378456 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/manifests.ts @@ -0,0 +1,18 @@ +import { UMB_USER_CONFIG_REPOSITORY_ALIAS, UMB_USER_CONFIG_STORE_ALIAS } from './constants.js'; +import type { ManifestRepository, ManifestStore, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const store: ManifestStore = { + type: 'store', + alias: UMB_USER_CONFIG_STORE_ALIAS, + name: 'User Config Store', + api: () => import('./user-config.store.js'), +}; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_USER_CONFIG_REPOSITORY_ALIAS, + name: 'User Config Repository', + api: () => import('./user-config.repository.js'), +}; + +export const manifests: Array = [repository, store]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.repository.ts new file mode 100644 index 0000000000..406b3936f5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.repository.ts @@ -0,0 +1,52 @@ +import type { UmbUserConfigurationModel } from '../../types.js'; +import { UmbUserConfigServerDataSource } from './user-config.server.data-source.js'; +import { UMB_USER_CONFIG_STORE_CONTEXT } from './user-config.store.token.js'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { Observable } from '@umbraco-cms/backoffice/observable-api'; + +export class UmbUserConfigRepository extends UmbRepositoryBase implements UmbApi { + #dataStore?: typeof UMB_USER_CONFIG_STORE_CONTEXT.TYPE; + #dataSource = new UmbUserConfigServerDataSource(this); + + constructor(host: UmbControllerHost) { + super(host); + this.consumeContext(UMB_USER_CONFIG_STORE_CONTEXT, (store) => { + this.#dataStore = store; + this.#init(); + }); + } + + async #init() { + const { data } = await this.#dataSource.getUserConfig(); + + if (data) { + this.#dataStore?.update(data); + } + } + + /** + * Subscribe to the entire user configuration. + */ + all() { + if (!this.#dataStore) { + throw new Error('Data store not initialized'); + } + + return this.#dataStore.all(); + } + + /** + * Subscribe to a part of the user configuration. + */ + part(part: Part): Observable { + if (!this.#dataStore) { + throw new Error('Data store not initialized'); + } + + return this.#dataStore.part(part); + } +} + +export default UmbUserConfigRepository; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.server.data-source.ts new file mode 100644 index 0000000000..a85a0f3311 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.server.data-source.ts @@ -0,0 +1,19 @@ +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +export class UmbUserConfigServerDataSource { + #host; + + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Get the user configuration. + * @memberof UmbUserConfigServerDataSource + */ + getUserConfig() { + return tryExecuteAndNotify(this.#host, UserService.getUserConfiguration()); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.store.token.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.store.token.ts new file mode 100644 index 0000000000..44a4f281fb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.store.token.ts @@ -0,0 +1,4 @@ +import type { UmbUserConfigStore } from './user-config.store.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_USER_CONFIG_STORE_CONTEXT = new UmbContextToken('UmbUserConfigStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.store.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.store.ts new file mode 100644 index 0000000000..0a7a65c45c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/config/user-config.store.ts @@ -0,0 +1,12 @@ +import type { UmbUserConfigurationModel } from '../../types.js'; +import { UMB_USER_CONFIG_STORE_CONTEXT } from './user-config.store.token.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbStoreObjectBase } from '@umbraco-cms/backoffice/store'; + +export class UmbUserConfigStore extends UmbStoreObjectBase { + constructor(host: UmbControllerHost) { + super(host, UMB_USER_CONFIG_STORE_CONTEXT.toString()); + } +} + +export default UmbUserConfigStore; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/manifests.ts index d85871ebf3..d4a39f20e3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/manifests.ts @@ -1,5 +1,6 @@ import { manifests as avatarManifests } from './avatar/manifests.js'; import { manifests as changePasswordManifests } from './change-password/manifests.js'; +import { manifests as configManifests } from './config/manifests.js'; import { manifests as detailManifests } from './detail/manifests.js'; import { manifests as disableManifests } from './disable/manifests.js'; import { manifests as enableManifests } from './enable/manifests.js'; @@ -12,6 +13,7 @@ export const manifests: Array = [ ...itemManifests, ...avatarManifests, ...changePasswordManifests, + ...configManifests, ...disableManifests, ...enableManifests, ...unlockManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts index 35be2ba1ec..b092e1b3e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts @@ -1,6 +1,10 @@ import type { UmbUserEntityType } from './entity.js'; import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; -import { UserStateModel, type UserTwoFactorProviderModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { + type UserConfigurationResponseModel, + UserStateModel, + type UserTwoFactorProviderModel, +} from '@umbraco-cms/backoffice/external/backend-api'; export type UmbUserStateEnum = UserStateModel; export const UmbUserStateEnum = UserStateModel; @@ -32,3 +36,5 @@ export interface UmbUserStartNodesModel { } export type UmbUserMfaProviderModel = UserTwoFactorProviderModel; + +export type UmbUserConfigurationModel = UserConfigurationResponseModel;