UNPKG

@dr.pogodin/react-helmet

Version:

Thread-safe Helmet for React 19+ and friends

66 lines (65 loc) 2.13 kB
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