recoil-sync-next
Version:
recoil-sync stores for Next.js
46 lines (45 loc) • 1.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSyncHistoryNext = void 0;
const router_1 = require("next/router");
const react_1 = require("react");
function getStorageKey(storeKey, itemsKey) {
return `RecoilSyncHistory::${storeKey !== null && storeKey !== void 0 ? storeKey : 'recoil-sync-history-default-store'}::${itemsKey}`;
}
function useSyncHistoryNext({ storeKey, serialize, deserialize, }) {
const getHistoryKey = (0, react_1.useCallback)(() => {
var _a, _b;
return (_b = (_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.history) === null || _a === void 0 ? void 0 : _a.state) === null || _b === void 0 ? void 0 : _b.key;
}, []);
const saveItems = (0, react_1.useCallback)((itemsKey, values) => {
const storageKey = getStorageKey(storeKey, itemsKey);
if (Object.keys(values).length === 0) {
sessionStorage.removeItem(storageKey);
return;
}
sessionStorage.setItem(storageKey, serialize(values));
}, [storeKey, serialize]);
const loadItems = (0, react_1.useCallback)((itemsKey) => {
const storageKey = getStorageKey(storeKey, itemsKey);
const valuesString = sessionStorage.getItem(storageKey);
if (!valuesString) {
return {};
}
return deserialize(valuesString);
}, [storeKey, deserialize]);
const { events } = (0, router_1.useRouter)();
const listenChangeHistory = (0, react_1.useCallback)((handler) => {
events.on('routeChangeStart', handler);
return () => {
events.off('routeChangeStart', handler);
};
}, [events]);
return {
storeKey,
getHistoryKey,
saveItems,
loadItems,
listenChangeHistory,
};
}
exports.useSyncHistoryNext = useSyncHistoryNext;