Skip to content

Commit 63e3895

Browse files
add expand all, root node ids props to layer hierarchy
1 parent 18207ba commit 63e3895

File tree

1 file changed

+63
-11
lines changed

1 file changed

+63
-11
lines changed

editor/components/editor/editor-hierarchy-layers/editor-layer-hierarchy-tree.tsx

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,77 @@
1-
import React, { useCallback, useMemo, useState } from "react";
1+
import React, { useCallback, useEffect, useMemo, useState } from "react";
22
import { TreeView } from "@editor-ui/editor";
33
import {
44
LayerRow,
55
IconContainer,
66
LayerIcon,
77
} from "./editor-layer-hierarchy-item";
8-
import { useEditorState, useWorkspace } from "core/states";
8+
import {
9+
FigmaReflectRepository,
10+
useEditorState,
11+
useWorkspace,
12+
} from "core/states";
913
import { useDispatch } from "core/dispatch";
1014
import {
1115
flattenNodeTree,
1216
FlattenedDisplayItemNode,
1317
} from "./editor-layer-heriarchy-controller";
18+
import type { ReflectSceneNode } from "@design-sdk/figma-node";
1419

1520
// TODO:
1621
// - add navigate context menu
1722
// - add go to main component
1823
// - add reveal and focus to selected layers
1924

20-
export function DesignLayerHierarchy() {
25+
/**
26+
*
27+
* @param props.rootNodeIDs - root node ids to display @default: null
28+
* @param props.expandAll - expand all nodes by default @default: false
29+
* @returns
30+
*/
31+
export function DesignLayerHierarchy({
32+
rootNodeIDs = null,
33+
expandAll = false,
34+
}: {
35+
rootNodeIDs?: string[];
36+
expandAll?: boolean;
37+
}) {
2138
const [state] = useEditorState();
39+
const { selectedNodes, selectedPage, design } = state;
2240
const { highlightLayer, highlightedLayer } = useWorkspace();
2341
const dispatch = useDispatch();
2442

25-
const { selectedNodes, selectedPage, design } = state;
26-
2743
const [expands, setExpands] = useState<string[]>(state?.selectedNodes ?? []);
2844

29-
const root = selectedPage
30-
? design.pages.find((p) => p.id == selectedPage).children
31-
: [design?.input?.entry];
45+
// get the root nodes (if the rootNodeIDs is not specified, use the selected page's children)
46+
let roots: ReflectSceneNode[] = [];
47+
if (rootNodeIDs?.length > 0) {
48+
roots = rootNodeIDs.reduce((acc, item) => {
49+
acc.push(findUnder(item, design));
50+
return acc;
51+
}, []);
52+
} else {
53+
roots = selectedPage
54+
? design.pages.find((p) => p.id == selectedPage).children
55+
: [design?.input?.entry];
56+
}
3257

3358
const layers: FlattenedDisplayItemNode[][] = useMemo(() => {
34-
return root
35-
? root
59+
return roots
60+
? roots
3661
.filter(Boolean)
3762
.map((layer) => flattenNodeTree(layer, selectedNodes, expands))
3863
: [];
39-
}, [root, state?.selectedNodes, expands]);
64+
}, [roots, state?.selectedNodes, expands]);
65+
66+
useEffect(() => {
67+
if (expandAll) {
68+
const ids = layers.reduce((acc, item) => {
69+
acc.push(...item.map((i) => i.id));
70+
return acc;
71+
}, [] as string[]);
72+
setExpands(ids);
73+
}
74+
}, [layers, expandAll]);
4075

4176
const renderItem = useCallback(
4277
({
@@ -96,3 +131,20 @@ export function DesignLayerHierarchy() {
96131
);
97132
//
98133
}
134+
135+
/**
136+
* This only supports root frame at the moment.
137+
* partof: nodeQ
138+
* @param node
139+
* @param design
140+
* @returns
141+
*/
142+
function findUnder(node: string, design: FigmaReflectRepository) {
143+
for (const page of design.pages) {
144+
for (const frame of page.children) {
145+
if (frame.id === node) {
146+
return frame;
147+
}
148+
}
149+
}
150+
}

0 commit comments

Comments
 (0)