UNPKG

react-component-override

Version:
52 lines (51 loc) 2.42 kB
"use strict"; 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;