UNPKG

@itwin/presentation-components

Version:

React components based on iTwin.js Presentation library

133 lines 6.5 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ /* eslint-disable @typescript-eslint/no-deprecated */ Object.defineProperty(exports, "__esModule", { value: true }); exports.useTreeReload = useTreeReload; const react_1 = require("react"); const core_frontend_1 = require("@itwin/core-frontend"); const presentation_frontend_1 = require("@itwin/presentation-frontend"); const Utils_js_1 = require("../../common/Utils.js"); const DataProvider_js_1 = require("../DataProvider.js"); const TreeReloader_js_1 = require("./TreeReloader.js"); /** @internal */ function useTreeReload(params) { useModelSourceUpdateOnIModelHierarchyUpdate(params); useModelSourceUpdateOnRulesetModification(params); useModelSourceUpdateOnRulesetVariablesChange(params); useModelSourceUpdateOnUnitSystemChange(params); useModelSourceUpdateOnBriefcaseUpdate(params); } function useModelSourceUpdateOnBriefcaseUpdate(params) { const { dataProviderProps, ruleset, pageSize, modelSource, onReload, renderedItems } = params; (0, react_1.useEffect)(() => { if (!modelSource || !dataProviderProps.imodel.isBriefcaseConnection()) { return; } let subscription; const reload = () => { /* c8 ignore next */ subscription?.unsubscribe(); subscription = startTreeReload({ dataProviderProps, ruleset, pageSize, modelSource, renderedItems, onReload }); }; const removePullListener = dataProviderProps.imodel.txns.onChangesPulled.addListener(reload); const removePushListener = dataProviderProps.imodel.txns.onChangesPushed.addListener(reload); return () => { removePullListener(); removePushListener(); subscription?.unsubscribe(); }; }, [modelSource, pageSize, dataProviderProps, ruleset, onReload, renderedItems]); } function useModelSourceUpdateOnIModelHierarchyUpdate(params) { const { dataProviderProps, ruleset, pageSize, modelSource, onReload, renderedItems } = params; (0, react_1.useEffect)(() => { if (!modelSource) { return; } let subscription; const removeListener = presentation_frontend_1.Presentation.presentation.onIModelHierarchyChanged.addListener((args) => { if (args.rulesetId !== (0, Utils_js_1.getRulesetId)(ruleset) || args.imodelKey !== dataProviderProps.imodel.key) { return; } /* c8 ignore next */ subscription?.unsubscribe(); subscription = startTreeReload({ dataProviderProps, ruleset, pageSize, modelSource, renderedItems, onReload }); }); return () => { removeListener(); subscription?.unsubscribe(); }; }, [modelSource, pageSize, dataProviderProps, ruleset, onReload, renderedItems]); } function useModelSourceUpdateOnRulesetModification(params) { const { dataProviderProps, ruleset, pageSize, modelSource, onReload, renderedItems } = params; (0, react_1.useEffect)(() => { if (!modelSource) { return; } let subscription; const removeListener = presentation_frontend_1.Presentation.presentation.rulesets().onRulesetModified.addListener((modifiedRuleset) => { if (modifiedRuleset.id !== (0, Utils_js_1.getRulesetId)(ruleset)) { return; } // use ruleset id as only registered rulesets can be modified. /* c8 ignore next */ subscription?.unsubscribe(); subscription = startTreeReload({ dataProviderProps, ruleset: modifiedRuleset.id, pageSize, modelSource, renderedItems, onReload }); }); return () => { removeListener(); subscription?.unsubscribe(); }; }, [dataProviderProps, ruleset, modelSource, pageSize, onReload, renderedItems]); } function useModelSourceUpdateOnRulesetVariablesChange(params) { const { dataProviderProps, pageSize, ruleset, modelSource, onReload, renderedItems } = params; (0, react_1.useEffect)(() => { if (!modelSource) { return; } let subscription; const removeListener = presentation_frontend_1.Presentation.presentation.vars((0, Utils_js_1.getRulesetId)(ruleset)).onVariableChanged.addListener(() => { // note: we should probably debounce these events while accumulating changed variables in case multiple vars are changed /* c8 ignore next */ subscription?.unsubscribe(); subscription = startTreeReload({ dataProviderProps, ruleset, pageSize, modelSource, renderedItems, onReload }); }); return () => { removeListener(); subscription?.unsubscribe(); }; }, [dataProviderProps, modelSource, pageSize, ruleset, onReload, renderedItems]); } function useModelSourceUpdateOnUnitSystemChange(params) { const { dataProviderProps, pageSize, ruleset, modelSource, onReload, renderedItems } = params; (0, react_1.useEffect)(() => { if (!modelSource) { return; } let subscription; const removeListener = core_frontend_1.IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.addListener(() => { /* c8 ignore next */ subscription?.unsubscribe(); subscription = startTreeReload({ dataProviderProps, ruleset, pageSize, modelSource, renderedItems, onReload }); }); return () => { removeListener(); subscription?.unsubscribe(); }; }, [dataProviderProps, modelSource, pageSize, ruleset, onReload, renderedItems]); } function startTreeReload({ dataProviderProps, ruleset, modelSource, pageSize, renderedItems, onReload }) { const dataProvider = new DataProvider_js_1.PresentationTreeDataProvider({ ...dataProviderProps, ruleset }); return (0, TreeReloader_js_1.reloadTree)(modelSource.getModel(), dataProvider, pageSize, renderedItems.current).subscribe({ next: (newModelSource) => onReload({ modelSource: newModelSource, dataProvider, }), }); } //# sourceMappingURL=UseTreeReload.js.map