@wordpress/components
Version:
UI components for WordPress.
83 lines (80 loc) • 2.31 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 _compose = require("@wordpress/compose");
var _slotFillContext = _interopRequireDefault(require("./slot-fill-context"));
var _jsxRuntime = require("react/jsx-runtime");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
function createSlotRegistry() {
const slots = (0, _compose.observableMap)();
const fills = (0, _compose.observableMap)();
const registerSlot = (name, ref, fillProps) => {
const slot = slots.get(name);
slots.set(name, {
...slot,
ref: ref || slot?.ref,
fillProps: fillProps || slot?.fillProps || {}
});
};
const unregisterSlot = (name, ref) => {
// Make sure we're not unregistering a slot registered by another element
// See https://github.com/WordPress/gutenberg/pull/19242#issuecomment-590295412
if (slots.get(name)?.ref === ref) {
slots.delete(name);
}
};
const updateSlot = (name, fillProps) => {
const slot = slots.get(name);
if (!slot) {
return;
}
if ((0, _isShallowEqual.default)(slot.fillProps, fillProps)) {
return;
}
slot.fillProps = fillProps;
const slotFills = fills.get(name);
if (slotFills) {
// Force update fills.
slotFills.forEach(fill => fill.current.rerender());
}
};
const registerFill = (name, ref) => {
fills.set(name, [...(fills.get(name) || []), ref]);
};
const unregisterFill = (name, ref) => {
const fillsForName = fills.get(name);
if (!fillsForName) {
return;
}
fills.set(name, fillsForName.filter(fillRef => fillRef !== ref));
};
return {
slots,
fills,
registerSlot,
updateSlot,
unregisterSlot,
registerFill,
unregisterFill
};
}
function SlotFillProvider({
children
}) {
const [registry] = (0, _element.useState)(createSlotRegistry);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_slotFillContext.default.Provider, {
value: registry,
children: children
});
}
//# sourceMappingURL=slot-fill-provider.js.map