Source

adminjs/src/frontend/hooks/use-local-storage/use-local-storage.ts

  1. /* eslint-disable no-console */
  2. import React, { useState } from 'react'
  3. import { UseLocalStorageResult } from './use-local-storage-result.type'
  4. /**
  5. * @load ./use-local-storage.doc.md
  6. * @subcategory Hooks
  7. * @class
  8. * @see https://usehooks.com/useLocalStorage
  9. *
  10. * @param {string} key key under which hook will store the data
  11. * @param {T} initialValue value which will be stringified and stored
  12. * @return {UseLocalStorageResult<T>}
  13. * @new In version 3.3
  14. * @bundle
  15. * @type {Function}
  16. */
  17. export function useLocalStorage<T>(key: string, initialValue: T): UseLocalStorageResult<T> {
  18. // State to store our value
  19. // Pass initial state function to useState so logic is only executed once
  20. const [storedValue, setStoredValue] = useState<T>(() => {
  21. try {
  22. // Get from local storage by key
  23. const item = window.localStorage.getItem(key)
  24. // Parse stored json or if none return initialValue
  25. return item ? JSON.parse(item) : initialValue
  26. } catch (error) {
  27. // If error also return initialValue
  28. console.log(error)
  29. return initialValue
  30. }
  31. })
  32. // Return a wrapped version of useState's setter function that ...
  33. // ... persists the new value to localStorage.
  34. const setValue: React.Dispatch<React.SetStateAction<T>> = (value) => {
  35. try {
  36. // Allow value to be a function so we have same API as useState
  37. const valueToStore = value instanceof Function ? value(storedValue) : value
  38. // Save state
  39. setStoredValue(valueToStore)
  40. // Save to local storage
  41. window.localStorage.setItem(key, JSON.stringify(valueToStore))
  42. } catch (error) {
  43. // A more advanced implementation would handle the error case
  44. console.log(error)
  45. }
  46. }
  47. return [storedValue, setValue]
  48. }
  49. export default useLocalStorage