@@ -14,6 +14,7 @@ import {
1414 Edge ,
1515 EdgeChange ,
1616 Connection ,
17+ ReactFlowProvider ,
1718} from "@xyflow/react" ;
1819import "@xyflow/react/dist/style.css" ;
1920import { 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