UNPKG

@lucianojd/recoil-sync-next

Version:

recoil-sync stores for Next.js

86 lines (85 loc) 3.17 kB
"use strict"; 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;