UNPKG

@wordpress/components

Version:
106 lines (91 loc) 2.93 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SlotFillProvider; var _element = require("@wordpress/element"); var _isShallowEqual = _interopRequireDefault(require("@wordpress/is-shallow-equal")); var _slotFillContext = _interopRequireDefault(require("./slot-fill-context")); /** * WordPress dependencies */ /** * Internal dependencies */ function useSlotRegistry() { const [slots, setSlots] = (0, _element.useState)({}); const [fills, setFills] = (0, _element.useState)({}); const registerSlot = (0, _element.useCallback)((name, ref, fillProps) => { setSlots(prevSlots => { const slot = prevSlots[name] || {}; return { ...prevSlots, [name]: { ...slot, ref: ref || slot.ref, fillProps: fillProps || slot.fillProps || {} } }; }); }, []); const unregisterSlot = (0, _element.useCallback)((name, ref) => { setSlots(prevSlots => { const { [name]: slot, ...nextSlots } = prevSlots; // Make sure we're not unregistering a slot registered by another element // See https://github.com/WordPress/gutenberg/pull/19242#issuecomment-590295412 if ((slot === null || slot === void 0 ? void 0 : slot.ref) === ref) { return nextSlots; } return prevSlots; }); }, []); const updateSlot = (0, _element.useCallback)((name, fillProps) => { const slot = slots[name]; if (!slot) { return; } if (!(0, _isShallowEqual.default)(slot.fillProps, fillProps)) { slot.fillProps = fillProps; const slotFills = fills[name]; if (slotFills) { // Force update fills slotFills.map(fill => fill.current.rerender()); } } }, [slots, fills]); const registerFill = (0, _element.useCallback)((name, ref) => { setFills(prevFills => ({ ...prevFills, [name]: [...(prevFills[name] || []), ref] })); }, []); const unregisterFill = (0, _element.useCallback)((name, ref) => { setFills(prevFills => { if (prevFills[name]) { return { ...prevFills, [name]: prevFills[name].filter(fillRef => fillRef !== ref) }; } return prevFills; }); }, []); // Memoizing the return value so it can be directly passed to Provider value const registry = (0, _element.useMemo)(() => ({ slots, fills, registerSlot, updateSlot, unregisterSlot, registerFill, unregisterFill }), [slots, fills, registerSlot, updateSlot, unregisterSlot, registerFill, unregisterFill]); return registry; } function SlotFillProvider({ children }) { const registry = useSlotRegistry(); return (0, _element.createElement)(_slotFillContext.default.Provider, { value: registry }, children); } //# sourceMappingURL=slot-fill-provider.js.map