@wordpress/components
Version:
UI components for WordPress.
109 lines (84 loc) • 2.47 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = SlotFillProvider;
var _element = require("@wordpress/element");
var _valtio = require("valtio");
var _utils = require("valtio/utils");
var _isShallowEqual = _interopRequireDefault(require("@wordpress/is-shallow-equal"));
var _slotFillContext = _interopRequireDefault(require("./slot-fill-context"));
// @ts-nocheck
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
function createSlotRegistry() {
const slots = (0, _utils.proxyMap)();
const fills = (0, _utils.proxyMap)();
function registerSlot(name, ref, fillProps) {
const slot = slots.get(name) || {};
slots.set(name, (0, _valtio.ref)({ ...slot,
ref: ref || slot.ref,
fillProps: fillProps || slot.fillProps || {}
}));
}
function unregisterSlot(name, ref) {
var _slots$get;
// 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 = slots.get(name)) === null || _slots$get === void 0 ? void 0 : _slots$get.ref) === ref) {
slots.delete(name);
}
}
function 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.map(fill => fill.current.rerender());
}
}
function registerFill(name, ref) {
fills.set(name, (0, _valtio.ref)([...(fills.get(name) || []), ref]));
}
function unregisterFill(name, ref) {
const fillsForName = fills.get(name);
if (!fillsForName) {
return;
}
fills.set(name, (0, _valtio.ref)(fillsForName.filter(fillRef => fillRef !== ref)));
}
return {
slots,
fills,
registerSlot,
updateSlot,
unregisterSlot,
registerFill,
unregisterFill
};
}
function SlotFillProvider(_ref) {
let {
children
} = _ref;
const [registry] = (0, _element.useState)(createSlotRegistry);
return (0, _element.createElement)(_slotFillContext.default.Provider, {
value: registry
}, children);
}
//# sourceMappingURL=slot-fill-provider.js.map