@dr.pogodin/react-helmet
Version:
Thread-safe Helmet for React 19+ and friends
69 lines (68 loc) • 2.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.Context = void 0;
var _react = require("react");
var _server = require("./server");
var _constants = require("./constants");
var _utils = require("./utils");
var _client = require("./client");
var _jsxRuntime = require("react/jsx-runtime");
const Context = exports.Context = /*#__PURE__*/(0, _react.createContext)(undefined);
const HelmetProvider = _ref => {
let {
children,
context
} = _ref;
const {
current: heap
} = (0, _react.useRef)({
firstRender: true,
helmets: [],
state: undefined
});
const contextValueRef = (0, _react.useRef)(null);
contextValueRef.current ??= {
clientApply() {
if (_constants.IS_DOM_ENVIRONMENT && !heap.state) {
heap.state = (0, _utils.calcAggregatedState)(heap.helmets);
if (heap.state.defer) {
heap.nextAnimFrameId ??= requestAnimationFrame(() => {
heap.state ??= (0, _utils.calcAggregatedState)(heap.helmets);
(0, _client.commitTagChanges)(heap.state, heap.firstRender);
heap.firstRender = false;
delete heap.nextAnimFrameId;
});
} else {
if (heap.nextAnimFrameId !== undefined) {
cancelAnimationFrame(heap.nextAnimFrameId);
delete heap.nextAnimFrameId;
}
(0, _client.commitTagChanges)(heap.state, heap.firstRender);
heap.firstRender = false;
}
}
},
update(id, props) {
const idx = heap.helmets.findIndex(item => item[0] === id);
if (idx >= 0) {
delete heap.state;
if (props) heap.helmets[idx][1] = props;else heap.helmets.splice(idx, 1);
} else if (props) {
delete heap.state;
heap.helmets.push([id, props]);
}
}
};
if (context && (!context.helmet || context.helmet !== heap.serverState)) {
heap.serverState ??= (0, _server.newServerState)(heap);
context.helmet = heap.serverState;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Context, {
value: contextValueRef.current,
children: children
});
};
var _default = exports.default = HelmetProvider;
//# sourceMappingURL=Provider.js.map