@itwin/presentation-frontend
Version:
Frontend of iModel.js Presentation library
161 lines • 7.16 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
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Presentation = void 0;
const core_frontend_1 = require("@itwin/core-frontend");
const presentation_common_1 = require("@itwin/presentation-common");
const FavoritePropertiesManager_js_1 = require("./favorite-properties/FavoritePropertiesManager.js");
const FavoritePropertiesStorage_js_1 = require("./favorite-properties/FavoritePropertiesStorage.js");
const LocalizationHelper_js_1 = require("./LocalizationHelper.js");
const PresentationManager_js_1 = require("./PresentationManager.js");
const SelectionManager_js_1 = require("./selection/SelectionManager.js");
const SelectionScopesManager_js_1 = require("./selection/SelectionScopesManager.js");
const IModelConnectionInitialization_js_1 = require("./IModelConnectionInitialization.js");
const InternalSymbols_js_1 = require("./InternalSymbols.js");
let localization;
let presentationManager;
let selectionManager; // eslint-disable-line @typescript-eslint/no-deprecated
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
*/
class Presentation {
/* c8 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 (!core_frontend_1.IModelApp.initialized) {
throw new presentation_common_1.PresentationError(presentation_common_1.PresentationStatus.NotInitialized, "IModelApp.startup must be called before calling Presentation.initialize");
}
if (!localization) {
localization = core_frontend_1.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_js_1.PresentationManager.create(managerProps);
}
if (!selectionManager) {
/* eslint-disable @typescript-eslint/no-deprecated */
selectionManager = new SelectionManager_js_1.SelectionManager({
...props?.selection,
scopes: props?.selection?.scopes ??
new SelectionScopesManager_js_1.SelectionScopesManager({
rpcRequestsHandler: presentationManager[InternalSymbols_js_1._presentation_manager_rpcRequestsHandler],
localeProvider: () => this.presentation.activeLocale,
}),
});
/* eslint-enable @typescript-eslint/no-deprecated */
}
if (!favoritePropertiesManager) {
favoritePropertiesManager = new FavoritePropertiesManager_js_1.FavoritePropertiesManager({
storage: props?.favorites ? props.favorites.storage : (0, FavoritePropertiesStorage_js_1.createFavoritePropertiesStorage)(FavoritePropertiesStorage_js_1.DefaultFavoritePropertiesStorageTypes.Noop),
});
}
await LocalizationHelper_js_1.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;
IModelConnectionInitialization_js_1.imodelInitializationHandlers.clear();
if (localization) {
LocalizationHelper_js_1.FrontendLocalizationHelper.unregisterNamespaces();
}
if (presentationManager) {
presentationManager[Symbol.dispose]();
}
presentationManager = undefined;
if (favoritePropertiesManager) {
favoritePropertiesManager[Symbol.dispose]();
}
favoritePropertiesManager = undefined;
if (selectionManager) {
selectionManager[Symbol.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;
}
/**
* The singleton [[SelectionManager]].
*
* @deprecated in 5.0 - will not be removed until after 2026-06-13. The whole unified selection system in this package is deprecated in favor of the new
* [@itwin/unified-selection](https://github.com/iTwin/presentation/blob/master/packages/unified-selection/README.md) package.
*/
// eslint-disable-next-line @typescript-eslint/no-deprecated
static get selection() {
if (!selectionManager) {
throw new Error("Presentation must be first initialized by calling Presentation.initialize");
}
return selectionManager;
}
/**
* The singleton [[FavoritePropertiesManager]]
*/
static get favoriteProperties() {
if (!favoritePropertiesManager) {
throw new Error("Favorite Properties must be first initialized by calling Presentation.initialize");
}
return favoritePropertiesManager;
}
/**
* 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;
}
}
exports.Presentation = Presentation;
//# sourceMappingURL=Presentation.js.map