1- import { useEffect , useMemo , useState } from "react"
1+ import { useCallback , useEffect , useMemo , useState } from "react"
2+ import { useNavigate , useLocation , useSearchParams } from "react-router-dom"
23
34import {
45 type Model ,
@@ -24,18 +25,47 @@ type Props = {
2425}
2526
2627export default function DataFlow ( { block } : Props ) {
27- const [ selectedIds , setSelectedIds ] = useState < string [ ] > ( [ ] )
28+ const { hash } = useLocation ( )
29+ const navigate = useNavigate ( )
30+
31+ const [ selectedIds , setSelectedIds ] = useState < string [ ] > ( )
32+ const onSelect = useCallback (
33+ ( ids : string [ ] ) => {
34+ setSelectedIds ( ids )
35+ if ( ids . length === 1 ) {
36+ const id = ids [ 0 ] . replace ( / - ( r e s u l t | \d + ) $ / , "" )
37+ navigate ( `?detail&type=block&id=${ id } ${ hash } ` )
38+ }
39+ } ,
40+ [ setSelectedIds , hash , navigate ] ,
41+ )
2842
2943 const { nodes, edges } = useMemo ( ( ) => computeModel ( block ) , [ block ] )
3044
45+ const [ searchParams ] = useSearchParams ( )
46+ const selectedFromSearch = searchParams . get ( "id" )
47+ useEffect ( ( ) => {
48+ if ( selectedFromSearch ) {
49+ const node = nodes
50+ . filter ( ( { id, group } ) => ! group && id . includes ( selectedFromSearch ) )
51+ . sort ( ) [ 0 ]
52+ if ( node ) {
53+ setSelectedIds ( [ node . id ] )
54+ }
55+ } else {
56+ setSelectedIds ( [ ] )
57+ }
58+ } , [ setSelectedIds , selectedFromSearch , nodes ] )
59+ const state = useMemo ( ( ) => ( { selectedIds } ) , [ selectedIds ] )
60+
3161 const controller = useMemo ( ( ) => {
3262 const newController = new Visualization ( )
3363 newController . registerLayoutFactory ( layoutFactory )
3464 newController . registerComponentFactory ( componentFactory )
35- newController . addEventListener ( SELECTION_EVENT , setSelectedIds )
65+ newController . addEventListener ( SELECTION_EVENT , onSelect )
3666
3767 return newController
38- } , [ ] )
68+ } , [ onSelect ] )
3969
4070 useEffect ( ( ) => {
4171 const model : Model = {
@@ -52,7 +82,7 @@ export default function DataFlow({ block }: Props) {
5282 setTimeout ( ( ) => {
5383 controller . getGraph ( ) . reset ( )
5484 controller . getGraph ( ) . layout ( )
55- } , 100 )
85+ } , 50 )
5686 } , [ nodes , edges , controller ] )
5787
5888 return (
@@ -80,7 +110,7 @@ export default function DataFlow({ block }: Props) {
80110 }
81111 >
82112 < VisualizationProvider controller = { controller } >
83- < VisualizationSurface state = { { selectedIds } } />
113+ < VisualizationSurface state = { state } />
84114 </ VisualizationProvider >
85115 </ TopologyView >
86116 )
0 commit comments