@wordpress/components
Version:
UI components for WordPress.
106 lines (91 loc) • 2.93 kB
JavaScript
;
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