Skip to content

Commit 5de1374

Browse files
authored
Merge pull request #158 from boostcampwm-2024/bug-fe-#153
노드들이 한번에 움직이는 문제 수정
2 parents 0850b51 + a850f3e commit 5de1374

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

frontend/src/components/canvas/index.tsx

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
Edge,
1515
EdgeChange,
1616
Connection,
17+
ReactFlowProvider,
1718
} from "@xyflow/react";
1819
import "@xyflow/react/dist/style.css";
1920
import { usePages } from "@/hooks/usePages";
@@ -30,7 +31,7 @@ interface CanvasProps {
3031
className?: string;
3132
}
3233

33-
export default function Canvas({ className }: CanvasProps) {
34+
function Flow({ className }: CanvasProps) {
3435
const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);
3536
const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);
3637
const { pages } = usePages();
@@ -70,11 +71,14 @@ export default function Canvas({ className }: CanvasProps) {
7071
const nodesMap = ydoc.getMap("nodes");
7172
const edgesMap = ydoc.getMap("edges");
7273

74+
const initialNodes = Array.from(nodesMap.values()) as Node[];
75+
setNodes(initialNodes);
76+
7377
nodesMap.observe((event) => {
7478
event.changes.keys.forEach((change, key) => {
7579
const nodeId = key;
7680
if (change.action === "add" || change.action === "update") {
77-
const node = nodesMap.get(nodeId) as Node;
81+
const updatedNode = nodesMap.get(nodeId) as Node;
7882

7983
if (change.action === "add") {
8084
queryClient.invalidateQueries({ queryKey: ["pages"] });
@@ -83,10 +87,13 @@ export default function Canvas({ className }: CanvasProps) {
8387
setNodes((nds) => {
8488
const index = nds.findIndex((n) => n.id === nodeId);
8589
if (index === -1) {
86-
return [...nds, node];
90+
return [...nds, updatedNode];
8791
}
8892
const newNodes = [...nds];
89-
newNodes[index] = node;
93+
newNodes[index] = {
94+
...updatedNode,
95+
selected: newNodes[index].selected,
96+
};
9097
return newNodes;
9198
});
9299
} else if (change.action === "delete") {
@@ -103,7 +110,6 @@ export default function Canvas({ className }: CanvasProps) {
103110

104111
return () => {
105112
wsProvider.destroy();
106-
ydoc.destroy();
107113
};
108114
}, [ydoc, queryClient]);
109115

@@ -122,42 +128,44 @@ export default function Canvas({ className }: CanvasProps) {
122128

123129
pages.forEach((page) => {
124130
const pageId = page.id.toString();
125-
//if (!existingPageIds.current.has(pageId)) {
131+
const existingNode = nodesMap.get(pageId) as Node | undefined;
132+
126133
const newNode = {
127134
id: pageId,
128-
position: {
135+
type: "note",
136+
data: { title: page.title, id: page.id },
137+
position: existingNode?.position || {
129138
x: Math.random() * 500,
130139
y: Math.random() * 500,
131140
},
132-
data: { title: page.title, id: page.id },
133-
type: "note",
141+
selected: false,
134142
};
135143

136144
nodesMap.set(pageId, newNode);
137145
existingPageIds.current.add(pageId);
138-
//}
139146
});
140-
}, [pages]);
147+
}, [pages, ydoc]);
141148

142149
const handleNodesChange = useCallback(
143150
(changes: NodeChange[]) => {
144151
if (!ydoc) return;
145152
const nodesMap = ydoc.getMap("nodes");
146153

147-
onNodesChange(changes);
148-
149154
changes.forEach((change) => {
150155
if (change.type === "position" && change.position) {
151156
const node = nodes.find((n) => n.id === change.id);
152157
if (node) {
153158
const updatedNode = {
154159
...node,
155160
position: change.position,
161+
selected: false,
156162
};
157163
nodesMap.set(change.id, updatedNode);
158164
}
159165
}
160166
});
167+
168+
onNodesChange(changes);
161169
},
162170
[nodes, onNodesChange],
163171
);
@@ -209,6 +217,7 @@ export default function Canvas({ className }: CanvasProps) {
209217
proOptions={proOptions}
210218
nodeTypes={nodeTypes}
211219
connectionMode={ConnectionMode.Loose}
220+
selectNodesOnDrag={false}
212221
>
213222
<Controls />
214223
<MiniMap />
@@ -217,3 +226,11 @@ export default function Canvas({ className }: CanvasProps) {
217226
</div>
218227
);
219228
}
229+
230+
export default function Canvas(props: CanvasProps) {
231+
return (
232+
<ReactFlowProvider>
233+
<Flow {...props} />
234+
</ReactFlowProvider>
235+
);
236+
}

0 commit comments

Comments
 (0)