@@ -3,58 +3,77 @@ import { getProviderLinks } from "../../api";
33import debounce from "lodash.debounce" ;
44import { slateDropdown } from "../../styles/dropdownStyles" ;
55
6- export function DatabaseSelector ( { providers, onQueryUrlChange } ) {
6+ export function DatabaseSelector ( {
7+ providers,
8+ onQueryUrlChange,
9+ onChildChange,
10+ } ) {
711 const [ selectedProvider , setSelectedProvider ] = useState ( "" ) ;
812 const [ childEntries , setChildEntries ] = useState ( [ ] ) ;
9- const [ childSelected , setChildSelected ] = useState ( "" ) ;
13+ const [ childSelected , setChildSelected ] = useState ( null ) ; // full object
1014 const [ customUrl , setCustomUrl ] = useState ( "" ) ;
1115 const [ loadingChildren , setLoadingChildren ] = useState ( false ) ;
1216
13- // 700 ms between no typing before setting url.
1417 const handleCustomChange = debounce ( ( val ) => setCustomUrl ( val ) , 700 ) ;
1518
1619 useEffect ( ( ) => {
17- if ( ! selectedProvider || selectedProvider === "__custom__" ) {
20+ if ( ! selectedProvider ) {
1821 setChildEntries ( [ ] ) ;
19- setChildSelected ( "" ) ;
22+ setChildSelected ( null ) ;
23+ onQueryUrlChange ( "" ) ;
24+ onChildChange ?. ( null ) ;
25+ return ;
26+ }
27+
28+ if ( selectedProvider === "__custom__" ) {
29+ setChildEntries ( [ ] ) ;
30+ setChildSelected ( null ) ;
2031 onQueryUrlChange ( customUrl || "" ) ;
32+ onChildChange ?. ( null ) ;
2133 return ;
2234 }
2335
2436 async function fetchChildren ( ) {
2537 try {
26- setLoadingChildren ( true ) ; // start loading
38+ setLoadingChildren ( true ) ;
2739 const { children } = await getProviderLinks ( selectedProvider ) ;
2840 const entries = children . map ( ( c ) => c . attributes || { } ) ;
2941 setChildEntries ( entries ) ;
3042
3143 if ( entries . length === 1 ) {
32- // Auto-select the only child
33- setChildSelected ( entries [ 0 ] . base_url ) ;
44+ setChildSelected ( entries [ 0 ] ) ;
45+ onQueryUrlChange ( entries [ 0 ] . base_url ) ;
46+ onChildChange ?. ( entries [ 0 ] ) ;
3447 } else {
35- setChildSelected ( "" ) ;
48+ setChildSelected ( null ) ;
49+ onQueryUrlChange ( "" ) ;
50+ onChildChange ?. ( null ) ;
3651 }
3752 } catch ( err ) {
3853 console . error ( err ) ;
3954 setChildEntries ( [ ] ) ;
40- setChildSelected ( "" ) ;
55+ setChildSelected ( null ) ;
56+ onQueryUrlChange ( "" ) ;
57+ onChildChange ?. ( null ) ;
4158 } finally {
42- setLoadingChildren ( false ) ; // stop loading
59+ setLoadingChildren ( false ) ;
4360 }
4461 }
4562
4663 fetchChildren ( ) ;
4764 } , [ selectedProvider ] ) ;
4865
4966 useEffect ( ( ) => {
50- const url =
51- selectedProvider === "__custom__"
52- ? customUrl
53- : childSelected
54- ? childSelected
55- : "" ;
56- onQueryUrlChange ( url ) ;
57- } , [ selectedProvider , childSelected , customUrl , onQueryUrlChange ] ) ;
67+ if ( selectedProvider === "__custom__" ) {
68+ onQueryUrlChange ( customUrl || "" ) ;
69+ onChildChange ?. ( null ) ;
70+ } else if ( childSelected ) {
71+ onQueryUrlChange ( childSelected . base_url ) ;
72+ onChildChange ?. ( childSelected ) ;
73+ }
74+ } , [ customUrl , childSelected , selectedProvider ] ) ;
75+
76+ console . log ( "childSelected" , childSelected ) ;
5877
5978 return (
6079 < div className = "flex flex-col items-start space-y-2 w-full max-w-md" >
@@ -86,9 +105,14 @@ export function DatabaseSelector({ providers, onQueryUrlChange }) {
86105 />
87106 ) : (
88107 < select
89- className = { `${ slateDropdown } ` }
90- value = { childSelected }
91- onChange = { ( e ) => setChildSelected ( e . target . value ) }
108+ className = { slateDropdown }
109+ value = { childSelected ?. base_url || "" }
110+ onChange = { ( e ) => {
111+ const selected = childEntries . find (
112+ ( c ) => c . base_url === e . target . value
113+ ) ;
114+ setChildSelected ( selected || null ) ;
115+ } }
92116 disabled = { loadingChildren }
93117 >
94118 { loadingChildren ? (
0 commit comments