{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "use-local-storage",
  "title": "useLocalStorage",
  "description": "A hook to store data in the browser's local storage",
  "files": [
    {
      "path": "registry/hooks/use-local-storage.ts",
      "content": "'use client'\n\nimport * as React from 'react'\n\nexport function localStorageValue<T>(key: string, defaultValue: T) {\n  return {\n    get(): T {\n      if (typeof window === 'undefined') {\n        return defaultValue\n      }\n\n      const item = window.localStorage.getItem(key)\n\n      if (item === null) {\n        return defaultValue\n      }\n\n      try {\n        return JSON.parse(item)\n      }\n      catch {\n        return typeof defaultValue === 'string' ? item as T : defaultValue\n      }\n    },\n    set(value: T): void {\n      if (typeof window !== 'undefined') {\n        window.localStorage.setItem(key, JSON.stringify(value))\n        window.dispatchEvent(new Event('storage'))\n      }\n    },\n    remove(): void {\n      if (typeof window !== 'undefined') {\n        window.localStorage.removeItem(key)\n        window.dispatchEvent(new Event('storage'))\n      }\n    },\n  }\n}\n\nexport function useLocalStorage<T>(key: string, defaultValue: T | (() => T)) {\n  const value = React.useMemo(() => {\n    const defaultVal = typeof defaultValue === 'function' ? (defaultValue as () => T)() : defaultValue\n    return localStorageValue(key, defaultVal)\n  }, [key, defaultValue])\n  const [storedValue, setStoredValue] = React.useState(value.get)\n  const setValue = React.useCallback((newValue: T | ((val: T) => T)) => {\n    value.set(typeof newValue === 'function' ? (newValue as (val: T) => T)(storedValue) : newValue)\n  }, [value, storedValue])\n\n  React.useEffect(() => {\n    const abortController = new AbortController()\n\n    window.addEventListener('storage', () => {\n      setStoredValue(value.get)\n    }, { signal: abortController.signal })\n\n    return () => {\n      abortController.abort()\n    }\n  }, [value, setStoredValue])\n\n  return [storedValue, setValue] as const\n}\n",
      "type": "registry:hook",
      "target": "hookas/use-local-storage.ts"
    }
  ],
  "type": "registry:hook"
}