1- import React , { useCallback , useMemo , useRef , useState } from 'react' ;
1+ import React , {
2+ useCallback ,
3+ useMemo ,
4+ useRef ,
5+ useEffect ,
6+ useState ,
7+ } from 'react' ;
28import { connect } from 'react-redux' ;
39import type { DataModelingState } from '../store/reducer' ;
410import {
@@ -28,9 +34,11 @@ import {
2834 type NodeProps ,
2935 type EdgeProps ,
3036 useDiagram ,
37+ applyLayout ,
3138} from '@mongodb-js/diagramming' ;
3239import type { Edit , StaticModel } from '../services/data-model-storage' ;
3340import { UUID } from 'bson' ;
41+ import { initial } from 'lodash' ;
3442
3543const loadingContainerStyles = css ( {
3644 width : '100%' ,
@@ -135,6 +143,7 @@ const DiagramEditor: React.FunctionComponent<{
135143 const isDarkMode = useDarkMode ( ) ;
136144 const diagramContainerRef = useRef < HTMLDivElement | null > ( null ) ;
137145 const diagram = useDiagram ( ) ;
146+ const [ nodes , setNodes ] = useState < NodeProps [ ] > ( [ ] ) ;
138147
139148 const setDiagramContainerRef = useCallback (
140149 ( ref : HTMLDivElement | null ) => {
@@ -208,8 +217,26 @@ const DiagramEditor: React.FunctionComponent<{
208217 } ) ;
209218 } , [ model ?. relationships ] ) ;
210219
211- const nodes = useMemo ( ( ) => {
212- return ( model ?. collections ?? [ ] ) . map (
220+ const applyInitialLayout = useCallback (
221+ async ( storedNodes : NodeProps [ ] ) => {
222+ console . log ( 'INITIAL STATE: applying layout' ) ;
223+ try {
224+ const { nodes : positionedNodes } = await applyLayout (
225+ storedNodes ,
226+ edges ,
227+ 'STAR'
228+ ) ;
229+ // TODO: save the new positions to the model
230+ setNodes ( positionedNodes ) ;
231+ } catch ( err ) {
232+ console . error ( 'Error applying layout:' , err ) ;
233+ }
234+ } ,
235+ [ setNodes ]
236+ ) ;
237+
238+ useEffect ( ( ) => {
239+ const storedNodes = ( model ?. collections ?? [ ] ) . map (
213240 ( coll ) : NodeProps => ( {
214241 id : coll . ns ,
215242 type : 'collection' ,
@@ -234,12 +261,16 @@ const DiagramEditor: React.FunctionComponent<{
234261 } ;
235262 }
236263 ) ,
237- measured : {
238- width : 100 ,
239- height : 200 ,
240- } ,
241264 } )
242265 ) ;
266+ const isInitialState = storedNodes . every (
267+ ( node ) => node . position . x === - 1 && node . position . y === - 1
268+ ) ;
269+ if ( isInitialState ) {
270+ void applyInitialLayout ( storedNodes ) ;
271+ return ;
272+ }
273+ setNodes ( storedNodes ) ;
243274 } , [ model ?. collections ] ) ;
244275
245276 let content ;
0 commit comments