@@ -12,14 +12,11 @@ import {
1212} from "@xyflow/react" ;
1313import "@xyflow/react/dist/style.css" ;
1414import { SocketIOProvider } from "y-socket.io" ;
15- import { useQueryClient } from "@tanstack/react-query" ;
1615
17- import { usePages } from "@/features/pageSidebar/api/usePages" ;
1816import useYDocStore from "@/shared/model/ydocStore" ;
1917import { calculateBestHandles } from "@/features/canvas/model/calculateHandles" ;
2018import { createSocketIOProvider } from "@/shared/api/socketProvider" ;
2119import { useCollaborativeCursors } from "./useCollaborativeCursors" ;
22- import { getSortedNodes } from "./sortNodes" ;
2320import { usePageStore } from "@/features/pageSidebar/model/pageStore" ;
2421import { useWorkspace } from "@/shared/lib/useWorkspace" ;
2522
@@ -31,8 +28,6 @@ export const useCanvas = () => {
3128 const [ nodes , setNodes , onNodesChange ] = useNodesState < Node > ( [ ] ) ;
3229 const [ edges , setEdges , onEdgesChange ] = useEdgesState < Edge > ( [ ] ) ;
3330 const workspace = useWorkspace ( ) ;
34- const { pages } = usePages ( workspace ) ;
35- const queryClient = useQueryClient ( ) ;
3631 const { ydoc } = useYDocStore ( ) ;
3732
3833 const { cursors, handleMouseMove, handleNodeDrag, handleMouseLeave } =
@@ -41,7 +36,6 @@ export const useCanvas = () => {
4136 } ) ;
4237
4338 const provider = useRef < SocketIOProvider > ( ) ;
44- const existingPageIds = useRef ( new Set < string > ( ) ) ;
4539 const holdingNodeRef = useRef < string | null > ( null ) ;
4640
4741 const currentPage = usePageStore ( ( state ) => state . currentPage ) ;
@@ -68,7 +62,6 @@ export const useCanvas = () => {
6862 useEffect ( ( ) => {
6963 const yTitleMap = ydoc . getMap ( "title" ) ;
7064 const yEmojiMap = ydoc . getMap ( "emoji" ) ;
71-
7265 const nodesMap = ydoc . getMap ( "nodes" ) ;
7366
7467 yTitleMap . observeDeep ( ( event ) => {
@@ -78,6 +71,7 @@ export const useCanvas = () => {
7871 const value = event [ 0 ] . target . toString ( ) ;
7972
8073 const existingNode = nodesMap . get ( pageId ) as YNode ;
74+ if ( ! existingNode ) return ;
8175
8276 const newNode : YNode = {
8377 id : existingNode . id ,
@@ -98,6 +92,7 @@ export const useCanvas = () => {
9892 const value = event [ 0 ] . target . toString ( ) ;
9993
10094 const existingNode = nodesMap . get ( pageId ) as YNode ;
95+ if ( ! existingNode ) return ;
10196
10297 const newNode : YNode = {
10398 id : pageId ,
@@ -110,67 +105,50 @@ export const useCanvas = () => {
110105
111106 nodesMap . set ( pageId , newNode ) ;
112107 } ) ;
113- } , [ ] ) ;
114-
108+ } , [ ydoc ] ) ;
115109 useEffect ( ( ) => {
116110 if ( ! ydoc ) return ;
117111
118112 const wsProvider = createSocketIOProvider ( `flow-room-${ workspace } ` , ydoc ) ;
119-
120113 provider . current = wsProvider ;
121114
122- const nodesMap = ydoc . getMap ( "nodes" ) ;
123- const edgesMap = ydoc . getMap ( "edges" ) ;
124-
125- const yNodes = Array . from ( nodesMap . values ( ) ) as YNode [ ] ;
126-
127- const initialNodes = yNodes . map ( ( yNode ) => {
128- const nodeEntries = Object . entries ( yNode ) . filter (
129- ( [ key ] ) => key !== "isHolding" ,
130- ) ;
131- return Object . fromEntries ( nodeEntries ) as Node ;
115+ wsProvider . on ( "sync" , ( isSynced : boolean ) => {
116+ if ( isSynced ) {
117+ const nodesMap = ydoc . getMap ( "nodes" ) ;
118+ const yNodes = Array . from ( nodesMap . values ( ) ) as YNode [ ] ;
119+ setNodes ( yNodes ) ;
120+ }
132121 } ) ;
133122
134- console . log ( initialNodes ) ;
135-
136- setNodes ( initialNodes ) ;
137-
138- let isInitialSync = true ;
123+ const nodesMap = ydoc . getMap ( "nodes" ) ;
124+ const edgesMap = ydoc . getMap ( "edges" ) ;
125+ const yEdges = Array . from ( edgesMap . values ( ) ) as Edge [ ] ;
126+ setEdges ( yEdges ) ;
139127
140128 nodesMap . observe ( ( event ) => {
141- if ( isInitialSync ) {
142- isInitialSync = false ;
143- return ;
144- }
145-
146129 event . changes . keys . forEach ( ( change , key ) => {
147130 const nodeId = key ;
148131 if ( change . action === "add" || change . action === "update" ) {
149- const updatedYNode = nodesMap . get ( nodeId ) as YNode ;
150- const updatedNodeEntries = Object . entries ( updatedYNode ) . filter (
151- ( [ key ] ) => key !== "isHolding" ,
152- ) ;
153- const updatedNode = Object . fromEntries ( updatedNodeEntries ) as Node ;
154-
155- if ( change . action === "add" ) {
156- queryClient . invalidateQueries ( { queryKey : [ "pages" ] } ) ;
157- }
158-
132+ const updatedNode = nodesMap . get ( nodeId ) as Node ;
159133 setNodes ( ( nds ) => {
160134 const index = nds . findIndex ( ( n ) => n . id === nodeId ) ;
161135 if ( index === - 1 ) {
162136 return [ ...nds , updatedNode ] ;
163137 }
164138 const newNodes = [ ...nds ] ;
165- newNodes [ index ] = {
166- ...updatedNode ,
167- selected : newNodes [ index ] . selected ,
168- } ;
139+ newNodes [ index ] = updatedNode ;
169140 return newNodes ;
170141 } ) ;
171142 } else if ( change . action === "delete" ) {
143+ // parseInt는 yjs.service.ts에서 타입 변환 로직 참고.
144+ const deletedNodeId = parseInt ( nodeId ) ;
145+ const currentPageValue = usePageStore . getState ( ) . currentPage ;
146+
147+ if ( currentPageValue === deletedNodeId ) {
148+ usePageStore . setState ( { currentPage : null , isPanelOpen : false } ) ;
149+ }
150+
172151 setNodes ( ( nds ) => nds . filter ( ( n ) => n . id !== nodeId ) ) ;
173- queryClient . invalidateQueries ( { queryKey : [ "pages" ] } ) ;
174152 }
175153 } ) ;
176154 } ) ;
@@ -183,52 +161,7 @@ export const useCanvas = () => {
183161 return ( ) => {
184162 wsProvider . destroy ( ) ;
185163 } ;
186- } , [ ydoc , queryClient ] ) ;
187-
188- useEffect ( ( ) => {
189- if ( ! pages || ! ydoc ) return ;
190-
191- const nodesMap = ydoc . getMap ( "nodes" ) ;
192- const currentPageIds = new Set ( pages . map ( ( page ) => page . id . toString ( ) ) ) ;
193-
194- existingPageIds . current . forEach ( ( pageId ) => {
195- if ( ! currentPageIds . has ( pageId ) ) {
196- nodesMap . delete ( pageId ) ;
197- existingPageIds . current . delete ( pageId ) ;
198- }
199- } ) ;
200-
201- pages . forEach ( ( page ) => {
202- const pageId = page . id . toString ( ) ;
203- const existingNode = nodesMap . get ( pageId ) as YNode | undefined ;
204-
205- const newNode : YNode = {
206- id : pageId ,
207- type : "note" ,
208- data : { title : page . title , id : page . id , emoji : page . emoji } ,
209- position : existingNode ?. position || {
210- x : Math . random ( ) * 500 ,
211- y : Math . random ( ) * 500 ,
212- } ,
213- selected : false ,
214- isHolding : false ,
215- } ;
216-
217- nodesMap . set ( pageId , newNode ) ;
218- existingPageIds . current . add ( pageId ) ;
219- } ) ;
220- } , [ pages , ydoc ] ) ;
221-
222- const sortNodes = async ( ) => {
223- const sortedNodes = await getSortedNodes ( nodes , edges ) ;
224- const nodesMap = ydoc . getMap ( "nodes" ) ;
225-
226- sortedNodes . forEach ( ( updateNode ) => {
227- nodesMap . set ( updateNode . id , updateNode ) ;
228- } ) ;
229-
230- setNodes ( sortedNodes ) ;
231- } ;
164+ } , [ ydoc , setNodes , setEdges , workspace ] ) ;
232165
233166 const handleNodesChange = useCallback (
234167 ( changes : NodeChange [ ] ) => {
@@ -275,7 +208,7 @@ export const useCanvas = () => {
275208
276209 onNodesChange ( changes ) ;
277210 } ,
278- [ nodes , edges , onNodesChange ] ,
211+ [ nodes , edges , onNodesChange , ydoc ] ,
279212 ) ;
280213
281214 const handleEdgesChange = useCallback (
@@ -291,7 +224,7 @@ export const useCanvas = () => {
291224
292225 onEdgesChange ( changes ) ;
293226 } ,
294- [ onEdgesChange ] ,
227+ [ onEdgesChange , ydoc ] ,
295228 ) ;
296229
297230 const onConnect = useCallback (
@@ -360,7 +293,6 @@ export const useCanvas = () => {
360293 onNodeDragStart,
361294 onNodeDragStop,
362295 onConnect,
363- sortNodes,
364296 cursors,
365297 } ;
366298} ;
0 commit comments