@wordpress/components
Version:
UI components for WordPress.
73 lines (69 loc) • 2.22 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = Fill;
var _element = require("@wordpress/element");
var _useSlot = _interopRequireDefault(require("./use-slot"));
var _styleProvider = _interopRequireDefault(require("../../style-provider"));
var _jsxRuntime = require("react/jsx-runtime");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
function useForceUpdate() {
const [, setState] = (0, _element.useState)({});
const mountedRef = (0, _element.useRef)(true);
(0, _element.useEffect)(() => {
mountedRef.current = true;
return () => {
mountedRef.current = false;
};
}, []);
return () => {
if (mountedRef.current) {
setState({});
}
};
}
function Fill(props) {
var _slot$fillProps;
const {
name,
children
} = props;
const {
registerFill,
unregisterFill,
...slot
} = (0, _useSlot.default)(name);
const rerender = useForceUpdate();
const ref = (0, _element.useRef)({
rerender
});
(0, _element.useEffect)(() => {
// We register fills so we can keep track of their existence.
// Some Slot implementations need to know if there're already fills
// registered so they can choose to render themselves or not.
registerFill(ref);
return () => {
unregisterFill(ref);
};
}, [registerFill, unregisterFill]);
if (!slot.ref || !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__*/(0, _jsxRuntime.jsx)(_styleProvider.default, {
document: slot.ref.current.ownerDocument,
children: typeof children === 'function' ? children((_slot$fillProps = slot.fillProps) !== null && _slot$fillProps !== void 0 ? _slot$fillProps : {}) : children
});
return (0, _element.createPortal)(wrappedChildren, slot.ref.current);
}
//# sourceMappingURL=fill.js.map