@itwin/presentation-components
Version:
React components based on iTwin.js Presentation library
130 lines • 6.14 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* 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 */
import { useEffect } from "react";
import { IModelApp } from "@itwin/core-frontend";
import { Presentation } from "@itwin/presentation-frontend";
import { getRulesetId } from "../../common/Utils.js";
import { PresentationTreeDataProvider } from "../DataProvider.js";
import { reloadTree } from "./TreeReloader.js";
/** @internal */
export function useTreeReload(params) {
useModelSourceUpdateOnIModelHierarchyUpdate(params);
useModelSourceUpdateOnRulesetModification(params);
useModelSourceUpdateOnRulesetVariablesChange(params);
useModelSourceUpdateOnUnitSystemChange(params);
useModelSourceUpdateOnBriefcaseUpdate(params);
}
function useModelSourceUpdateOnBriefcaseUpdate(params) {
const { dataProviderProps, ruleset, pageSize, modelSource, onReload, renderedItems } = params;
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;
useEffect(() => {
if (!modelSource) {
return;
}
let subscription;
const removeListener = Presentation.presentation.onIModelHierarchyChanged.addListener((args) => {
if (args.rulesetId !== 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;
useEffect(() => {
if (!modelSource) {
return;
}
let subscription;
const removeListener = Presentation.presentation.rulesets().onRulesetModified.addListener((modifiedRuleset) => {
if (modifiedRuleset.id !== 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;
useEffect(() => {
if (!modelSource) {
return;
}
let subscription;
const removeListener = Presentation.presentation.vars(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;
useEffect(() => {
if (!modelSource) {
return;
}
let subscription;
const removeListener = 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 PresentationTreeDataProvider({ ...dataProviderProps, ruleset });
return reloadTree(modelSource.getModel(), dataProvider, pageSize, renderedItems.current).subscribe({
next: (newModelSource) => onReload({
modelSource: newModelSource,
dataProvider,
}),
});
}
//# sourceMappingURL=UseTreeReload.js.map