UNPKG

@synapsecloud/lib-react

Version:

Helper library for web applications built on React Js

68 lines 2.14 kB
import { useReducer } from 'react'; function formatStorageKey(key, version) { return `${key}[${version}]`; } function createReducer() { return function (state, action) { const updatedAt = new Date(); switch (action.type) { case 'set': { const payload = { data: action.data, updatedAt: updatedAt.toISOString(), }; const json = JSON.stringify(payload); state.storage.setItem(formatStorageKey(state.key, state.version), json); break; } case 'remove': { state.storage.removeItem(formatStorageKey(state.key, state.version)); break; } default: break; } return { ...state, updatedAt, data: action.data || null, }; }; } function getItemFromStorage(key, version, storage) { try { const json = storage.getItem(formatStorageKey(key, version)); if (!json) return { data: null, updatedAt: new Date() }; const payload = JSON.parse(json); const data = (payload?.data ?? {}); const updatedAt = new Date(payload?.version ?? new Date().toISOString()); return { data, updatedAt }; } catch (e) { console.error(e); return { data: null, updatedAt: new Date() }; } } export function useBrowserStorage(storageKey, dataVersion, storageInterface) { const [state, dispatch] = useReducer(createReducer(), { key: storageKey, version: dataVersion, storage: storageInterface, ...getItemFromStorage(storageKey, dataVersion, storageInterface), }); return { updatedAt: state.updatedAt, key: state.key, version: state.version, get: () => state.data, set: (data) => { dispatch({ type: 'set', data }); return data; }, remove: () => { dispatch({ type: 'remove' }); }, }; } //# sourceMappingURL=useBrowserStorage.js.map