@synapsecloud/lib-react
Version:
Helper library for web applications built on React Js
68 lines • 2.14 kB
JavaScript
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