diff --git a/packages/frontend/src/utils/webStorage.ts b/packages/frontend/src/utils/webStorage.ts new file mode 100644 index 00000000..e896f722 --- /dev/null +++ b/packages/frontend/src/utils/webStorage.ts @@ -0,0 +1,43 @@ +export function createLocalStorage(key: string, defaultValue: Value) { + return createStorage({ type: "localStorage", key, defaultValue }); +} + +export function createSessionStorage(key: string, defaultValue: Value) { + return createStorage({ type: "sessionStorage", key, defaultValue }); +} + +type CreateStorageOptions = { + type: "localStorage" | "sessionStorage"; + key: string; + defaultValue: Value; +}; + +function createStorage({ + type, + key, + defaultValue, +}: CreateStorageOptions) { + const getItem = (): Value => { + const value = window?.[type].getItem(key); + + if (value === null) return defaultValue; + + try { + const parsedValue = JSON.parse(value); + return parsedValue as Value; + } catch (error) { + return defaultValue; + } + }; + + const setItem = (value: Value) => + window?.[type].setItem(key, JSON.stringify(value)); + + const removeItem = () => window?.[type].removeItem(key); + + return { + getItem, + setItem, + removeItem, + }; +}