@itwin/presentation-components
Version:
React components based on iTwin.js Presentation library
176 lines • 7.84 kB
JavaScript
"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, pageSize, modelSource, onReload, renderedItems } = params;
(0, react_1.useEffect)(() => {
if (!dataProviderProps.imodel.isBriefcaseConnection()) {
return;
}
let subscription;
const reload = () => {
const currentModelSource = modelSource?.current;
/* v8 ignore if -- @preserve */
if (!currentModelSource) {
return;
}
/* v8 ignore next -- @preserve */
subscription?.unsubscribe();
subscription = startTreeReload({
dataProviderProps,
pageSize,
modelSource: currentModelSource,
renderedItems: renderedItems.current,
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, onReload, renderedItems]);
}
function useModelSourceUpdateOnIModelHierarchyUpdate(params) {
const { dataProviderProps, pageSize, modelSource, onReload, renderedItems } = params;
(0, react_1.useEffect)(() => {
let subscription;
const removeListener = presentation_frontend_1.Presentation.presentation.onIModelHierarchyChanged.addListener((args) => {
if (args.rulesetId !== (0, Utils_js_1.getRulesetId)(dataProviderProps.ruleset) ||
args.imodelKey !== dataProviderProps.imodel.key) {
return;
}
const currentModelSource = modelSource?.current;
/* v8 ignore if -- @preserve */
if (!currentModelSource) {
return;
}
/* v8 ignore next -- @preserve */
subscription?.unsubscribe();
subscription = startTreeReload({
dataProviderProps,
pageSize,
modelSource: currentModelSource,
renderedItems: renderedItems.current,
onReload,
});
});
return () => {
removeListener();
subscription?.unsubscribe();
};
}, [modelSource, pageSize, dataProviderProps, onReload, renderedItems]);
}
function useModelSourceUpdateOnRulesetModification(params) {
const { dataProviderProps, pageSize, modelSource, onReload, renderedItems } = params;
(0, react_1.useEffect)(() => {
let subscription;
const removeListener = presentation_frontend_1.Presentation.presentation.rulesets().onRulesetModified.addListener((modifiedRuleset) => {
if (modifiedRuleset.id !== (0, Utils_js_1.getRulesetId)(dataProviderProps.ruleset)) {
return;
}
const currentModelSource = modelSource?.current;
/* v8 ignore if -- @preserve */
if (!currentModelSource) {
return;
}
// use ruleset id as only registered rulesets can be modified.
/* v8 ignore next -- @preserve */
subscription?.unsubscribe();
subscription = startTreeReload({
dataProviderProps: { ...dataProviderProps, ruleset: modifiedRuleset.id },
pageSize,
modelSource: currentModelSource,
renderedItems: renderedItems.current,
onReload,
});
});
return () => {
removeListener();
subscription?.unsubscribe();
};
}, [dataProviderProps, modelSource, pageSize, onReload, renderedItems]);
}
function useModelSourceUpdateOnRulesetVariablesChange(params) {
const { dataProviderProps, pageSize, modelSource, onReload, renderedItems } = params;
(0, react_1.useEffect)(() => {
let subscription;
const removeListener = presentation_frontend_1.Presentation.presentation
.vars((0, Utils_js_1.getRulesetId)(dataProviderProps.ruleset))
.onVariableChanged.addListener(() => {
const currentModelSource = modelSource?.current;
/* v8 ignore if -- @preserve */
if (!currentModelSource) {
return;
}
// note: we should probably debounce these events while accumulating changed variables in case multiple vars are changed
/* v8 ignore next -- @preserve */
subscription?.unsubscribe();
subscription = startTreeReload({
dataProviderProps,
pageSize,
modelSource: currentModelSource,
renderedItems: renderedItems.current,
onReload,
});
});
return () => {
removeListener();
subscription?.unsubscribe();
};
}, [dataProviderProps, modelSource, pageSize, onReload, renderedItems]);
}
function useModelSourceUpdateOnUnitSystemChange(params) {
const { dataProviderProps, pageSize, modelSource, onReload, renderedItems } = params;
(0, react_1.useEffect)(() => {
let subscription;
const removeListener = core_frontend_1.IModelApp.quantityFormatter.onActiveFormattingUnitSystemChanged.addListener(() => {
const currentModelSource = modelSource?.current;
/* v8 ignore if -- @preserve */
if (!currentModelSource) {
return;
}
/* v8 ignore next -- @preserve */
subscription?.unsubscribe();
subscription = startTreeReload({
dataProviderProps,
pageSize,
modelSource: currentModelSource,
renderedItems: renderedItems.current,
onReload,
});
});
return () => {
removeListener();
subscription?.unsubscribe();
};
}, [dataProviderProps, modelSource, pageSize, onReload, renderedItems]);
}
function startTreeReload({ dataProviderProps, modelSource, pageSize, renderedItems, onReload, }) {
const dataProvider = new DataProvider_js_1.PresentationTreeDataProvider(dataProviderProps);
return (0, TreeReloader_js_1.reloadTree)(modelSource.getModel(), dataProvider, pageSize, renderedItems).subscribe({
next: (newModelSource) => onReload({ modelSource: newModelSource, dataProvider }),
});
}
//# sourceMappingURL=UseTreeReload.js.map