Created a custom hook for persistent useState
This commit is contained in:
		
							parent
							
								
									c4ce6aa11e
								
							
						
					
					
						commit
						dc83821ff2
					
				| @ -1,3 +1,4 @@ | |||||||
|  | import useStateWithLocalStorage from "hooks/useStateWithLocalStorage"; | ||||||
| import React, { ReactNode, useContext, useEffect, useState } from "react"; | import React, { ReactNode, useContext, useEffect, useState } from "react"; | ||||||
| 
 | 
 | ||||||
| export interface AppLayoutState { | export interface AppLayoutState { | ||||||
| @ -39,44 +40,32 @@ type Props = { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export const AppContextProvider = (props: Props) => { | export const AppContextProvider = (props: Props) => { | ||||||
|   function useLocalStorage( |   const [subPanelOpen, setSubPanelOpen] = useStateWithLocalStorage<boolean>( | ||||||
|     value: boolean, |     "subPanelOpen", | ||||||
|     setter: React.Dispatch<React.SetStateAction<boolean>>, |  | ||||||
|     name: string |  | ||||||
|   ): void { |  | ||||||
|     useEffect(() => { |  | ||||||
|       const data = localStorage.getItem(name); |  | ||||||
|       if (data) setter(JSON.parse(data)); |  | ||||||
|     }, [setter, name]); |  | ||||||
| 
 |  | ||||||
|     useEffect(() => { |  | ||||||
|       localStorage.setItem(name, JSON.stringify(value)); |  | ||||||
|     }, [value, name]); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   const [subPanelOpen, setSubPanelOpen] = useState<boolean>( |  | ||||||
|     initialState.subPanelOpen |     initialState.subPanelOpen | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
|   const [languagePanelOpen, setLanguagePanelOpen] = useState<boolean>( |   const [languagePanelOpen, setLanguagePanelOpen] = | ||||||
|  |     useStateWithLocalStorage<boolean>( | ||||||
|  |       "languagePanelOpen", | ||||||
|       initialState.languagePanelOpen |       initialState.languagePanelOpen | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|   const [mainPanelReduced, setMainPanelReduced] = useState<boolean>( |   const [mainPanelReduced, setMainPanelReduced] = | ||||||
|  |     useStateWithLocalStorage<boolean>( | ||||||
|  |       "mainPanelReduced", | ||||||
|       initialState.mainPanelReduced |       initialState.mainPanelReduced | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|   const [mainPanelOpen, setMainPanelOpen] = useState<boolean>( |   const [mainPanelOpen, setMainPanelOpen] = useStateWithLocalStorage<boolean>( | ||||||
|  |     "mainPanelOpen", | ||||||
|     initialState.mainPanelOpen |     initialState.mainPanelOpen | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
|   const [darkMode, setDarkMode] = useState<boolean>(initialState.darkMode); |   const [darkMode, setDarkMode] = useStateWithLocalStorage<boolean>( | ||||||
| 
 |     "darkMode", | ||||||
|   useLocalStorage(subPanelOpen, setSubPanelOpen, "subPanelOpen"); |     initialState.darkMode | ||||||
|   useLocalStorage(languagePanelOpen, setLanguagePanelOpen, "languagePanelOpen"); |   ); | ||||||
|   useLocalStorage(mainPanelReduced, setMainPanelReduced, "mainPanelReduced"); |  | ||||||
|   useLocalStorage(mainPanelOpen, setMainPanelOpen, "mainPanelOpen"); |  | ||||||
|   useLocalStorage(darkMode, setDarkMode, "darkMode"); |  | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|     <AppContext.Provider |     <AppContext.Provider | ||||||
|  | |||||||
							
								
								
									
										23
									
								
								src/hooks/useStateWithLocalStorage.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/hooks/useStateWithLocalStorage.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | import { useEffect, useState } from "react"; | ||||||
|  | 
 | ||||||
|  | export default function useStateWithLocalStorage<T>( | ||||||
|  |   key: string, | ||||||
|  |   initialValue: T | ||||||
|  | ): [T, React.Dispatch<React.SetStateAction<T>>] { | ||||||
|  |   const [value, setValue] = useState<T>(initialValue); | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  |     try { | ||||||
|  |       const item = localStorage.getItem(key); | ||||||
|  |       if (item) setValue(JSON.parse(item) as T); | ||||||
|  |     } catch (error) { | ||||||
|  |       console.warn(`Error reading localStorage key “${key}”:`, error); | ||||||
|  |     } | ||||||
|  |   }, [setValue, key]); | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  |     localStorage.setItem(key, JSON.stringify(value)); | ||||||
|  |   }, [value, key]); | ||||||
|  | 
 | ||||||
|  |   return [value, setValue]; | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 DrMint
						DrMint