{"version":3,"file":"local-storage.cjs","sources":["../../src/util/local-storage.ts"],"sourcesContent":["import { useMemo, useState, useCallback } from \"react\";\n\nclass LocalStorage<T> {\n  name: string;\n  constructor(name: string) {\n    this.get = this.get.bind(this);\n    this.set = this.set.bind(this);\n    this.name = name;\n  }\n  get(): T | null {\n    const str = window.localStorage.getItem(this.name);\n    if (str == null) return null;\n    try {\n      return JSON.parse(str);\n    } catch {\n      return null;\n    }\n  }\n  set(obj: T) {\n    const str = JSON.stringify(obj);\n    return window.localStorage.setItem(this.name, str);\n  }\n\n  remove() {\n    window.localStorage.removeItem(this.name);\n  }\n}\n\nfunction useStoredState<S>(\n  key: string | null,\n  initialState: S | (() => S),\n  isValid: ((state: S) => boolean) | null = null,\n): [S, (nextState: S, validate?: boolean) => void, VoidFunction] {\n  /** React hook for setting and getting values on local storage */\n  const storage: LocalStorage<S> | null = useMemo(() => {\n    if (typeof window == \"undefined\" || key == null) return null;\n    return new LocalStorage<S>(key);\n  }, [key]);\n  let initialValue = storage?.get();\n\n  const validator = useCallback(\n    (state: S) => {\n      try {\n        if (isValid != null) return isValid(state);\n        if (state == null) return false;\n        let _initialState = initialState;\n        if (typeof _initialState == \"function\") {\n          _initialState = (_initialState as () => S)();\n        }\n        if (typeof state != typeof _initialState) return false;\n        if (typeof state == \"object\" && typeof _initialState == \"object\") {\n          const expectedKeys = Object.keys(_initialState as {});\n          const actualKeys = Object.keys(state);\n          if (expectedKeys.length != actualKeys.length) return false;\n          for (const [key, value] of Object.entries(_initialState as {})) {\n            if (!actualKeys.includes(key)) return false;\n            if (typeof value != typeof state[key]) return false;\n          }\n        } else {\n          return JSON.stringify(state) === JSON.stringify(_initialState);\n        }\n        return true;\n      } catch {\n        return false;\n      }\n    },\n    [initialState, isValid],\n  );\n\n  if (initialValue != null && !validator(initialValue)) initialValue = null;\n  const [state, _setState] = useState<S>(initialValue ?? initialState);\n\n  const setState = useCallback(\n    (nextState: S, validate = true) => {\n      if (validate && !validator(nextState))\n        throw `State ${nextState} is not valid.`;\n      _setState(nextState);\n      storage?.set(nextState);\n    },\n    [validator],\n  );\n\n  const resetState = useCallback(() => {\n    _setState(initialState);\n    storage?.remove();\n  }, [initialState]);\n\n  return [state, setState, resetState];\n}\n\nexport { LocalStorage, useStoredState };\n"],"names":["useMemo","useCallback","state","key","useState"],"mappings":";;;AAEA,MAAM,aAAgB;AAAA,EACpB;AAAA,EACA,YAAY,MAAc;AACxB,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,OAAO;AAAA,EACd;AAAA,EACA,MAAgB;AACd,UAAM,MAAM,OAAO,aAAa,QAAQ,KAAK,IAAI;AACjD,QAAI,OAAO,KAAM,QAAO;AACxB,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,KAAQ;AACV,UAAM,MAAM,KAAK,UAAU,GAAG;AAC9B,WAAO,OAAO,aAAa,QAAQ,KAAK,MAAM,GAAG;AAAA,EACnD;AAAA,EAEA,SAAS;AACP,WAAO,aAAa,WAAW,KAAK,IAAI;AAAA,EAC1C;AACF;AAEA,SAAS,eACP,KACA,cACA,UAA0C,MACqB;AAE/D,QAAM,UAAkCA,MAAAA,QAAQ,MAAM;AACpD,QAAI,OAAO,UAAU,eAAe,OAAO,KAAM,QAAO;AACxD,WAAO,IAAI,aAAgB,GAAG;AAAA,EAChC,GAAG,CAAC,GAAG,CAAC;AACR,MAAI,eAAe,SAAS,IAAA;AAE5B,QAAM,YAAYC,MAAAA;AAAAA,IAChB,CAACC,WAAa;AACZ,UAAI;AACF,YAAI,WAAW,KAAM,QAAO,QAAQA,MAAK;AACzC,YAAIA,UAAS,KAAM,QAAO;AAC1B,YAAI,gBAAgB;AACpB,YAAI,OAAO,iBAAiB,YAAY;AACtC,0BAAiB,cAAA;AAAA,QACnB;AACA,YAAI,OAAOA,UAAS,OAAO,cAAe,QAAO;AACjD,YAAI,OAAOA,UAAS,YAAY,OAAO,iBAAiB,UAAU;AAChE,gBAAM,eAAe,OAAO,KAAK,aAAmB;AACpD,gBAAM,aAAa,OAAO,KAAKA,MAAK;AACpC,cAAI,aAAa,UAAU,WAAW,OAAQ,QAAO;AACrD,qBAAW,CAACC,MAAK,KAAK,KAAK,OAAO,QAAQ,aAAmB,GAAG;AAC9D,gBAAI,CAAC,WAAW,SAASA,IAAG,EAAG,QAAO;AACtC,gBAAI,OAAO,SAAS,OAAOD,OAAMC,IAAG,EAAG,QAAO;AAAA,UAChD;AAAA,QACF,OAAO;AACL,iBAAO,KAAK,UAAUD,MAAK,MAAM,KAAK,UAAU,aAAa;AAAA,QAC/D;AACA,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,cAAc,OAAO;AAAA,EAAA;AAGxB,MAAI,gBAAgB,QAAQ,CAAC,UAAU,YAAY,EAAG,gBAAe;AACrE,QAAM,CAAC,OAAO,SAAS,IAAIE,MAAAA,SAAY,gBAAgB,YAAY;AAEnE,QAAM,WAAWH,MAAAA;AAAAA,IACf,CAAC,WAAc,WAAW,SAAS;AACjC,UAAI,YAAY,CAAC,UAAU,SAAS;AAClC,cAAM,SAAS,SAAS;AAC1B,gBAAU,SAAS;AACnB,eAAS,IAAI,SAAS;AAAA,IACxB;AAAA,IACA,CAAC,SAAS;AAAA,EAAA;AAGZ,QAAM,aAAaA,MAAAA,YAAY,MAAM;AACnC,cAAU,YAAY;AACtB,aAAS,OAAA;AAAA,EACX,GAAG,CAAC,YAAY,CAAC;AAEjB,SAAO,CAAC,OAAO,UAAU,UAAU;AACrC;;;"}