@@ -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' ;
4142import { useSidebarGroups , useAllMetadataIcons } from '@/plugins/hooks' ;
@@ -167,23 +168,24 @@ const PKG_TYPE_ICONS: Record<string, LucideIcon> = {
167168} ;
168169
169170interface AppSidebarProps extends React . ComponentProps < typeof Sidebar > {
170- selectedObject : string | null ;
171- onSelectObject : ( name : string ) => void ;
172- selectedMeta ?: { type : string ; name : string } | null ;
173- onSelectMeta ?: ( type : string , name : string ) => void ;
174171 packages : InstalledPackage [ ] ;
175172 selectedPackage : InstalledPackage | null ;
176173 onSelectPackage : ( pkg : InstalledPackage ) => void ;
177- onSelectView ?: ( view : 'overview' | 'packages' | 'api-console' ) => void ;
178- selectedView ?: 'overview' | 'packages' | 'object' | 'metadata' | 'api-console' ;
179174}
180175
181176export function AppSidebar ( {
182- selectedObject, onSelectObject, selectedMeta, onSelectMeta,
183- packages, selectedPackage, onSelectPackage, onSelectView, selectedView,
177+ packages, selectedPackage, onSelectPackage,
184178 ...props
185179} : AppSidebarProps ) {
186180 const client = useClient ( ) ;
181+ const navigate = useNavigate ( ) ;
182+ const params = useParams ( { strict : false } ) ;
183+ const location = useLocation ( ) ;
184+
185+ // Extract current selection from URL params
186+ const selectedObject = params . name && params . package && ! params . type ? params . name : null ;
187+ const selectedMeta = params . type && params . name ? { type : params . type , name : params . name } : null ;
188+
187189 const [ loading , setLoading ] = useState ( false ) ;
188190 const [ searchQuery , setSearchQuery ] = useState ( "" ) ;
189191 const [ metaTypes , setMetaTypes ] = useState < string [ ] > ( [ ] ) ;
@@ -372,8 +374,8 @@ export function AppSidebar({
372374 < SidebarMenu >
373375 < SidebarMenuItem >
374376 < SidebarMenuButton
375- isActive = { selectedView === 'overview' && ! selectedObject }
376- onClick = { ( ) => { onSelectObject ( '' ) ; onSelectView ?. ( 'overview' ) ; } }
377+ isActive = { ! ! params . package && ! params . name && ! params . type }
378+ onClick = { ( ) => navigate ( { to : `/ ${ selectedPackage ?. manifest ?. id || 'default' } ` } ) }
377379 >
378380 < LayoutDashboard className = "h-4 w-4" />
379381 < span > Overview</ span >
@@ -466,9 +468,11 @@ export function AppSidebar({
466468 const isActive = isObjectType
467469 ? selectedObject === itemName
468470 : selectedMeta ?. type === type && selectedMeta ?. name === itemName ;
471+
472+ const packagePath = selectedPackage ?. manifest ?. id || 'default' ;
469473 const handleClick = isObjectType
470- ? ( ) => onSelectObject ( itemName )
471- : ( ) => onSelectMeta ?. ( type , itemName ) ;
474+ ? ( ) => navigate ( { to : `/ ${ packagePath } /objects/ ${ itemName } ` } )
475+ : ( ) => navigate ( { to : `/ ${ packagePath } /metadata/ ${ type } / ${ itemName } ` } ) ;
472476
473477 return (
474478 < SidebarMenuSubItem key = { itemName } >
@@ -550,7 +554,7 @@ export function AppSidebar({
550554 < SidebarMenuSubItem key = { itemName } >
551555 < SidebarMenuSubButton
552556 isActive = { selectedObject === itemName }
553- onClick = { ( ) => onSelectObject ( itemName ) }
557+ onClick = { ( ) => navigate ( { to : `/ ${ selectedPackage ?. manifest ?. id || 'default' } /objects/ ${ itemName } ` } ) }
554558 >
555559 < span className = "truncate" >
556560 { isSystemObject ( item ) && (
@@ -572,8 +576,8 @@ export function AppSidebar({
572576 < SidebarMenuItem >
573577 < SidebarMenuButton
574578 tooltip = "API Console"
575- isActive = { selectedView === 'api-console' }
576- onClick = { ( ) => onSelectView ?. ( ' api-console') }
579+ isActive = { location . pathname === '/ api-console' }
580+ onClick = { ( ) => navigate ( { to : '/ api-console' } ) }
577581 >
578582 < Globe className = "h-4 w-4" />
579583 < span > API Console</ span >
@@ -582,8 +586,8 @@ export function AppSidebar({
582586 < SidebarMenuItem >
583587 < SidebarMenuButton
584588 tooltip = "Packages"
585- isActive = { selectedView === 'packages' }
586- onClick = { ( ) => onSelectView ?. ( ' packages') }
589+ isActive = { location . pathname === '/ packages' }
590+ onClick = { ( ) => navigate ( { to : '/ packages' } ) }
587591 >
588592 < Package className = "h-4 w-4" />
589593 < span > Packages</ span >
0 commit comments