@@ -3,7 +3,7 @@ import { Link } from "@inertiajs/react"
33import { NavMain } from "@/components/nav-main"
44import { NavFooter } from "@/components/nav-footer"
55import { NavUser } from "@/components/nav-user"
6- import { type NavItemType } from '@/types'
6+ import { type NavItem } from '@/types'
77import {
88 Sidebar ,
99 SidebarContent ,
@@ -12,18 +12,21 @@ import {
1212 SidebarMenu ,
1313 SidebarMenuButton ,
1414 SidebarMenuItem ,
15+ SidebarProvider ,
16+ SidebarInset ,
1517} from "@/components/ui/sidebar"
1618import ApplicationLogo from "./application-logo"
19+ import { useState } from "react"
1720
18- const mainNavItems : NavItemType [ ] = [
21+ const mainNavItems : NavItem [ ] = [
1922 {
2023 title : "Dashboard" ,
2124 url : "/dashboard" ,
2225 icon : LayoutDashboard ,
2326 } ,
2427]
2528
26- const footerNavItems : NavItemType [ ] = [
29+ const footerNavItems : NavItem [ ] = [
2730 {
2831 title : "Repository" ,
2932 url : "https://github.com/laravel/react-starter-kit" ,
@@ -36,35 +39,57 @@ const footerNavItems: NavItemType[] = [
3639 } ,
3740]
3841
39- export function AppSidebar ( ) {
42+ export function AppSidebar ( { children } : { children : React . ReactNode } ) {
43+ const [ isOpen , setIsOpen ] = useState ( ( ) =>
44+ typeof window !== 'undefined' ?
45+ localStorage . getItem ( 'sidebar' ) !== 'false' :
46+ true
47+ ) ;
48+
49+ const handleSidebarChange = ( open : boolean ) => {
50+ setIsOpen ( open ) ;
51+ if ( typeof window !== 'undefined' ) {
52+ localStorage . setItem ( 'sidebar' , String ( open ) ) ;
53+ }
54+ } ;
55+
4056 return (
41- < Sidebar collapsible = "icon" >
42- < SidebarHeader >
43- < SidebarMenu >
44- < SidebarMenuItem >
45- < SidebarMenuButton size = "lg" asChild >
46- < Link href = "/dashboard" className = "flex items-center gap-3" prefetch >
47- < div className = "flex aspect-square size-8 items-center justify-center rounded-md bg-sidebar-primary text-sidebar-primary-foreground" >
48- < ApplicationLogo className = "size-5 text-white fill-current" />
49- </ div >
50- < div className = "grid flex-1 text-left text-sm leading-tight" >
51- < span className = "truncate font-semibold" > Laravel</ span >
52- < span className = "truncate text-xs" > Starter Kit</ span >
53- </ div >
54- </ Link >
55- </ SidebarMenuButton >
56- </ SidebarMenuItem >
57- </ SidebarMenu >
58- </ SidebarHeader >
57+ < SidebarProvider
58+ defaultOpen = { isOpen }
59+ open = { isOpen }
60+ onOpenChange = { handleSidebarChange }
61+ >
62+ < Sidebar collapsible = "icon" >
63+ < SidebarHeader >
64+ < SidebarMenu >
65+ < SidebarMenuItem >
66+ < SidebarMenuButton size = "lg" asChild >
67+ < Link href = "/dashboard" className = "flex items-center gap-3" prefetch >
68+ < div className = "flex aspect-square size-8 items-center justify-center rounded-md bg-sidebar-primary text-sidebar-primary-foreground" >
69+ < ApplicationLogo className = "size-5 text-white fill-current" />
70+ </ div >
71+ < div className = "grid flex-1 text-left text-sm leading-tight" >
72+ < span className = "truncate font-semibold" > Laravel</ span >
73+ < span className = "truncate text-xs" > Starter Kit</ span >
74+ </ div >
75+ </ Link >
76+ </ SidebarMenuButton >
77+ </ SidebarMenuItem >
78+ </ SidebarMenu >
79+ </ SidebarHeader >
5980
60- < SidebarContent >
61- < NavMain items = { mainNavItems } />
62- </ SidebarContent >
81+ < SidebarContent >
82+ < NavMain items = { mainNavItems } />
83+ </ SidebarContent >
6384
64- < SidebarFooter >
65- < NavFooter items = { footerNavItems } className = "mt-auto" />
66- < NavUser />
67- </ SidebarFooter >
68- </ Sidebar >
85+ < SidebarFooter >
86+ < NavFooter items = { footerNavItems } className = "mt-auto" />
87+ < NavUser />
88+ </ SidebarFooter >
89+ </ Sidebar >
90+ < SidebarInset >
91+ { children }
92+ </ SidebarInset >
93+ </ SidebarProvider >
6994 )
7095}
0 commit comments