@wordpress/components
Version:
UI components for WordPress.
44 lines (41 loc) • 1.67 kB
JavaScript
/**
* WordPress dependencies
*/
import { useObservableValue } from '@wordpress/compose';
import { useContext, useRef, useEffect, createPortal } from '@wordpress/element';
/**
* Internal dependencies
*/
import SlotFillContext from './slot-fill-context';
import StyleProvider from '../../style-provider';
import { jsx as _jsx } from "react/jsx-runtime";
export default function Fill({
name,
children
}) {
var _slot$fillProps;
const registry = useContext(SlotFillContext);
const slot = useObservableValue(registry.slots, name);
const instanceRef = useRef({});
// We register fills so we can keep track of their existence.
// Slots can use the `useSlotFills` hook to know if there're already fills
// registered so they can choose to render themselves or not.
useEffect(() => {
const instance = instanceRef.current;
registry.registerFill(name, instance);
return () => registry.unregisterFill(name, instance);
}, [registry, name]);
if (!slot || !slot.ref.current) {
return null;
}
// When using a `Fill`, the `children` will be rendered in the document of the
// `Slot`. This means that we need to wrap the `children` in a `StyleProvider`
// to make sure we're referencing the right document/iframe (instead of the
// context of the `Fill`'s parent).
const wrappedChildren = /*#__PURE__*/_jsx(StyleProvider, {
document: slot.ref.current.ownerDocument,
children: typeof children === 'function' ? children((_slot$fillProps = slot.fillProps) !== null && _slot$fillProps !== void 0 ? _slot$fillProps : {}) : children
});
return createPortal(wrappedChildren, slot.ref.current);
}
//# sourceMappingURL=fill.js.map