From c3c4507eecf5b05d392b3ed11ee6552cc5ec4da8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Tue, 19 Sep 2023 16:22:06 +0200 Subject: [PATCH 1/8] feat: return two promises from useClickedNode To facilitate faster style changes --- .../NodeCacheProvider/FdmNodeCache.ts | 17 +-- .../NodeCacheProvider/NodeCacheProvider.tsx | 6 +- .../NodeCacheProvider/RevisionFdmNodeCache.ts | 131 ++++++++++++------ .../src/components/NodeCacheProvider/types.ts | 15 +- .../src/hooks/useCalculateModelsStyling.tsx | 2 +- react-components/src/hooks/useClickedNode.tsx | 52 ++++--- 6 files changed, 153 insertions(+), 70 deletions(-) diff --git a/react-components/src/components/NodeCacheProvider/FdmNodeCache.ts b/react-components/src/components/NodeCacheProvider/FdmNodeCache.ts index 6836ce6b5fe..8288d1a1532 100644 --- a/react-components/src/components/NodeCacheProvider/FdmNodeCache.ts +++ b/react-components/src/components/NodeCacheProvider/FdmNodeCache.ts @@ -19,7 +19,8 @@ import { type ModelNodeIdKey, type ModelRevisionToEdgeMap, type ModelRevisionId, - type FdmKey + type FdmKey, + FdmNodeDataPromises } from './types'; import { createFdmKey, @@ -103,7 +104,7 @@ export class FdmNodeCache { ); const mappings = createMapWithAccumulatedValues( - relevantCachedEdgeData.map((data) => [data.edge.startNode.externalId, data.node]) + relevantCachedEdgeData.map((data) => [data.edge.startNode.externalId, data.cadNode]) ); return { @@ -149,7 +150,7 @@ export class FdmNodeCache { const relevantEdges = intersectWithStartNodeIdSet(edges, relevantFdmKeySet); const externalIdToNodeMap = createMapWithAccumulatedValues( - relevantEdges.map((edge) => [edge.edge.startNode.externalId, edge.node]) + relevantEdges.map((edge) => [edge.edge.startNode.externalId, edge.cadNode]) ); return { @@ -217,7 +218,7 @@ export class FdmNodeCache { const revisionCache = this.getOrCreateRevisionCache(modelId, revisionId); data.forEach((edgeAndNode) => { - revisionCache.insertTreeIndexMappings(edgeAndNode.node.treeIndex, edgeAndNode); + revisionCache.insertTreeIndexMappings(edgeAndNode.cadNode.treeIndex, edgeAndNode); }); this._completeRevisions.add(revisionKey); @@ -246,14 +247,14 @@ export class FdmNodeCache { return revisionToEdgesMap; } - public async getClosestParentExternalId( + public getClosestParentDataPromises( modelId: number, revisionId: number, treeIndex: number - ): Promise>> { + ): FdmNodeDataPromises { const revisionCache = this.getOrCreateRevisionCache(modelId, revisionId); - return await revisionCache.getClosestParentFdmData(treeIndex); + return revisionCache.getClosestParentFdmData(treeIndex); } private async getViewsForEdges( @@ -361,7 +362,7 @@ function createFdmEdgeWithNode( const node = modelNodeIdToNodeMap.get(revisionNodeIdKey); assert(node !== undefined); - return { edge, node, view }; + return { edge, cadNode: node, view }; } function insertEdgeIntoMapList( diff --git a/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx b/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx index 699f363486d..6c0d9eb9329 100644 --- a/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx +++ b/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx @@ -6,7 +6,7 @@ import { type ReactElement, type ReactNode, createContext, useContext, useMemo } import { FdmNodeCache } from './FdmNodeCache'; import { type UseQueryResult, useQuery } from '@tanstack/react-query'; import { useFdmSdk, useSDK } from '../RevealContainer/SDKProvider'; -import { type FdmEdgeWithNode, type ModelRevisionToEdgeMap } from './types'; +import { FdmNodeDataPromises, type ModelRevisionToEdgeMap } from './types'; import assert from 'assert'; import { type DmsUniqueIdentifier } from '../../utilities/FdmSDK'; @@ -54,7 +54,7 @@ export const useFdm3dNodeData = ( modelId: number | undefined, revisionId: number | undefined, treeIndex: number | undefined -): UseQueryResult>> => { +): UseQueryResult => { const content = useFdmNodeCache(); const enableQuery = @@ -67,7 +67,7 @@ export const useFdm3dNodeData = ( ['reveal', 'react-components', 'tree-index-to-external-id', modelId, revisionId, treeIndex], async () => { assert(enableQuery); - return await content.cache.getClosestParentExternalId(modelId, revisionId, treeIndex); + return content.cache.getClosestParentDataPromises(modelId, revisionId, treeIndex); }, { enabled: enableQuery diff --git a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts index 0dc7678ef6c..2b16670f40f 100644 --- a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts +++ b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts @@ -3,8 +3,8 @@ */ import { type CogniteClient, type Node3D } from '@cognite/sdk'; -import { type FdmSDK } from '../../utilities/FdmSDK'; -import { type TreeIndex, type FdmEdgeWithNode, type FdmCadEdge } from './types'; +import { Source, type FdmSDK } from '../../utilities/FdmSDK'; +import { type TreeIndex, type FdmEdgeWithNode, type FdmCadEdge, FdmNodeDataPromises, CadNodeWithEdges, AncestorQueryResult } from './types'; import { fetchAncestorNodesForTreeIndex, @@ -38,38 +38,77 @@ export class RevisionFdmNodeCache { this._revisionId = revisionId; } - public async getClosestParentFdmData( + public getClosestParentFdmData( searchTreeIndex: number - ): Promise>> { + ): FdmNodeDataPromises { const cachedFdmData = this._treeIndexToFdmEdges.get(searchTreeIndex); - if (checkDefinedView(cachedFdmData)) { - return cachedFdmData; + if (cachedFdmData === undefined) { + return this.findAndCacheNodeDataFromAncestors(searchTreeIndex); } - if (cachedFdmData !== undefined) { - return await this.getDataWithViewsForFdmEdges(cachedFdmData, []); + if (cachedFdmData.length === 0) { + return { + cadAndFdmNodesPromise: Promise.resolve(undefined), + viewsPromise: Promise.resolve(undefined) + }; } - return await this.findNodeDataFromAncestors(searchTreeIndex); + const cadAndFdmNodesPromise = Promise.resolve({ + cadNode: cachedFdmData[0].cadNode, + fdmIds: cachedFdmData.map(data => data.edge.startNode) + }); + + const viewsPromise = this.assertOrAppendViewsForData(searchTreeIndex, cachedFdmData); + + return { cadAndFdmNodesPromise, viewsPromise }; } - private async findNodeDataFromAncestors( - treeIndex: TreeIndex - ): Promise>> { - const { edges, ancestorsWithSameMapping, firstMappedAncestorTreeIndex } = - await this.getClosestParentMapping(treeIndex); + private async assertOrAppendViewsForData(searchTreeIndex: number, cachedFdmData: FdmEdgeWithNode[]): Promise { - if (edges.length === 0) { - return []; + if (checkDefinedView(cachedFdmData)) { + return cachedFdmData.map(data => data.view); } - const cachedFdmData = this._treeIndexToFdmEdges.get(firstMappedAncestorTreeIndex); + const cadNode = cachedFdmData[0].cadNode; + const cadAndFdmEdgePromise = Promise.resolve({ + cadNode, + edges: cachedFdmData.map(data => data.edge) + }); - if (checkDefinedView(cachedFdmData)) { - this.setSameCacheForNodes(ancestorsWithSameMapping, cachedFdmData); + return this.getViewsPromiseForDataPromiseAndCacheData( + cadAndFdmEdgePromise, + Promise.resolve([cadNode.treeIndex, searchTreeIndex]) + ); + } - return cachedFdmData; + private findAndCacheNodeDataFromAncestors( + treeIndex: TreeIndex + ): FdmNodeDataPromises { + const ancestorDataPromise = this.getClosestParentMapping(treeIndex); + + const cadAndEdgesPromise = this.getCadAndEdgesPromiseForAncestorData(ancestorDataPromise); + const cadAndFdmNodesPromise = cadAndEdgesPromise + .then(cadAndEdges => cadAndEdges !== undefined ? + ({ cadNode: cadAndEdges.cadNode, fdmIds: cadAndEdges.edges.map(edge => edge.startNode)}) : undefined); + + const ancestorTreeIndexesPromise = ancestorDataPromise.then(data => { + const treeIndexes = data.ancestorsWithSameMapping.map(ancestor => ancestor.treeIndex); + return treeIndexes.length === 0 ? [treeIndex] : treeIndexes; + }); + + const viewsPromise = this.getViewsPromiseForDataPromiseAndCacheData(cadAndEdgesPromise, ancestorTreeIndexesPromise); + + return { cadAndFdmNodesPromise, viewsPromise }; + } + + private async getCadAndEdgesPromiseForAncestorData(ancestorDataPromise: Promise): Promise { + + const { edges, ancestorsWithSameMapping, firstMappedAncestorTreeIndex } = await ancestorDataPromise; + + if (edges.length === 0) { + this.setSameCacheForNodes(ancestorsWithSameMapping, []); + return undefined; } const firstMappedAncestor = ancestorsWithSameMapping.find( @@ -78,9 +117,7 @@ export class RevisionFdmNodeCache { assert(firstMappedAncestor !== undefined); - const nodeEdges = edges.map((edge) => ({ edge, node: firstMappedAncestor })); - - return await this.getDataWithViewsForFdmEdges(nodeEdges, ancestorsWithSameMapping); + return { cadNode: firstMappedAncestor, edges }; } private setSameCacheForNodes(nodes: Node3D[], nodeData: FdmEdgeWithNode[]): void { @@ -89,32 +126,46 @@ export class RevisionFdmNodeCache { }); } - private async getDataWithViewsForFdmEdges( - nodeEdges: Array<{ edge: FdmCadEdge; node: Node3D }>, - ancestorsWithSameMapping: Node3D[] - ): Promise>> { + private async getViewsPromiseForDataPromiseAndCacheData( + cadAndFdmIdsPromise: Promise, + treeIndexesWithSameMappingPromise: Promise + ): Promise | undefined> { + + const cadAndFdmIds = await cadAndFdmIdsPromise; + if (cadAndFdmIds === undefined) { + + const ancestorsWithSameMapping = await treeIndexesWithSameMappingPromise; + + ancestorsWithSameMapping.forEach((treeIndex) => { + this._treeIndexToFdmEdges.set(treeIndex, []); + }); + + return undefined; + } + const nodeInspectionResults = await inspectNodes( this._fdmClient, - nodeEdges.map((edge) => edge.edge.startNode) + cadAndFdmIds.edges.map(edge => edge.startNode) ); - const dataWithViews = nodeEdges.map((fdmEdgeWithNode, ind) => ({ - ...fdmEdgeWithNode, + const views = nodeInspectionResults.items.map(item => item.inspectionResults.involvedViewsAndContainers.views[0]); + + const dataWithViews = cadAndFdmIds.edges.map((edge, ind) => ({ + edge, + cadNode: cadAndFdmIds.cadNode, view: nodeInspectionResults.items[ind].inspectionResults.involvedViewsAndContainers.views[0] })); - ancestorsWithSameMapping.forEach((ancestor) => { - this._treeIndexToFdmEdges.set(ancestor.treeIndex, dataWithViews); + const ancestorsWithSameMapping = await treeIndexesWithSameMappingPromise; + + ancestorsWithSameMapping.forEach((treeIndex) => { + this._treeIndexToFdmEdges.set(treeIndex, dataWithViews); }); - return dataWithViews; + return views; } - private async getClosestParentMapping(treeIndex: number): Promise<{ - edges: FdmCadEdge[]; - ancestorsWithSameMapping: Node3D[]; - firstMappedAncestorTreeIndex: number; - }> { + private async getClosestParentMapping(treeIndex: number): Promise { const ancestors: Node3D[] = await fetchAncestorNodesForTreeIndex( this._modelId, this._revisionId, @@ -200,7 +251,7 @@ export class RevisionFdmNodeCache { view: nodeInspectionResults.items[ind].inspectionResults.involvedViewsAndContainers.views[0] }; - this.insertTreeIndexMappings(edgeWithView.node.treeIndex, edgeWithView); + this.insertTreeIndexMappings(edgeWithView.cadNode.treeIndex, edgeWithView); }); } @@ -210,7 +261,7 @@ export class RevisionFdmNodeCache { if (edgeArray === undefined) { this._treeIndexToFdmEdges.set(treeIndex, [edge]); } else { - const presentEdge = edgeArray?.find((e) => e.node.id === edge.node.id); + const presentEdge = edgeArray?.find((e) => e.cadNode.id === edge.cadNode.id); if (presentEdge !== undefined) { presentEdge.view = edge.view; diff --git a/react-components/src/components/NodeCacheProvider/types.ts b/react-components/src/components/NodeCacheProvider/types.ts index 630c5cf70e5..8990ef15d05 100644 --- a/react-components/src/components/NodeCacheProvider/types.ts +++ b/react-components/src/components/NodeCacheProvider/types.ts @@ -6,7 +6,20 @@ import { type EdgeItem, type DmsUniqueIdentifier, type Source } from '../../util import { type InModel3dEdgeProperties } from '../../utilities/globalDataModels'; export type FdmCadEdge = EdgeItem; -export type FdmEdgeWithNode = { edge: FdmCadEdge; node: Node3D; view?: Source }; +export type FdmEdgeWithNode = { edge: FdmCadEdge; cadNode: Node3D; view?: Source }; + +export type CadNodeWithFdmIds = { cadNode: Node3D, fdmIds: DmsUniqueIdentifier[] }; +export type CadNodeWithEdges = { cadNode: Node3D, edges: FdmCadEdge[] }; +export type FdmNodeDataPromises = { + cadAndFdmNodesPromise: Promise, + viewsPromise: Promise +}; + +export type AncestorQueryResult = { + edges: FdmCadEdge[]; + ancestorsWithSameMapping: Node3D[]; + firstMappedAncestorTreeIndex: number; +}; export type ModelId = number; export type RevisionId = number; diff --git a/react-components/src/hooks/useCalculateModelsStyling.tsx b/react-components/src/hooks/useCalculateModelsStyling.tsx index 6890d0bd55a..89bb37ad403 100644 --- a/react-components/src/hooks/useCalculateModelsStyling.tsx +++ b/react-components/src/hooks/useCalculateModelsStyling.tsx @@ -155,7 +155,7 @@ function getMappedStyleGroup( mapped: NodeAppearance ): TreeIndexStylingGroup { const treeIndices = edges.flatMap((edge) => { - const treeIndices = getNodeSubtreeIndices(edge.node); + const treeIndices = getNodeSubtreeIndices(edge.cadNode); return treeIndices; }); return { treeIndices, style: mapped }; diff --git a/react-components/src/hooks/useClickedNode.tsx b/react-components/src/hooks/useClickedNode.tsx index 50a49e46aa3..e6e30502428 100644 --- a/react-components/src/hooks/useClickedNode.tsx +++ b/react-components/src/hooks/useClickedNode.tsx @@ -7,6 +7,7 @@ import { type DmsUniqueIdentifier, type Source, useReveal } from '../'; import { useEffect, useState } from 'react'; import { useFdm3dNodeData } from '../components/NodeCacheProvider/NodeCacheProvider'; import { type Node3D } from '@cognite/sdk'; +import { FdmNodeDataPromises } from '../components/NodeCacheProvider/types'; export type NodeDataResult = { fdmNode: DmsUniqueIdentifier; @@ -55,29 +56,46 @@ export const useClickedNodeData = (): ClickedNodeData | undefined => { return; } - const nodeDataList = nodeData ?? []; + unwrapQueryResult(nodeData); + async function unwrapQueryResult(promises: FdmNodeDataPromises | undefined): Promise { - if (cadIntersection === undefined) { - setClickedNodeData(undefined); - return; - } + if (promises === undefined) { + return; + } + + const cadAndFdmNode = await promises.cadAndFdmNodesPromise; + + if (cadIntersection === undefined) { + setClickedNodeData(undefined); + return; + } + + if (cadAndFdmNode === undefined || cadAndFdmNode.fdmIds.length === 0) { + setClickedNodeData({ + intersection: cadIntersection + }); + return; + } + + const views = await promises.viewsPromise; + + if (views === undefined) { + setClickedNodeData({ + intersection: cadIntersection, + fdmNode: cadAndFdmNode.fdmIds[0], + cadNode: cadAndFdmNode.cadNode + }); + return; + } - if (nodeDataList.length === 0) { setClickedNodeData({ - intersection: cadIntersection + intersection: cadIntersection, + fdmNode: cadAndFdmNode.fdmIds[0], + cadNode: cadAndFdmNode.cadNode, + view: views[0], }); - return; } - const chosenNode = nodeDataList[0]; - - setClickedNodeData({ - intersection: cadIntersection, - fdmNode: chosenNode.edge.startNode, - view: chosenNode.view, - cadNode: chosenNode.node - }); - function isWaitingForQueryResult(): boolean { return nodeData === undefined && cadIntersection !== undefined; } From ecdce38cba3224d9f9b1bf1bb0cc17148bbf3b0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Wed, 20 Sep 2023 09:38:34 +0200 Subject: [PATCH 2/8] chore: cleanup and lint fix --- .../NodeCacheProvider/FdmNodeCache.ts | 2 +- .../NodeCacheProvider/NodeCacheProvider.tsx | 2 +- .../NodeCacheProvider/RevisionFdmNodeCache.ts | 68 +++++++++++-------- .../src/components/NodeCacheProvider/types.ts | 8 +-- react-components/src/hooks/useClickedNode.tsx | 44 +++++++----- 5 files changed, 72 insertions(+), 52 deletions(-) diff --git a/react-components/src/components/NodeCacheProvider/FdmNodeCache.ts b/react-components/src/components/NodeCacheProvider/FdmNodeCache.ts index 8288d1a1532..9722548fdb0 100644 --- a/react-components/src/components/NodeCacheProvider/FdmNodeCache.ts +++ b/react-components/src/components/NodeCacheProvider/FdmNodeCache.ts @@ -20,7 +20,7 @@ import { type ModelRevisionToEdgeMap, type ModelRevisionId, type FdmKey, - FdmNodeDataPromises + type FdmNodeDataPromises } from './types'; import { createFdmKey, diff --git a/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx b/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx index 6c0d9eb9329..0dd182096b4 100644 --- a/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx +++ b/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx @@ -6,7 +6,7 @@ import { type ReactElement, type ReactNode, createContext, useContext, useMemo } import { FdmNodeCache } from './FdmNodeCache'; import { type UseQueryResult, useQuery } from '@tanstack/react-query'; import { useFdmSdk, useSDK } from '../RevealContainer/SDKProvider'; -import { FdmNodeDataPromises, type ModelRevisionToEdgeMap } from './types'; +import { type FdmNodeDataPromises, type ModelRevisionToEdgeMap } from './types'; import assert from 'assert'; import { type DmsUniqueIdentifier } from '../../utilities/FdmSDK'; diff --git a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts index 2b16670f40f..66a213666c1 100644 --- a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts +++ b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts @@ -3,8 +3,15 @@ */ import { type CogniteClient, type Node3D } from '@cognite/sdk'; -import { Source, type FdmSDK } from '../../utilities/FdmSDK'; -import { type TreeIndex, type FdmEdgeWithNode, type FdmCadEdge, FdmNodeDataPromises, CadNodeWithEdges, AncestorQueryResult } from './types'; +import { type Source, type FdmSDK } from '../../utilities/FdmSDK'; +import { + type TreeIndex, + type FdmEdgeWithNode, + type FdmCadEdge, + type FdmNodeDataPromises, + type CadNodeWithEdges, + type AncestorQueryResult +} from './types'; import { fetchAncestorNodesForTreeIndex, @@ -38,9 +45,7 @@ export class RevisionFdmNodeCache { this._revisionId = revisionId; } - public getClosestParentFdmData( - searchTreeIndex: number - ): FdmNodeDataPromises { + public getClosestParentFdmData(searchTreeIndex: number): FdmNodeDataPromises { const cachedFdmData = this._treeIndexToFdmEdges.get(searchTreeIndex); if (cachedFdmData === undefined) { @@ -56,7 +61,7 @@ export class RevisionFdmNodeCache { const cadAndFdmNodesPromise = Promise.resolve({ cadNode: cachedFdmData[0].cadNode, - fdmIds: cachedFdmData.map(data => data.edge.startNode) + fdmIds: cachedFdmData.map((data) => data.edge.startNode) }); const viewsPromise = this.assertOrAppendViewsForData(searchTreeIndex, cachedFdmData); @@ -64,47 +69,54 @@ export class RevisionFdmNodeCache { return { cadAndFdmNodesPromise, viewsPromise }; } - private async assertOrAppendViewsForData(searchTreeIndex: number, cachedFdmData: FdmEdgeWithNode[]): Promise { - + private async assertOrAppendViewsForData( + searchTreeIndex: number, + cachedFdmData: FdmEdgeWithNode[] + ): Promise { if (checkDefinedView(cachedFdmData)) { - return cachedFdmData.map(data => data.view); + return cachedFdmData.map((data) => data.view); } const cadNode = cachedFdmData[0].cadNode; const cadAndFdmEdgePromise = Promise.resolve({ cadNode, - edges: cachedFdmData.map(data => data.edge) + edges: cachedFdmData.map((data) => data.edge) }); - return this.getViewsPromiseForDataPromiseAndCacheData( + return await this.getViewsPromiseForDataPromiseAndCacheData( cadAndFdmEdgePromise, Promise.resolve([cadNode.treeIndex, searchTreeIndex]) ); } - private findAndCacheNodeDataFromAncestors( - treeIndex: TreeIndex - ): FdmNodeDataPromises { + private findAndCacheNodeDataFromAncestors(treeIndex: TreeIndex): FdmNodeDataPromises { const ancestorDataPromise = this.getClosestParentMapping(treeIndex); const cadAndEdgesPromise = this.getCadAndEdgesPromiseForAncestorData(ancestorDataPromise); - const cadAndFdmNodesPromise = cadAndEdgesPromise - .then(cadAndEdges => cadAndEdges !== undefined ? - ({ cadNode: cadAndEdges.cadNode, fdmIds: cadAndEdges.edges.map(edge => edge.startNode)}) : undefined); + const cadAndFdmNodesPromise = cadAndEdgesPromise.then((cadAndEdges) => + cadAndEdges !== undefined + ? { cadNode: cadAndEdges.cadNode, fdmIds: cadAndEdges.edges.map((edge) => edge.startNode) } + : undefined + ); - const ancestorTreeIndexesPromise = ancestorDataPromise.then(data => { - const treeIndexes = data.ancestorsWithSameMapping.map(ancestor => ancestor.treeIndex); + const ancestorTreeIndexesPromise = ancestorDataPromise.then((data) => { + const treeIndexes = data.ancestorsWithSameMapping.map((ancestor) => ancestor.treeIndex); return treeIndexes.length === 0 ? [treeIndex] : treeIndexes; }); - const viewsPromise = this.getViewsPromiseForDataPromiseAndCacheData(cadAndEdgesPromise, ancestorTreeIndexesPromise); + const viewsPromise = this.getViewsPromiseForDataPromiseAndCacheData( + cadAndEdgesPromise, + ancestorTreeIndexesPromise + ); return { cadAndFdmNodesPromise, viewsPromise }; } - private async getCadAndEdgesPromiseForAncestorData(ancestorDataPromise: Promise): Promise { - - const { edges, ancestorsWithSameMapping, firstMappedAncestorTreeIndex } = await ancestorDataPromise; + private async getCadAndEdgesPromiseForAncestorData( + ancestorDataPromise: Promise + ): Promise { + const { edges, ancestorsWithSameMapping, firstMappedAncestorTreeIndex } = + await ancestorDataPromise; if (edges.length === 0) { this.setSameCacheForNodes(ancestorsWithSameMapping, []); @@ -129,11 +141,9 @@ export class RevisionFdmNodeCache { private async getViewsPromiseForDataPromiseAndCacheData( cadAndFdmIdsPromise: Promise, treeIndexesWithSameMappingPromise: Promise - ): Promise | undefined> { - + ): Promise { const cadAndFdmIds = await cadAndFdmIdsPromise; if (cadAndFdmIds === undefined) { - const ancestorsWithSameMapping = await treeIndexesWithSameMappingPromise; ancestorsWithSameMapping.forEach((treeIndex) => { @@ -145,10 +155,12 @@ export class RevisionFdmNodeCache { const nodeInspectionResults = await inspectNodes( this._fdmClient, - cadAndFdmIds.edges.map(edge => edge.startNode) + cadAndFdmIds.edges.map((edge) => edge.startNode) ); - const views = nodeInspectionResults.items.map(item => item.inspectionResults.involvedViewsAndContainers.views[0]); + const views = nodeInspectionResults.items.map( + (item) => item.inspectionResults.involvedViewsAndContainers.views[0] + ); const dataWithViews = cadAndFdmIds.edges.map((edge, ind) => ({ edge, diff --git a/react-components/src/components/NodeCacheProvider/types.ts b/react-components/src/components/NodeCacheProvider/types.ts index 8990ef15d05..41b537a34d4 100644 --- a/react-components/src/components/NodeCacheProvider/types.ts +++ b/react-components/src/components/NodeCacheProvider/types.ts @@ -8,11 +8,11 @@ import { type InModel3dEdgeProperties } from '../../utilities/globalDataModels'; export type FdmCadEdge = EdgeItem; export type FdmEdgeWithNode = { edge: FdmCadEdge; cadNode: Node3D; view?: Source }; -export type CadNodeWithFdmIds = { cadNode: Node3D, fdmIds: DmsUniqueIdentifier[] }; -export type CadNodeWithEdges = { cadNode: Node3D, edges: FdmCadEdge[] }; +export type CadNodeWithFdmIds = { cadNode: Node3D; fdmIds: DmsUniqueIdentifier[] }; +export type CadNodeWithEdges = { cadNode: Node3D; edges: FdmCadEdge[] }; export type FdmNodeDataPromises = { - cadAndFdmNodesPromise: Promise, - viewsPromise: Promise + cadAndFdmNodesPromise: Promise; + viewsPromise: Promise; }; export type AncestorQueryResult = { diff --git a/react-components/src/hooks/useClickedNode.tsx b/react-components/src/hooks/useClickedNode.tsx index e6e30502428..33b34c53bc3 100644 --- a/react-components/src/hooks/useClickedNode.tsx +++ b/react-components/src/hooks/useClickedNode.tsx @@ -7,7 +7,7 @@ import { type DmsUniqueIdentifier, type Source, useReveal } from '../'; import { useEffect, useState } from 'react'; import { useFdm3dNodeData } from '../components/NodeCacheProvider/NodeCacheProvider'; import { type Node3D } from '@cognite/sdk'; -import { FdmNodeDataPromises } from '../components/NodeCacheProvider/types'; +import { CadNodeWithFdmIds, type FdmNodeDataPromises } from '../components/NodeCacheProvider/types'; export type NodeDataResult = { fdmNode: DmsUniqueIdentifier; @@ -56,46 +56,54 @@ export const useClickedNodeData = (): ClickedNodeData | undefined => { return; } - unwrapQueryResult(nodeData); - async function unwrapQueryResult(promises: FdmNodeDataPromises | undefined): Promise { - + void setClickedNodeFromQueryResult(nodeData); + async function setClickedNodeFromQueryResult(promises: FdmNodeDataPromises | undefined): Promise { if (promises === undefined) { return; } - const cadAndFdmNode = await promises.cadAndFdmNodesPromise; - if (cadIntersection === undefined) { setClickedNodeData(undefined); return; } - if (cadAndFdmNode === undefined || cadAndFdmNode.fdmIds.length === 0) { + const cadAndFdmNodes = await promises.cadAndFdmNodesPromise; + + if (cadAndFdmNodes === undefined || cadAndFdmNodes.fdmIds.length === 0) { setClickedNodeData({ intersection: cadIntersection }); return; } - const views = await promises.viewsPromise; + setClickedNodeData({ + intersection: cadIntersection, + fdmNode: cadAndFdmNodes.fdmIds[0], + cadNode: cadAndFdmNodes.cadNode + }); - if (views === undefined) { - setClickedNodeData({ - intersection: cadIntersection, - fdmNode: cadAndFdmNode.fdmIds[0], - cadNode: cadAndFdmNode.cadNode - }); + await setClickedNodeFromViewPromise(cadAndFdmNodes, promises.viewsPromise); + } + + async function setClickedNodeFromViewPromise( + data: CadNodeWithFdmIds, + viewsPromise: Promise) { + + + const views = await viewsPromise; + + if (views === undefined || views.length === 0 || cadIntersection === undefined) { return; } setClickedNodeData({ intersection: cadIntersection, - fdmNode: cadAndFdmNode.fdmIds[0], - cadNode: cadAndFdmNode.cadNode, - view: views[0], + fdmNode: data.fdmIds[0], + cadNode: data.cadNode, + view: views[0] }); - } + } function isWaitingForQueryResult(): boolean { return nodeData === undefined && cadIntersection !== undefined; } From eff40655b0edc3c78f9085ed19139e8755f8f469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Wed, 20 Sep 2023 09:46:57 +0200 Subject: [PATCH 3/8] chore: lint fix again --- react-components/src/hooks/useClickedNode.tsx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/react-components/src/hooks/useClickedNode.tsx b/react-components/src/hooks/useClickedNode.tsx index 33b34c53bc3..2ac037dc8cf 100644 --- a/react-components/src/hooks/useClickedNode.tsx +++ b/react-components/src/hooks/useClickedNode.tsx @@ -7,7 +7,10 @@ import { type DmsUniqueIdentifier, type Source, useReveal } from '../'; import { useEffect, useState } from 'react'; import { useFdm3dNodeData } from '../components/NodeCacheProvider/NodeCacheProvider'; import { type Node3D } from '@cognite/sdk'; -import { CadNodeWithFdmIds, type FdmNodeDataPromises } from '../components/NodeCacheProvider/types'; +import { + type CadNodeWithFdmIds, + type FdmNodeDataPromises +} from '../components/NodeCacheProvider/types'; export type NodeDataResult = { fdmNode: DmsUniqueIdentifier; @@ -57,7 +60,9 @@ export const useClickedNodeData = (): ClickedNodeData | undefined => { } void setClickedNodeFromQueryResult(nodeData); - async function setClickedNodeFromQueryResult(promises: FdmNodeDataPromises | undefined): Promise { + async function setClickedNodeFromQueryResult( + promises: FdmNodeDataPromises | undefined + ): Promise { if (promises === undefined) { return; } @@ -87,12 +92,11 @@ export const useClickedNodeData = (): ClickedNodeData | undefined => { async function setClickedNodeFromViewPromise( data: CadNodeWithFdmIds, - viewsPromise: Promise) { - - + viewsPromise: Promise + ): Promise { const views = await viewsPromise; - if (views === undefined || views.length === 0 || cadIntersection === undefined) { + if (views === undefined || views.length === 0 || cadIntersection === undefined) { return; } @@ -102,7 +106,6 @@ export const useClickedNodeData = (): ClickedNodeData | undefined => { cadNode: data.cadNode, view: views[0] }); - } function isWaitingForQueryResult(): boolean { return nodeData === undefined && cadIntersection !== undefined; From 99879a8939142b41cdd9a42735e288f352a2fb76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Wed, 20 Sep 2023 13:28:39 +0200 Subject: [PATCH 4/8] chore: cleanup, renaming --- .../NodeCacheProvider/RevisionFdmNodeCache.ts | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts index 66a213666c1..38b6653f925 100644 --- a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts +++ b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts @@ -10,7 +10,8 @@ import { type FdmCadEdge, type FdmNodeDataPromises, type CadNodeWithEdges, - type AncestorQueryResult + type AncestorQueryResult, + CadNodeWithFdmIds } from './types'; import { @@ -64,12 +65,12 @@ export class RevisionFdmNodeCache { fdmIds: cachedFdmData.map((data) => data.edge.startNode) }); - const viewsPromise = this.assertOrAppendViewsForData(searchTreeIndex, cachedFdmData); + const viewsPromise = this.assertOrFetchViewsForNodeData(searchTreeIndex, cachedFdmData); return { cadAndFdmNodesPromise, viewsPromise }; } - private async assertOrAppendViewsForData( + private async assertOrFetchViewsForNodeData( searchTreeIndex: number, cachedFdmData: FdmEdgeWithNode[] ): Promise { @@ -78,14 +79,14 @@ export class RevisionFdmNodeCache { } const cadNode = cachedFdmData[0].cadNode; - const cadAndFdmEdgePromise = Promise.resolve({ + const cadNodeWithEdges = { cadNode, edges: cachedFdmData.map((data) => data.edge) - }); + }; - return await this.getViewsPromiseForDataPromiseAndCacheData( - cadAndFdmEdgePromise, - Promise.resolve([cadNode.treeIndex, searchTreeIndex]) + return await this.getAndCacheViewsPromiseForNodeData( + cadNodeWithEdges, + [cadNode.treeIndex, searchTreeIndex] ); } @@ -99,19 +100,21 @@ export class RevisionFdmNodeCache { : undefined ); - const ancestorTreeIndexesPromise = ancestorDataPromise.then((data) => { - const treeIndexes = data.ancestorsWithSameMapping.map((ancestor) => ancestor.treeIndex); - return treeIndexes.length === 0 ? [treeIndex] : treeIndexes; - }); - - const viewsPromise = this.getViewsPromiseForDataPromiseAndCacheData( - cadAndEdgesPromise, - ancestorTreeIndexesPromise - ); + const viewsPromise = this.getViewsPromiseFromDataPromises(cadAndEdgesPromise, ancestorDataPromise); return { cadAndFdmNodesPromise, viewsPromise }; } + private async getViewsPromiseFromDataPromises(cadAndEdgesPromise: Promise, + ancestorDataPromise: Promise): Promise { + + const cadAndEdges = await cadAndEdgesPromise; + const { ancestorsWithSameMapping } = await ancestorDataPromise; + const ancestorTreeIndexes = ancestorsWithSameMapping.map(ancestor => ancestor.treeIndex); + + return this.getAndCacheViewsPromiseForNodeData(cadAndEdges, ancestorTreeIndexes); + } + private async getCadAndEdgesPromiseForAncestorData( ancestorDataPromise: Promise ): Promise { @@ -138,15 +141,13 @@ export class RevisionFdmNodeCache { }); } - private async getViewsPromiseForDataPromiseAndCacheData( - cadAndFdmIdsPromise: Promise, - treeIndexesWithSameMappingPromise: Promise + private async getAndCacheViewsPromiseForNodeData( + cadAndFdmIds: CadNodeWithEdges | undefined, + ancestorIndicesWithSameMapping: TreeIndex[] ): Promise { - const cadAndFdmIds = await cadAndFdmIdsPromise; if (cadAndFdmIds === undefined) { - const ancestorsWithSameMapping = await treeIndexesWithSameMappingPromise; - ancestorsWithSameMapping.forEach((treeIndex) => { + ancestorIndicesWithSameMapping.forEach((treeIndex) => { this._treeIndexToFdmEdges.set(treeIndex, []); }); @@ -168,9 +169,7 @@ export class RevisionFdmNodeCache { view: nodeInspectionResults.items[ind].inspectionResults.involvedViewsAndContainers.views[0] })); - const ancestorsWithSameMapping = await treeIndexesWithSameMappingPromise; - - ancestorsWithSameMapping.forEach((treeIndex) => { + ancestorIndicesWithSameMapping.forEach((treeIndex) => { this._treeIndexToFdmEdges.set(treeIndex, dataWithViews); }); From be06c803824df96c2a7b32f3bf76941a088eba4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Wed, 20 Sep 2023 14:58:47 +0200 Subject: [PATCH 5/8] chore: cleanup and lint fix --- .../NodeCacheProvider/NodeCacheProvider.tsx | 2 +- .../NodeCacheProvider/RevisionFdmNodeCache.ts | 42 ++++++++++--------- react-components/src/hooks/useClickedNode.tsx | 14 ++----- .../stories/HighlightNode.stories.tsx | 6 +-- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx b/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx index 0dd182096b4..1dcfd1d9d92 100644 --- a/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx +++ b/react-components/src/components/NodeCacheProvider/NodeCacheProvider.tsx @@ -50,7 +50,7 @@ export const useMappedEdgesForRevisions = ( ); }; -export const useFdm3dNodeData = ( +export const useFdm3dNodeDataPromises = ( modelId: number | undefined, revisionId: number | undefined, treeIndex: number | undefined diff --git a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts index 38b6653f925..02948454757 100644 --- a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts +++ b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts @@ -10,8 +10,7 @@ import { type FdmCadEdge, type FdmNodeDataPromises, type CadNodeWithEdges, - type AncestorQueryResult, - CadNodeWithFdmIds + type AncestorQueryResult } from './types'; import { @@ -84,10 +83,10 @@ export class RevisionFdmNodeCache { edges: cachedFdmData.map((data) => data.edge) }; - return await this.getAndCacheViewsPromiseForNodeData( - cadNodeWithEdges, - [cadNode.treeIndex, searchTreeIndex] - ); + return await this.getAndCacheViewsPromiseForNodeData(cadNodeWithEdges, [ + cadNode.treeIndex, + searchTreeIndex + ]); } private findAndCacheNodeDataFromAncestors(treeIndex: TreeIndex): FdmNodeDataPromises { @@ -95,24 +94,28 @@ export class RevisionFdmNodeCache { const cadAndEdgesPromise = this.getCadAndEdgesPromiseForAncestorData(ancestorDataPromise); const cadAndFdmNodesPromise = cadAndEdgesPromise.then((cadAndEdges) => - cadAndEdges !== undefined - ? { cadNode: cadAndEdges.cadNode, fdmIds: cadAndEdges.edges.map((edge) => edge.startNode) } - : undefined + cadAndEdges === undefined + ? undefined + : { cadNode: cadAndEdges.cadNode, fdmIds: cadAndEdges.edges.map((edge) => edge.startNode) } ); - const viewsPromise = this.getViewsPromiseFromDataPromises(cadAndEdgesPromise, ancestorDataPromise); + const viewsPromise = this.getViewsPromiseFromDataPromises( + cadAndEdgesPromise, + ancestorDataPromise + ); return { cadAndFdmNodesPromise, viewsPromise }; } - private async getViewsPromiseFromDataPromises(cadAndEdgesPromise: Promise, - ancestorDataPromise: Promise): Promise { - - const cadAndEdges = await cadAndEdgesPromise; - const { ancestorsWithSameMapping } = await ancestorDataPromise; - const ancestorTreeIndexes = ancestorsWithSameMapping.map(ancestor => ancestor.treeIndex); + private async getViewsPromiseFromDataPromises( + cadAndEdgesPromise: Promise, + ancestorDataPromise: Promise + ): Promise { + const cadAndEdges = await cadAndEdgesPromise; + const { ancestorsWithSameMapping } = await ancestorDataPromise; + const ancestorTreeIndexes = ancestorsWithSameMapping.map((ancestor) => ancestor.treeIndex); - return this.getAndCacheViewsPromiseForNodeData(cadAndEdges, ancestorTreeIndexes); + return await this.getAndCacheViewsPromiseForNodeData(cadAndEdges, ancestorTreeIndexes); } private async getCadAndEdgesPromiseForAncestorData( @@ -122,7 +125,7 @@ export class RevisionFdmNodeCache { await ancestorDataPromise; if (edges.length === 0) { - this.setSameCacheForNodes(ancestorsWithSameMapping, []); + this.setCacheDataForNodes(ancestorsWithSameMapping, []); return undefined; } @@ -135,7 +138,7 @@ export class RevisionFdmNodeCache { return { cadNode: firstMappedAncestor, edges }; } - private setSameCacheForNodes(nodes: Node3D[], nodeData: FdmEdgeWithNode[]): void { + private setCacheDataForNodes(nodes: Node3D[], nodeData: FdmEdgeWithNode[]): void { nodes.forEach((node) => { this._treeIndexToFdmEdges.set(node.treeIndex, nodeData); }); @@ -146,7 +149,6 @@ export class RevisionFdmNodeCache { ancestorIndicesWithSameMapping: TreeIndex[] ): Promise { if (cadAndFdmIds === undefined) { - ancestorIndicesWithSameMapping.forEach((treeIndex) => { this._treeIndexToFdmEdges.set(treeIndex, []); }); diff --git a/react-components/src/hooks/useClickedNode.tsx b/react-components/src/hooks/useClickedNode.tsx index 2ac037dc8cf..5a7e8e1a9ec 100644 --- a/react-components/src/hooks/useClickedNode.tsx +++ b/react-components/src/hooks/useClickedNode.tsx @@ -5,7 +5,7 @@ import { type CadIntersection, type PointerEventData } from '@cognite/reveal'; import { type DmsUniqueIdentifier, type Source, useReveal } from '../'; import { useEffect, useState } from 'react'; -import { useFdm3dNodeData } from '../components/NodeCacheProvider/NodeCacheProvider'; +import { useFdm3dNodeDataPromises } from '../components/NodeCacheProvider/NodeCacheProvider'; import { type Node3D } from '@cognite/sdk'; import { type CadNodeWithFdmIds, @@ -48,18 +48,15 @@ export const useClickedNodeData = (): ClickedNodeData | undefined => { }; }, [viewer]); - const nodeData = useFdm3dNodeData( + const nodeDataPromises = useFdm3dNodeDataPromises( cadIntersection?.model.modelId, cadIntersection?.model.revisionId, cadIntersection?.treeIndex ).data; useEffect(() => { - if (isWaitingForQueryResult()) { - return; - } + void setClickedNodeFromQueryResult(nodeDataPromises); - void setClickedNodeFromQueryResult(nodeData); async function setClickedNodeFromQueryResult( promises: FdmNodeDataPromises | undefined ): Promise { @@ -107,10 +104,7 @@ export const useClickedNodeData = (): ClickedNodeData | undefined => { view: views[0] }); } - function isWaitingForQueryResult(): boolean { - return nodeData === undefined && cadIntersection !== undefined; - } - }, [nodeData]); + }, [nodeDataPromises]); return clickedNodeData; }; diff --git a/react-components/stories/HighlightNode.stories.tsx b/react-components/stories/HighlightNode.stories.tsx index 48bb13e40c8..df25186cfc7 100644 --- a/react-components/stories/HighlightNode.stories.tsx +++ b/react-components/stories/HighlightNode.stories.tsx @@ -63,6 +63,8 @@ const StoryContent = ({ resources }: { resources: AddResourceOptions[] }): React const nodeData = useClickedNodeData(); useEffect(() => { + console.log('Clicked node data', nodeData); + if (nodeData?.fdmNode === undefined) { setStylingGroups([]); return; @@ -78,9 +80,7 @@ const StoryContent = ({ resources }: { resources: AddResourceOptions[] }): React ]); void cameraNavigation.fitCameraToInstance(nodeData.fdmNode.externalId, nodeData.fdmNode.space); - - console.log('Clicked node data', nodeData); - }, [nodeData?.fdmNode]); + }, [nodeData]); return ( <> From cae101dd55a9db51518b40067e949ee9730c1fd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Wed, 20 Sep 2023 15:17:04 +0200 Subject: [PATCH 6/8] revert: revert change to HighlightNodestory --- react-components/stories/HighlightNode.stories.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/react-components/stories/HighlightNode.stories.tsx b/react-components/stories/HighlightNode.stories.tsx index df25186cfc7..48bb13e40c8 100644 --- a/react-components/stories/HighlightNode.stories.tsx +++ b/react-components/stories/HighlightNode.stories.tsx @@ -63,8 +63,6 @@ const StoryContent = ({ resources }: { resources: AddResourceOptions[] }): React const nodeData = useClickedNodeData(); useEffect(() => { - console.log('Clicked node data', nodeData); - if (nodeData?.fdmNode === undefined) { setStylingGroups([]); return; @@ -80,7 +78,9 @@ const StoryContent = ({ resources }: { resources: AddResourceOptions[] }): React ]); void cameraNavigation.fitCameraToInstance(nodeData.fdmNode.externalId, nodeData.fdmNode.space); - }, [nodeData]); + + console.log('Clicked node data', nodeData); + }, [nodeData?.fdmNode]); return ( <> From 7a42be1f037a0d7ef7b25f896c36367687d39910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Fri, 22 Sep 2023 15:03:17 +0200 Subject: [PATCH 7/8] fix: make sure to use views cached in ancestor tree index --- .../NodeCacheProvider/RevisionFdmNodeCache.ts | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts index 02948454757..24ebceb0015 100644 --- a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts +++ b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts @@ -115,6 +115,18 @@ export class RevisionFdmNodeCache { const { ancestorsWithSameMapping } = await ancestorDataPromise; const ancestorTreeIndexes = ancestorsWithSameMapping.map((ancestor) => ancestor.treeIndex); + const cachedTreeIndexesDescending = ancestorTreeIndexes.filter(treeIndex => this._treeIndexToFdmEdges.has(treeIndex)) + .sort((a, b) => b - a); + + const cachedNodeData = cachedTreeIndexesDescending.length !== 0 ? + this._treeIndexToFdmEdges.get(cachedTreeIndexesDescending[0]) : + undefined; + + if (checkDefinedView(cachedNodeData)) { + this.setCacheDataForTreeIndices(ancestorTreeIndexes, cachedNodeData); + return cachedNodeData.map(data => data.view); + } + return await this.getAndCacheViewsPromiseForNodeData(cadAndEdges, ancestorTreeIndexes); } @@ -125,7 +137,7 @@ export class RevisionFdmNodeCache { await ancestorDataPromise; if (edges.length === 0) { - this.setCacheDataForNodes(ancestorsWithSameMapping, []); + this.setCacheDataForTreeIndices(ancestorsWithSameMapping.map(a => a.treeIndex), []); return undefined; } @@ -138,9 +150,9 @@ export class RevisionFdmNodeCache { return { cadNode: firstMappedAncestor, edges }; } - private setCacheDataForNodes(nodes: Node3D[], nodeData: FdmEdgeWithNode[]): void { - nodes.forEach((node) => { - this._treeIndexToFdmEdges.set(node.treeIndex, nodeData); + private setCacheDataForTreeIndices(treeIndices: number[], nodeData: FdmEdgeWithNode[]): void { + treeIndices.forEach((treeIndex) => { + this._treeIndexToFdmEdges.set(treeIndex, nodeData); }); } @@ -302,11 +314,7 @@ function getAncestorDataForTreeIndex( treeIndex: TreeIndex, edgesWithTreeIndex: Array<{ edge: FdmCadEdge; treeIndex: TreeIndex }>, ancestors: Node3D[] -): { - edges: FdmCadEdge[]; - ancestorsWithSameMapping: Node3D[]; - firstMappedAncestorTreeIndex: number; -} { +): AncestorQueryResult { const edgesForTreeIndex = edgesWithTreeIndex.filter( (edgeAndTreeIndex) => edgeAndTreeIndex.treeIndex === treeIndex ); From 6ac7b9a0f222a982524b75372e8ab9e6824fd9f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Fri, 22 Sep 2023 15:36:30 +0200 Subject: [PATCH 8/8] chore: lint fix --- .../NodeCacheProvider/RevisionFdmNodeCache.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts index 24ebceb0015..57a4f0ece23 100644 --- a/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts +++ b/react-components/src/components/NodeCacheProvider/RevisionFdmNodeCache.ts @@ -115,16 +115,18 @@ export class RevisionFdmNodeCache { const { ancestorsWithSameMapping } = await ancestorDataPromise; const ancestorTreeIndexes = ancestorsWithSameMapping.map((ancestor) => ancestor.treeIndex); - const cachedTreeIndexesDescending = ancestorTreeIndexes.filter(treeIndex => this._treeIndexToFdmEdges.has(treeIndex)) + const cachedTreeIndexesDescending = ancestorTreeIndexes + .filter((treeIndex) => this._treeIndexToFdmEdges.has(treeIndex)) .sort((a, b) => b - a); - const cachedNodeData = cachedTreeIndexesDescending.length !== 0 ? - this._treeIndexToFdmEdges.get(cachedTreeIndexesDescending[0]) : - undefined; + const cachedNodeData = + cachedTreeIndexesDescending.length !== 0 + ? this._treeIndexToFdmEdges.get(cachedTreeIndexesDescending[0]) + : undefined; if (checkDefinedView(cachedNodeData)) { this.setCacheDataForTreeIndices(ancestorTreeIndexes, cachedNodeData); - return cachedNodeData.map(data => data.view); + return cachedNodeData.map((data) => data.view); } return await this.getAndCacheViewsPromiseForNodeData(cadAndEdges, ancestorTreeIndexes); @@ -137,7 +139,10 @@ export class RevisionFdmNodeCache { await ancestorDataPromise; if (edges.length === 0) { - this.setCacheDataForTreeIndices(ancestorsWithSameMapping.map(a => a.treeIndex), []); + this.setCacheDataForTreeIndices( + ancestorsWithSameMapping.map((a) => a.treeIndex), + [] + ); return undefined; }