import { defineStore } from 'pinia'; import { ref, type Ref } from 'vue'; const stores: Map = new Map(); export default function get(key: string, def: T1 | undefined = undefined, prefix = '') { let retval = def; try { retval = JSON.parse(localStorage[`${prefix}${key}`]); } catch (ex) { // ok } return retval; } export interface Store { prefix: string; get: (key: string, def: T1 | undefined) => T1 | undefined; put: (key: string, value: T1 | undefined) => void } function getWithStorage(storage: Storage, prefix: string) { const get = function(key: string, def: T1 | undefined = undefined): T1 | undefined { let retval = def; try { retval = JSON.parse(storage[`${prefix}${key}`]); } catch (ex) { // ok } return retval; } return get } function putWithStorage(storage: Storage, prefix: string) { const put = function(key: string, value: T1 | undefined) { storage[`${prefix}${key}`] = JSON.stringify(value); } return put } export function makeStore(storage: Storage, label: string, prefix: string) { const prefixRef: Ref = ref(prefix); const get = getWithStorage(storage, prefix); const put = putWithStorage(storage, prefix); if (stores.get(label) === true) { throw new Error(`Store with label ${label} already exists.`); } stores.set(label, true); return defineStore(label, () => ({ prefix: prefixRef.value, get, put })); } export const useLocalStorageStore = makeStore(localStorage, 'localstorage', 'app'); export const useSessionStorageStore = makeStore(sessionStorage,'sessionstorage', 'app');