@dr.pogodin/react-helmet
Version:
Thread-safe Helmet for React 19+ and friends
72 lines (70 loc) • 2.34 kB
JavaScript
;
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