diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts new file mode 100644 index 0000000000..98e97a3082 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts @@ -0,0 +1,47 @@ +import { UmbPackageStore, UMB_PACKAGE_STORE_TOKEN } from './package.store'; +import { UmbPackageServerDataSource } from './sources/package.server.data'; +import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { UmbContextConsumerController } from '@umbraco-cms/context-api'; + +/** + * A repository for Packages which mimicks a tree store. + * @export + */ +export class UmbPackageRepository { + #init!: Promise; + #packageStore?: UmbPackageStore; + #packageSource: UmbPackageServerDataSource; + + constructor(host: UmbControllerHostInterface) { + this.#packageSource = new UmbPackageServerDataSource(host); + this.#init = new Promise((res) => { + new UmbContextConsumerController(host, UMB_PACKAGE_STORE_TOKEN, (instance) => { + this.#packageStore = instance; + this.#requestRootItems(instance); + res(); + }); + }); + } + + /** + * Request the root items from the Data Source + * @memberOf UmbPackageRepository + * @private + */ + async #requestRootItems(store: UmbPackageStore) { + const { data } = await this.#packageSource.getRootItems(); + + if (data) { + store.appendItems(data.items); + } + } + + /** + * Observable of root items + * @memberOf UmbPackageRepository + */ + async rootItems() { + await this.#init; + return this.#packageStore!.rootItems; + } +}