diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts index 6d6de92b73..76940d7d5a 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts @@ -1,12 +1,13 @@ -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { tryExecute } from '@umbraco-cms/backoffice/resources'; +import { ServerService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbBasicState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; -import { - type UmbExtensionManifestInitializer, - UmbExtensionsManifestInitializer, -} from '@umbraco-cms/backoffice/extension-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import { UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestSection } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { type ManifestSection, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbExtensionManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; export class UmbBackofficeContext extends UmbContextBase { #activeSectionAlias = new UmbStringState(undefined); @@ -16,11 +17,32 @@ export class UmbBackofficeContext extends UmbContextBase { #allowedSections = new UmbBasicState>>([]); public readonly allowedSections = this.#allowedSections.asObservable(); + #verison = new UmbStringState(undefined); + public readonly version = this.#verison.asObservable(); + constructor(host: UmbControllerHost) { super(host, UMB_BACKOFFICE_CONTEXT); new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'section', null, (sections) => { this.#allowedSections.setValue([...sections]); }); + + this.#getVersion(); + } + + async #getVersion() { + const { data } = await tryExecute(ServerService.getServerInformation()); + if (!data) return; + + // A quick semver parser (to remove the unwanted bits) [LK] + // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [semVer, major, minor, patch, prerelease, buildmetadata] = + data.version.match( + /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/, + ) ?? []; + + const version = [major, minor, patch].join('.') + (prerelease ? `-${prerelease}` : ''); + this.#verison.setValue(version); } public setActiveSectionAlias(alias: string) {