11import { createContext , useContext , useState , useCallback , useEffect , ReactNode } from 'react' ;
22import type { DatabaseInfo } from '@fsf/shared' ;
33import { api } from '../services/api' ;
4+ import { useLocalStorage } from '../hooks/useLocalStorage' ;
45
56interface SidebarContextType {
67 isCollapsed : boolean ;
@@ -18,23 +19,23 @@ interface SidebarContextType {
1819const SidebarContext = createContext < SidebarContextType | null > ( null ) ;
1920
2021export function SidebarProvider ( { children } : { children : ReactNode } ) {
21- const [ isCollapsed , setIsCollapsed ] = useState ( ( ) => {
22- const stored = localStorage . getItem ( 'sidebar-collapsed' ) ;
23- return stored === 'true' ;
24- } ) ;
22+ const [ isCollapsed , setIsCollapsed ] = useLocalStorage (
23+ 'sidebar-collapsed' ,
24+ false ,
25+ String ,
26+ ( raw ) => raw === 'true'
27+ ) ;
2528 const [ isMobileOpen , setIsMobileOpen ] = useState ( false ) ;
26- const [ expandedDatabases , setExpandedDatabases ] = useState < Set < string > > ( ( ) => {
27- const stored = localStorage . getItem ( 'sidebar-expanded-databases' ) ;
28- return stored ? new Set ( JSON . parse ( stored ) ) : new Set ( ) ;
29- } ) ;
29+ const [ expandedDatabases , setExpandedDatabases ] = useLocalStorage < Set < string > > (
30+ 'sidebar-expanded-databases' ,
31+ ( ) => new Set ( ) ,
32+ ( s ) => JSON . stringify ( [ ...s ] ) ,
33+ ( raw ) => new Set ( JSON . parse ( raw ) )
34+ ) ;
3035
3136 const toggleCollapsed = useCallback ( ( ) => {
32- setIsCollapsed ( prev => {
33- const newValue = ! prev ;
34- localStorage . setItem ( 'sidebar-collapsed' , String ( newValue ) ) ;
35- return newValue ;
36- } ) ;
37- } , [ ] ) ;
37+ setIsCollapsed ( prev => ! prev ) ;
38+ } , [ setIsCollapsed ] ) ;
3839
3940 const toggleMobile = useCallback ( ( ) => {
4041 setIsMobileOpen ( prev => ! prev ) ;
@@ -52,20 +53,18 @@ export function SidebarProvider({ children }: { children: ReactNode }) {
5253 } else {
5354 next . add ( dbId ) ;
5455 }
55- localStorage . setItem ( 'sidebar-expanded-databases' , JSON . stringify ( [ ...next ] ) ) ;
5656 return next ;
5757 } ) ;
58- } , [ ] ) ;
58+ } , [ setExpandedDatabases ] ) ;
5959
6060 const expandDatabase = useCallback ( ( dbId : string ) => {
6161 setExpandedDatabases ( prev => {
6262 if ( prev . has ( dbId ) ) return prev ;
6363 const next = new Set ( prev ) ;
6464 next . add ( dbId ) ;
65- localStorage . setItem ( 'sidebar-expanded-databases' , JSON . stringify ( [ ...next ] ) ) ;
6665 return next ;
6766 } ) ;
68- } , [ ] ) ;
67+ } , [ setExpandedDatabases ] ) ;
6968
7069 // Database state management
7170 const [ databases , setDatabases ] = useState < DatabaseInfo [ ] > ( [ ] ) ;
0 commit comments