@@ -4,8 +4,9 @@ import { useDragStore } from "@/stores/useDragStore";
44import {
55 useAddItemToStack ,
66 useCanvas ,
7+ useChildrenMap ,
78 useClearNode ,
8- useCurNodes ,
9+ useNodeMap ,
910 useSelectedNodeId ,
1011 useSelectNode ,
1112 useSetCanvas ,
@@ -19,29 +20,30 @@ import {
1920import handleWheel from "@/utils/editor/handleWheel" ;
2021import { DragProvider } from "@repo/ui/context/dragContext" ;
2122import EditorNodeWrapper from "@repo/ui/core/EditorNodeWrapper" ;
23+ import FlowNodeWrapper from "@repo/ui/core/FlowNodeWrapper" ;
2224import NodeRenderer from "@repo/ui/core/NodeRenderer" ;
2325import SelectionOverlay from "@repo/ui/core/SelectionOverlay" ;
2426import { WcxNode } from "@repo/ui/types/nodes" ;
2527import React , { useRef } from "react" ;
2628
2729export default function Canvas ( ) {
28- const nodes = useCurNodes ( ) ;
2930 const selectedNodeId = useSelectedNodeId ( ) ;
3031 const selectNode = useSelectNode ( ) ;
3132 const updateNode = useUpdateNodeLayout ( ) ;
3233 const canvasState = useCanvas ( ) ;
3334 const setCanvas = useSetCanvas ( ) ;
3435 const clearNode = useClearNode ( ) ;
3536 const addItemToStack = useAddItemToStack ( ) ;
37+ const nodeMap = useNodeMap ( ) ;
38+ const childrenMap = useChildrenMap ( ) ;
3639
3740 //TODO-이거 뭐임?
3841 const isPanning = useRef ( false ) ;
3942 const lastMousePos = useRef ( { x : 0 , y : 0 } ) ;
4043
4144 function getParentNode ( parentId : string | null ) : WcxNode | undefined {
4245 if ( ! parentId ) return undefined ;
43-
44- return nodes ?. find ( ( n ) => n . id === parentId ) ;
46+ return nodeMap [ parentId ] ;
4547 }
4648
4749 //FIXME-각 노드들에 key속성 추가해주기. -> 리액트 경고 발생
@@ -54,28 +56,14 @@ export default function Canvas() {
5456 * parentNode만 주면 NodeTree함수가 알아서 ParentNode의 자식 노드 객체 배열(WcxNode[])을 찾아준다.
5557 */
5658 function renderTree ( parentNode : WcxNode | { id : null } ) {
57- //parentNode의 자식 찾기
58- const childrenObjArr = nodes
59- ?. filter ( ( { parent_id } ) => parent_id === parentNode . id )
60- . sort ( ( a , b ) => a . position - b . position ) ;
59+ // parentNode의 자식 찾기 (O(1) lookup via childrenMap)
60+ const childrenObjArr = childrenMap [ parentNode . id ?? "__root__" ] ;
6161
6262 //BaseCondition
6363 //FIXME-솔직히 !childrenArr만 있어도 될듯? 길이가 0일 수가 없다.
6464 if ( ! childrenObjArr || childrenObjArr . length === 0 ) {
6565 if ( parentNode . id === null ) return ;
66- return (
67- < EditorNodeWrapper
68- node = { parentNode }
69- parentNode = { getParentNode ( parentNode . parent_id ) }
70- selectedId = { selectedNodeId }
71- updateNode = { updateNode }
72- selectNode = { selectNode }
73- canvas = { canvasState }
74- addItemToStack = { addItemToStack }
75- >
76- < NodeRenderer node = { parentNode } />
77- </ EditorNodeWrapper >
78- ) ;
66+ return renderWrappedNode ( parentNode , < NodeRenderer node = { parentNode } /> ) ;
7967 }
8068
8169 // 1. 자식들의 렌더링 결과물 (JSX 배열)
@@ -89,17 +77,48 @@ export default function Canvas() {
8977 }
9078
9179 // 3. 일반 노드인 경우 -> Wrapper + NodeRenderer + children
80+ return renderWrappedNode (
81+ parentNode ,
82+ < NodeRenderer node = { parentNode } > { children } </ NodeRenderer > ,
83+ ) ;
84+ }
85+
86+ /**
87+ * 노드 유형에 따라 적절한 래퍼를 선택하여 렌더링합니다.
88+ * - Stack 내부 flow 아이템 → FlowNodeWrapper (Rnd 미사용, CSS 기반 크기)
89+ * - 그 외 → EditorNodeWrapper (Rnd 기반 드래그/리사이즈)
90+ */
91+ function renderWrappedNode ( node : WcxNode , content : React . ReactNode ) {
92+ const parent = getParentNode ( node . parent_id ) ;
93+ const isFlowItem =
94+ parent ?. type === "Stack" && node . style . position === "relative" ;
95+
96+ if ( isFlowItem ) {
97+ return (
98+ < FlowNodeWrapper
99+ node = { node }
100+ parentNode = { parent }
101+ selectedId = { selectedNodeId }
102+ updateNode = { updateNode }
103+ selectNode = { selectNode }
104+ canvas = { canvasState }
105+ >
106+ { content }
107+ </ FlowNodeWrapper >
108+ ) ;
109+ }
110+
92111 return (
93112 < EditorNodeWrapper
94- node = { parentNode }
95- parentNode = { getParentNode ( parentNode . parent_id ) }
113+ node = { node }
114+ parentNode = { parent }
96115 selectedId = { selectedNodeId }
97116 updateNode = { updateNode }
98117 selectNode = { selectNode }
99118 canvas = { canvasState }
100119 addItemToStack = { addItemToStack }
101120 >
102- < NodeRenderer node = { parentNode } > { children } </ NodeRenderer >
121+ { content }
103122 </ EditorNodeWrapper >
104123 ) ;
105124 }
0 commit comments