Skip to content

Commit 78d5625

Browse files
authored
refactor: 인터랙션 로직 통합 및 prop 전달 개선 (#13)
1 parent b384d6b commit 78d5625

File tree

4 files changed

+387
-409
lines changed

4 files changed

+387
-409
lines changed

packages/frontend/src/components/space/SpaceView.tsx

Lines changed: 73 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import { createSpace } from "@/api/space";
1212
import Edge from "@/components/Edge";
1313
import { HeadNode, NoteNode, SubspaceNode } from "@/components/Node";
1414
import useAutofit from "@/hooks/useAutofit";
15-
import useDragNode from "@/hooks/useDragNode";
16-
import useMoveNode from "@/hooks/useMoveNode";
15+
import useSpaceInteractions from "@/hooks/useSpaceInteractions";
1716
import useSpaceSelection from "@/hooks/useSpaceSelection";
1817
import useYjsSpace from "@/hooks/useYjsSpace";
1918
import { useZoomSpace } from "@/hooks/useZoomSpace";
@@ -35,7 +34,7 @@ const dragBoundFunc = function (this: Konva.Node) {
3534

3635
export default function SpaceView({ spaceId, autofitTo }: SpaceViewProps) {
3736
const stageRef = React.useRef<Konva.Stage>(null);
38-
const stageSize = useAutofit(autofitTo); // useAutofit 호출
37+
const stageSize = useAutofit(autofitTo);
3938
const { zoomSpace, handleTouchMove, handleTouchEnd } = useZoomSpace({
4039
stageRef,
4140
});
@@ -52,69 +51,71 @@ export default function SpaceView({ spaceId, autofitTo }: SpaceViewProps) {
5251

5352
const nodesArray = nodes ? Object.values(nodes) : [];
5453

55-
const { move, moveState } = useMoveNode({
56-
nodes: nodesArray,
57-
spaceActions: { updateNode },
58-
});
54+
const {
55+
drag,
56+
move,
57+
dropPosition,
58+
setDropPosition,
59+
handlePaletteSelect,
60+
nodeEventHandlers,
61+
} = useSpaceInteractions(nodesArray, {
62+
createNode: (type, parentNode, position, name = "New Note") => {
63+
if (type === "note") {
64+
createNote({
65+
userId: "honeyflow",
66+
noteName: name,
67+
spaceId,
68+
}).then((res) => {
69+
defineNode(
70+
{
71+
type,
72+
x: position.x,
73+
y: position.y,
74+
name,
75+
src: res.urlPath.toString(),
76+
},
77+
parentNode.id,
78+
);
79+
});
80+
return;
81+
}
5982

60-
const { drag, dropPosition, setDropPosition, handlePaletteSelect } =
61-
useDragNode(nodesArray, {
62-
createNode: (type, parentNode, position, name = "New Note") => {
63-
if (type === "note") {
64-
createNote({
65-
userId: "honeyflow",
66-
noteName: name,
67-
spaceId,
68-
}).then((res) => {
69-
defineNode(
70-
{
71-
type,
72-
x: position.x,
73-
y: position.y,
74-
name,
75-
src: res.urlPath.toString(),
76-
},
77-
parentNode.id,
78-
);
79-
});
80-
return;
81-
}
82-
83-
if (type === "subspace") {
84-
createSpace({
85-
spaceName: name,
86-
userId: "honeyflow",
87-
parentContextNodeId: spaceId,
88-
}).then((res) => {
89-
defineNode(
90-
{
91-
type,
92-
x: position.x,
93-
y: position.y,
94-
name,
95-
src: res.urlPath.toString(),
96-
},
97-
parentNode.id,
98-
);
99-
});
100-
return;
101-
}
102-
103-
defineNode(
104-
{
105-
type,
106-
x: position.x,
107-
y: position.y,
108-
name,
109-
src: "",
110-
},
111-
parentNode.id,
112-
);
113-
},
114-
createEdge: (fromNode, toNode) => {
115-
defineEdge(fromNode.id, toNode.id);
116-
},
117-
});
83+
if (type === "subspace") {
84+
createSpace({
85+
spaceName: name,
86+
userId: "honeyflow",
87+
parentContextNodeId: spaceId,
88+
}).then((res) => {
89+
defineNode(
90+
{
91+
type,
92+
x: position.x,
93+
y: position.y,
94+
name,
95+
src: res.urlPath.toString(),
96+
},
97+
parentNode.id,
98+
);
99+
});
100+
return;
101+
}
102+
103+
defineNode(
104+
{
105+
type,
106+
x: position.x,
107+
y: position.y,
108+
name,
109+
src: "",
110+
},
111+
parentNode.id,
112+
);
113+
},
114+
createEdge: (fromNode, toNode) => {
115+
defineEdge(fromNode.id, toNode.id);
116+
},
117+
updateNode,
118+
});
118119

119120
const { selectedNode, selectNode, selectedEdge, selectEdge, clearSelection } =
120121
useSpaceSelection();
@@ -198,9 +199,7 @@ export default function SpaceView({ spaceId, autofitTo }: SpaceViewProps) {
198199
key={node.id}
199200
id={node.id}
200201
name={node.name}
201-
onDragStart={() => drag.handlers.onDragStart(node)}
202-
onDragMove={drag.handlers.onDragMove}
203-
onDragEnd={() => drag.handlers.onDragEnd()}
202+
{...nodeEventHandlers(node)}
204203
dragBoundFunc={dragBoundFunc}
205204
/>
206205
),
@@ -212,20 +211,8 @@ export default function SpaceView({ spaceId, autofitTo }: SpaceViewProps) {
212211
y={node.y}
213212
name={node.name}
214213
src={node.src || ""}
215-
onDragStart={() => drag.handlers.onDragStart(node)}
216-
onDragMove={(e) => {
217-
drag.handlers.onDragMove(e);
218-
move.callbacks.monitorHoldingPosition(e);
219-
}}
220-
onDragEnd={(e) => {
221-
drag.handlers.onDragEnd(moveState.isMoving);
222-
move.callbacks.endMove(e);
223-
}}
214+
{...nodeEventHandlers(node)}
224215
dragBoundFunc={dragBoundFunc}
225-
onMouseDown={(e) => move.callbacks.startHold(node, e)}
226-
onMouseUp={move.callbacks.endHold}
227-
onTouchStart={(e) => move.callbacks.startHold(node, e)}
228-
onTouchEnd={move.callbacks.endHold}
229216
onContextMenu={handleContextMenu}
230217
onMouseEnter={handleHover}
231218
onMouseLeave={handleHover}
@@ -239,20 +226,8 @@ export default function SpaceView({ spaceId, autofitTo }: SpaceViewProps) {
239226
y={node.y}
240227
name={node.name}
241228
src={node.src || ""}
242-
onDragStart={() => drag.handlers.onDragStart(node)}
243-
onDragMove={(e) => {
244-
drag.handlers.onDragMove(e);
245-
move.callbacks.monitorHoldingPosition(e);
246-
}}
247-
onDragEnd={(e) => {
248-
drag.handlers.onDragEnd(moveState.isMoving);
249-
move.callbacks.endMove(e);
250-
}}
229+
{...nodeEventHandlers(node)}
251230
dragBoundFunc={dragBoundFunc}
252-
onMouseDown={(e) => move.callbacks.startHold(node, e)}
253-
onMouseUp={move.callbacks.endHold}
254-
onTouchStart={(e) => move.callbacks.startHold(node, e)}
255-
onTouchEnd={move.callbacks.endHold}
256231
onContextMenu={handleContextMenu}
257232
onMouseEnter={handleHover}
258233
onMouseLeave={handleHover}
@@ -274,11 +249,11 @@ export default function SpaceView({ spaceId, autofitTo }: SpaceViewProps) {
274249
startPosition={{ x: 0, y: 0 }}
275250
dragPosition={drag.position}
276251
connectionVisible={false}
277-
color={moveState.isOverlapping ? "#ECE8E4" : "#FFF2CB"}
252+
color={move.state.isOverlapping ? "#ECE8E4" : "#FFF2CB"}
278253
/>
279254
);
280255

281-
const nearIndicatorRenderer = !moveState.isMoving &&
256+
const nearIndicatorRenderer = !move.state.isMoving &&
282257
drag.position &&
283258
drag.startNode &&
284259
drag.overlapNode &&
@@ -312,7 +287,7 @@ export default function SpaceView({ spaceId, autofitTo }: SpaceViewProps) {
312287
<Group x={dropPosition?.x} y={dropPosition?.y}>
313288
<Html>
314289
<Popover.Root
315-
open={!moveState.isMoving && Boolean(dropPosition)}
290+
open={!move.state.isMoving && Boolean(dropPosition)}
316291
onOpenChange={(open) => !open && setDropPosition(null)}
317292
>
318293
<Popover.Anchor />
@@ -359,7 +334,7 @@ export default function SpaceView({ spaceId, autofitTo }: SpaceViewProps) {
359334
draggable
360335
>
361336
<Layer>
362-
{moveState.isMoving
337+
{move.state.isMoving
363338
? gooeyNodeMovingRenderer
364339
: gooeyNodeCreatingRenderer}
365340
{nearIndicatorRenderer}

packages/frontend/src/hooks/useDragNode.ts

Lines changed: 0 additions & 148 deletions
This file was deleted.

0 commit comments

Comments
 (0)