@dr.pogodin/react-helmet
Version:
Thread-safe Helmet for React 19+ and friends
66 lines (65 loc) • 2.13 kB
JavaScript
import { createContext, useRef, useState } from 'react';
import { commitTagChanges } from './client';
import { IS_DOM_ENVIRONMENT } from './constants';
import { newServerState } from './server';
import { calcAggregatedState } from './utils';
import { jsx as _jsx } from "react/jsx-runtime";
export const Context = /*#__PURE__*/createContext(undefined);
const HelmetProvider = ({
children,
onServerState
}) => {
const heapRef = useRef(null);
if (heapRef.current === null) {
const heap = {
firstRender: true,
helmets: [],
state: undefined
};
if (onServerState) {
heap.serverState ??= newServerState(heap);
onServerState(heap.serverState);
}
heapRef.current = heap;
}
const heap_0 = heapRef.current;
// eslint-disable-next-line react/hook-use-state
const [contextValue] = useState(() => ({
clientApply() {
if (IS_DOM_ENVIRONMENT && !heap_0.state) {
heap_0.state = calcAggregatedState(heap_0.helmets);
if (heap_0.state.defer) {
heap_0.nextAnimFrameId ??= requestAnimationFrame(() => {
heap_0.state ??= calcAggregatedState(heap_0.helmets);
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;
}
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__*/_jsx(Context, {
value: contextValue,
children: children
});
};
export default HelmetProvider;
//# sourceMappingURL=Provider.js.map