UNPKG

@itwin/presentation-components

Version:

React components based on iTwin.js Presentation library

71 lines 2.92 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. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); exports.ReportingTreeNodeLoader = void 0; /** @packageDocumentation * @module Tree */ const rxjs_1 = require("rxjs"); const components_react_1 = require("@itwin/components-react"); const Utils_js_1 = require("./Utils.js"); /** * Wrapper for `PagedTreeNodeLoader` that reports load times of nodes. * @internal */ class ReportingTreeNodeLoader extends components_react_1.PagedTreeNodeLoader { _nodeLoader; _onNodeLoaded; _trackedRequests; constructor(nodeLoader, onNodeLoaded) { super(nodeLoader.dataProvider, nodeLoader.modelSource, nodeLoader.pageSize); this._nodeLoader = nodeLoader; this._onNodeLoaded = onNodeLoaded; this._trackedRequests = new Map(); } loadNode(parent, childIndex) { const observable = this._nodeLoader.loadNode(parent, childIndex); const parentId = parent.id ?? "root"; if (childIndex !== 0) { return observable; } let tracked = this._trackedRequests.get(parentId); if (!tracked) { let time; tracked = (0, Utils_js_1.toRxjsObservable)(observable).pipe((0, rxjs_1.tap)({ subscribe: () => { time = performance.now(); }, unsubscribe: () => { this._trackedRequests.delete(parentId); }, error: () => { this._trackedRequests.delete(parentId); }, next: () => { this._onNodeLoaded({ node: parentId, duration: performance.now() - time }); }, complete: () => { this._trackedRequests.delete(parentId); }, }), (0, rxjs_1.share)({ resetOnRefCountZero: true })); this._trackedRequests.set(parentId, tracked); } if (parent.id !== undefined) { return tracked; } // workaround ControlledTree unsubscribing from the observable after nodes are loaded into a tree model // but not emitted from observable yet. const subject = new rxjs_1.Subject(); const source = tracked; // reference docs generation fails if `tracked` is used directly. return subject.pipe((0, rxjs_1.tap)({ subscribe: () => { source.subscribe(subject); }, })); } } exports.ReportingTreeNodeLoader = ReportingTreeNodeLoader; //# sourceMappingURL=ReportingTreeNodeLoader.js.map