@itwin/presentation-frontend
Version:
Frontend of iModel.js Presentation library
171 lines • 6.75 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Core
*/
import { IModelApp } from "@itwin/core-frontend";
import { PresentationError, PresentationStatus } from "@itwin/presentation-common";
import { FavoritePropertiesManager } from "./favorite-properties/FavoritePropertiesManager";
import { createFavoritePropertiesStorage, DefaultFavoritePropertiesStorageTypes } from "./favorite-properties/FavoritePropertiesStorage";
import { FrontendLocalizationHelper } from "./LocalizationHelper";
import { PresentationManager } from "./PresentationManager";
import { SelectionManager } from "./selection/SelectionManager";
import { SelectionScopesManager } from "./selection/SelectionScopesManager";
let localization;
let presentationManager;
let selectionManager;
let favoritePropertiesManager;
const initializationHandlers = [];
const terminationHandlers = [];
/**
* Static class used to statically set up Presentation library for the frontend.
* Basically what it does is:
* - Create a singleton [[PresentationManager]] instance
* - Create a singleton [[SelectionManager]] instance
* - Create a singleton [[FavoritePropertiesManager]]] instance
*
* @public
*/
export class Presentation {
/* istanbul ignore next */
constructor() { }
/**
* Initializes Presentation library for the frontend.
*
* Example:
* ``` ts
* [[include:Presentation.Frontend.Initialization]]
* ```
*
* The method should be called after a call to [IModelApp.startup]($core-frontend).
*/
static async initialize(props) {
if (!IModelApp.initialized) {
throw new PresentationError(PresentationStatus.NotInitialized, "IModelApp.startup must be called before calling Presentation.initialize");
}
if (!localization) {
localization = IModelApp.localization;
}
if (!presentationManager) {
const managerProps = props?.presentation ?? {};
if (!managerProps.activeLocale) {
const languages = Presentation.localization.getLanguageList();
managerProps.activeLocale = languages.length ? languages[0] : undefined;
}
presentationManager = PresentationManager.create(managerProps);
}
if (!selectionManager) {
selectionManager = new SelectionManager({
...props?.selection,
scopes: props?.selection?.scopes ??
new SelectionScopesManager({
rpcRequestsHandler: presentationManager.rpcRequestsHandler,
localeProvider: () => this.presentation.activeLocale,
}),
});
}
if (!favoritePropertiesManager) {
favoritePropertiesManager = new FavoritePropertiesManager({
storage: props?.favorites ? props.favorites.storage : createFavoritePropertiesStorage(DefaultFavoritePropertiesStorageTypes.Noop),
});
}
presentationManager.startIModelInitialization = (imodel) => favoritePropertiesManager?.startConnectionInitialization(imodel);
presentationManager.ensureIModelInitialized = async (imodel) => favoritePropertiesManager?.ensureInitialized(imodel);
await FrontendLocalizationHelper.registerNamespaces();
for (const handler of initializationHandlers) {
const cleanup = await handler();
if (cleanup) {
terminationHandlers.push(cleanup);
}
}
}
/**
* Terminates Presentation library frontend. This method should be called
* before a call to [IModelApp.shutdown]($core-frontend)
*/
static terminate() {
terminationHandlers.forEach((handler) => handler());
terminationHandlers.length = 0;
if (localization) {
FrontendLocalizationHelper.unregisterNamespaces();
}
if (presentationManager) {
presentationManager.dispose();
}
presentationManager = undefined;
if (favoritePropertiesManager) {
favoritePropertiesManager.dispose();
}
favoritePropertiesManager = undefined;
if (selectionManager) {
selectionManager.dispose();
}
selectionManager = undefined;
localization = undefined;
}
/**
* Registers an additional handler which will be invoked during Presentation library frontend
* initialization.
*/
static registerInitializationHandler(handler) {
initializationHandlers.push(handler);
}
/** The singleton [[PresentationManager]] */
static get presentation() {
if (!presentationManager) {
throw new Error("Presentation must be first initialized by calling Presentation.initialize");
}
return presentationManager;
}
/** @internal */
static setPresentationManager(value) {
if (presentationManager) {
presentationManager.dispose();
}
presentationManager = value;
}
/** The singleton [[SelectionManager]] */
static get selection() {
if (!selectionManager) {
throw new Error("Presentation must be first initialized by calling Presentation.initialize");
}
return selectionManager;
}
/** @internal */
static setSelectionManager(value) {
selectionManager = value;
}
/**
* The singleton [[FavoritePropertiesManager]]
* @public
*/
static get favoriteProperties() {
if (!favoritePropertiesManager) {
throw new Error("Favorite Properties must be first initialized by calling Presentation.initialize");
}
return favoritePropertiesManager;
}
/** @internal */
static setFavoritePropertiesManager(value) {
if (favoritePropertiesManager) {
favoritePropertiesManager.dispose();
}
favoritePropertiesManager = value;
}
/**
* The localization manager used by Presentation frontend. Returns the result of `IModelApp.i18n`.
*/
static get localization() {
if (!localization) {
throw new Error("Presentation must be first initialized by calling Presentation.initialize");
}
return localization;
}
/** @internal */
static setLocalization(value) {
localization = value;
}
}
//# sourceMappingURL=Presentation.js.map