use-persisted-state.js 755 B

123456789101112131415161718192021222324252627282930
  1. import { useState, useCallback } from 'react'
  2. import localStorage from '../../infrastructure/local-storage'
  3. function usePersistedState(key, defaultValue) {
  4. const [value, setValue] = useState(() => {
  5. return localStorage.getItem(key) ?? defaultValue
  6. })
  7. const updateFunction = useCallback(
  8. newValue => {
  9. setValue(value => {
  10. const actualNewValue =
  11. typeof newValue === 'function' ? newValue(value) : newValue
  12. if (actualNewValue === defaultValue) {
  13. localStorage.removeItem(key)
  14. } else {
  15. localStorage.setItem(key, actualNewValue)
  16. }
  17. return actualNewValue
  18. })
  19. },
  20. [key, defaultValue]
  21. )
  22. return [value, updateFunction]
  23. }
  24. export default usePersistedState