UNPKG

@dr.pogodin/react-helmet

Version:

Thread-safe Helmet for React 19+ and friends

72 lines (70 loc) 2.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.Context = void 0; var _react = require("react"); var _client = require("./client"); var _constants = require("./constants"); var _server = require("./server"); var _utils = require("./utils"); var _jsxRuntime = require("react/jsx-runtime"); const Context = exports.Context = /*#__PURE__*/(0, _react.createContext)(undefined); const HelmetProvider = ({ children, onServerState }) => { const heapRef = (0, _react.useRef)(null); if (heapRef.current === null) { const heap = { firstRender: true, helmets: [], state: undefined }; if (onServerState) { heap.serverState ??= (0, _server.newServerState)(heap); onServerState(heap.serverState); } heapRef.current = heap; } const heap_0 = heapRef.current; // eslint-disable-next-line react/hook-use-state const [contextValue] = (0, _react.useState)(() => ({ clientApply() { if (_constants.IS_DOM_ENVIRONMENT && !heap_0.state) { heap_0.state = (0, _utils.calcAggregatedState)(heap_0.helmets); if (heap_0.state.defer) { heap_0.nextAnimFrameId ??= requestAnimationFrame(() => { heap_0.state ??= (0, _utils.calcAggregatedState)(heap_0.helmets); (0, _client.commitTagChanges)(heap_0.state, heap_0.firstRender); heap_0.firstRender = false; delete heap_0.nextAnimFrameId; }); } else { if (heap_0.nextAnimFrameId !== undefined) { cancelAnimationFrame(heap_0.nextAnimFrameId); delete heap_0.nextAnimFrameId; } (0, _client.commitTagChanges)(heap_0.state, heap_0.firstRender); heap_0.firstRender = false; } } }, update(id, props) { const idx = heap_0.helmets.findIndex(item => item[0] === id); if (idx >= 0) { delete heap_0.state; if (props) heap_0.helmets[idx][1] = props;else heap_0.helmets.splice(idx, 1); } else if (props) { delete heap_0.state; heap_0.helmets.push([id, props]); } } })); return /*#__PURE__*/(0, _jsxRuntime.jsx)(Context, { value: contextValue, children: children }); }; var _default = exports.default = HelmetProvider; //# sourceMappingURL=Provider.js.map