import { useState } from "react"; import { useWindowEvent, UseLocalStorageReturnType } from "hooks"; // TODO: Refactor this hook const appDateName = "application_data"; /** * * @kind 13-Storage */ export const useLocalStorage = (entityName: string, initialValue?: T): UseLocalStorageReturnType => { const readLocalStorage = (key: string): T | null => { const item = localStorage.getItem(appDateName); if (!item) return null; const parsed = JSON.parse(item); return key === "*" ? parsed : parsed[key]; }; const saveToLocalStorage = (value: T) => { if (!entityName) return; try { const savedData = readLocalStorage("*"); const dataToSet = { ...savedData, [entityName]: value }; localStorage.setItem(appDateName, JSON.stringify(dataToSet)); window.dispatchEvent(new Event("local-storage")); } catch (err) { console.error(err); } }; const [storeValue, setStoreValue] = useState(() => { if (!entityName) return null; try { const storedValue = readLocalStorage(entityName); if (!storedValue && initialValue) { saveToLocalStorage(initialValue); return initialValue; } return storedValue; } catch (e) { return null; } }); const handleStorageChange = (isExternalChange = false) => { if (!entityName) return; try { const storageValue = readLocalStorage(entityName); if (!isExternalChange) return setStoreValue(storageValue); if (!storageValue && initialValue) { return saveToLocalStorage(storeValue as T); } if (storeValue && storageValue && storageValue !== storeValue) { return saveToLocalStorage(storeValue as T); } } catch (err) { console.error(err); } }; useWindowEvent("storage", (e) => { if (e.storageArea === localStorage && e.key === appDateName) { handleStorageChange(true); } }); useWindowEvent("local-storage" as keyof WindowEventMap, () => handleStorageChange()); const setToStore = (value: T) => { saveToLocalStorage(value); setStoreValue(value); }; return [storeValue, setToStore]; };