@lucianojd/recoil-sync-next
Version:
recoil-sync stores for Next.js
86 lines (85 loc) • 3.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RecoilHistorySyncTransitNext = void 0;
const jsx_runtime_1 = require("react/jsx-runtime");
/*
* A part of these functions are:
* Copyright (c) Facebook, Inc. and its affiliates.
* Released under the MIT license.
* https://github.com/facebookexperimental/Recoil/blob/main/LICENSE
*/
const react_1 = require("react");
const recoil_1 = require("recoil");
const recoil_sync_1 = require("recoil-sync");
const transit_js_1 = __importDefault(require("transit-js"));
const useSyncHistory_1 = require("./useSyncHistory");
const useSyncHistoryNext_1 = require("./useSyncHistoryNext");
const BUILTIN_HANDLERS = [
{
tag: 'Date',
class: Date,
write: (x) => x.toISOString(),
read: (str) => new Date(str),
},
{
tag: 'Set',
class: Set,
write: (x) => Array.from(x),
read: (arr) => new Set(arr),
},
{
tag: 'Map',
class: Map,
write: (x) => Array.from(x.entries()),
read: (arr) => new Map(arr),
},
{
tag: '__DV',
class: recoil_1.DefaultValue,
write: () => 0,
read: () => new recoil_1.DefaultValue(),
},
];
const RecoilHistorySyncTransitNext = ({ storeKey, handlers: optionalHandlers, children, }) => {
const handlers = (0, react_1.useMemo)(() => [...BUILTIN_HANDLERS, ...(optionalHandlers !== null && optionalHandlers !== void 0 ? optionalHandlers : [])], [optionalHandlers]);
const writer = (0, react_1.useMemo)(() => transit_js_1.default.writer('json', {
handlers: transit_js_1.default.map(handlers
.map((handler) => [
handler.class,
transit_js_1.default.makeWriteHandler({
tag: () => handler.tag,
rep: handler.write,
stringRep: () => null,
}),
])
.flat(1)),
}), [handlers]);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const serialize = (0, react_1.useCallback)((x) => writer.write(x), [writer]);
const reader = (0, react_1.useMemo)(() => transit_js_1.default.reader('json', {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
handlers: handlers.reduce((c, { tag, read }) => {
c[tag] = read;
return c;
}, {}),
mapBuilder: {
init: () => ({}),
add: (ret, key, val) => {
ret[key] = val;
return ret;
},
finalize: (ret) => ret,
},
}), [handlers]);
const deserialize = (0, react_1.useCallback)((x) => reader.read(x), [reader]);
const opts = (0, useSyncHistory_1.useSyncHistory)((0, useSyncHistoryNext_1.useSyncHistoryNext)({
storeKey,
serialize,
deserialize,
}));
return (0, jsx_runtime_1.jsx)(recoil_sync_1.RecoilSync, { ...opts, children: children });
};
exports.RecoilHistorySyncTransitNext = RecoilHistorySyncTransitNext;