react-component-override
Version:
Library for overriding react components at runtime.
52 lines (51 loc) • 2.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createOverrides = exports.override = exports.overridable = void 0;
const jsx_runtime_1 = require("react/jsx-runtime");
const react_1 = require("react");
const hoist_non_react_statics_1 = __importDefault(require("hoist-non-react-statics"));
const overrides_context_1 = require("./overrides.context");
const utils_1 = require("./utils");
const override_context_1 = require("./override.context");
const overridableGeneratorId = (0, utils_1.idGenerator)();
function overridable(Component) {
const overridableId = overridableGeneratorId.next().value;
const OverridableComponent = function (props) {
var _a;
const { overrides } = (_a = (0, overrides_context_1.useOverrides)()) !== null && _a !== void 0 ? _a : {};
const currentOverrideId = (0, override_context_1.useCurrentOverride)();
const RenderComponent = (0, react_1.useMemo)(() => {
const Override = overrides === null || overrides === void 0 ? void 0 : overrides[overridableId];
const isOverriddenWithItSelf = currentOverrideId === overridableId;
if (isOverriddenWithItSelf) {
return Component;
}
return Override !== null && Override !== void 0 ? Override : Component;
}, [currentOverrideId, overrides]);
return (0, jsx_runtime_1.jsx)(RenderComponent, Object.assign({}, props));
};
OverridableComponent.overridableId =
overridableId;
(0, hoist_non_react_statics_1.default)(OverridableComponent, Component);
return OverridableComponent;
}
exports.overridable = overridable;
function override(Current, Override) {
const EnhancedOverride = function (props) {
return ((0, jsx_runtime_1.jsx)(override_context_1.OverrideProvider, Object.assign({ value: {
overrideId: Current.overridableId
} }, { children: (0, jsx_runtime_1.jsx)(Override, Object.assign({}, props)) })));
};
(0, hoist_non_react_statics_1.default)(EnhancedOverride, Override);
return {
[Current.overridableId]: EnhancedOverride
};
}
exports.override = override;
function createOverrides(overrides) {
return overrides;
}
exports.createOverrides = createOverrides;