@@ -36,6 +36,7 @@ import {
3636 type LucideIcon ,
3737} from "lucide-react"
3838import { useState , useEffect , useCallback , useMemo } from "react"
39+ import { useNavigate , useParams , useLocation } from '@tanstack/react-router' ;
3940import { useClient , useMetadataSubscriptionCallback } from '@objectstack/client-react' ;
4041import type { InstalledPackage } from '@objectstack/spec/kernel' ;
4142
@@ -163,23 +164,24 @@ const PKG_TYPE_ICONS: Record<string, LucideIcon> = {
163164} ;
164165
165166interface AppSidebarProps extends React . ComponentProps < typeof Sidebar > {
166- selectedObject : string | null ;
167- onSelectObject : ( name : string ) => void ;
168- selectedMeta ?: { type : string ; name : string } | null ;
169- onSelectMeta ?: ( type : string , name : string ) => void ;
170167 packages : InstalledPackage [ ] ;
171168 selectedPackage : InstalledPackage | null ;
172169 onSelectPackage : ( pkg : InstalledPackage ) => void ;
173- onSelectView ?: ( view : 'overview' | 'packages' | 'api-console' ) => void ;
174- selectedView ?: 'overview' | 'packages' | 'object' | 'metadata' | 'api-console' ;
175170}
176171
177172export function AppSidebar ( {
178- selectedObject, onSelectObject, selectedMeta, onSelectMeta,
179- packages, selectedPackage, onSelectPackage, onSelectView, selectedView,
173+ packages, selectedPackage, onSelectPackage,
180174 ...props
181175} : AppSidebarProps ) {
182176 const client = useClient ( ) ;
177+ const navigate = useNavigate ( ) ;
178+ const params = useParams ( { strict : false } ) ;
179+ const location = useLocation ( ) ;
180+
181+ // Extract current selection from URL params
182+ const selectedObject = params . name && params . package && ! params . type ? params . name : null ;
183+ const selectedMeta = params . type && params . name ? { type : params . type , name : params . name } : null ;
184+
183185 const [ loading , setLoading ] = useState ( false ) ;
184186 const [ searchQuery , setSearchQuery ] = useState ( "" ) ;
185187 const [ metaTypes , setMetaTypes ] = useState < string [ ] > ( [ ] ) ;
@@ -362,8 +364,8 @@ export function AppSidebar({
362364 < SidebarMenu >
363365 < SidebarMenuItem >
364366 < SidebarMenuButton
365- isActive = { selectedView === 'overview' && ! selectedObject }
366- onClick = { ( ) => { onSelectObject ( '' ) ; onSelectView ?. ( 'overview' ) ; } }
367+ isActive = { ! ! params . package && ! params . name && ! params . type }
368+ onClick = { ( ) => navigate ( { to : `/ ${ selectedPackage ?. manifest ?. id || 'default' } ` } ) }
367369 >
368370 < LayoutDashboard className = "h-4 w-4" />
369371 < span > Overview</ span >
@@ -456,9 +458,11 @@ export function AppSidebar({
456458 const isActive = isObjectType
457459 ? selectedObject === itemName
458460 : selectedMeta ?. type === type && selectedMeta ?. name === itemName ;
461+
462+ const packagePath = selectedPackage ?. manifest ?. id || 'default' ;
459463 const handleClick = isObjectType
460- ? ( ) => onSelectObject ( itemName )
461- : ( ) => onSelectMeta ?. ( type , itemName ) ;
464+ ? ( ) => navigate ( { to : `/ ${ packagePath } /objects/ ${ itemName } ` } )
465+ : ( ) => navigate ( { to : `/ ${ packagePath } /metadata/ ${ type } / ${ itemName } ` } ) ;
462466
463467 return (
464468 < SidebarMenuSubItem key = { itemName } >
@@ -540,7 +544,7 @@ export function AppSidebar({
540544 < SidebarMenuSubItem key = { itemName } >
541545 < SidebarMenuSubButton
542546 isActive = { selectedObject === itemName }
543- onClick = { ( ) => onSelectObject ( itemName ) }
547+ onClick = { ( ) => navigate ( { to : `/ ${ selectedPackage ?. manifest ?. id || 'default' } /objects/ ${ itemName } ` } ) }
544548 >
545549 < span className = "truncate" >
546550 { isSystemObject ( item ) && (
@@ -562,8 +566,8 @@ export function AppSidebar({
562566 < SidebarMenuItem >
563567 < SidebarMenuButton
564568 tooltip = "API Console"
565- isActive = { selectedView === 'api-console' }
566- onClick = { ( ) => onSelectView ?. ( ' api-console') }
569+ isActive = { location . pathname === '/ api-console' }
570+ onClick = { ( ) => navigate ( { to : '/ api-console' } ) }
567571 >
568572 < Globe className = "h-4 w-4" />
569573 < span > API Console</ span >
@@ -572,8 +576,8 @@ export function AppSidebar({
572576 < SidebarMenuItem >
573577 < SidebarMenuButton
574578 tooltip = "Packages"
575- isActive = { selectedView === 'packages' }
576- onClick = { ( ) => onSelectView ?. ( ' packages') }
579+ isActive = { location . pathname === '/ packages' }
580+ onClick = { ( ) => navigate ( { to : '/ packages' } ) }
577581 >
578582 < Package className = "h-4 w-4" />
579583 < span > Packages</ span >
0 commit comments