diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts index 96a1ac29cb..59ffb63a12 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts @@ -1,4 +1,5 @@ export * from './store-base.js'; +export * from './store-object-base.js'; export * from './store.interface.js'; export * from './events/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/store-object-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/store-object-base.ts new file mode 100644 index 0000000000..4039da4a12 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/store-object-base.ts @@ -0,0 +1,60 @@ +import { UmbStoreUpdateEvent } from './events/index.js'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import { type Observable, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +/** + * The base class for a store that holds an object. + */ +export class UmbStoreObjectBase extends UmbContextBase implements UmbApi { + protected _data: UmbObjectState; + + constructor(host: UmbControllerHost, storeAlias: string, initialData?: T) { + super(host, storeAlias); + this._data = new UmbObjectState(initialData ?? ({} as T)); + } + + /** + * Updates the store with the given data + * @param data - The (partial) data to update the store with + * @memberof UmbStoreObjectBase + */ + update(data: Partial) { + this._data.update(data); + this.dispatchEvent(new UmbStoreUpdateEvent([])); + } + + /** + * Returns the current state of the store + * @memberof UmbStoreObjectBase + */ + getState(): T { + return this._data.getValue(); + } + + /** + * Returns an observable of the store + * @memberof UmbStoreObjectBase + */ + all() { + return this._data.asObservable(); + } + + /** + * Returns an observable of a part of the store + * @param key - The key of the part to return + * @memberof UmbStoreObjectBase + */ + part(key: Part): Observable { + return this._data.asObservablePart((data) => data[key]); + } + + /** + * Destroys the store + * @memberof UmbStoreObjectBase + */ + override destroy() { + this._data.destroy(); + } +}