react-with-hoc
Version:
Work with React and HOCs (Higher-Order Components)
39 lines • 6.42 kB
JavaScript
import React, { useMemo } from "react";
import { newHoc } from "../utils/newHoc";
/**
* add value to a prop based on a function and/or other props
* @see {@link withDefaults} {@link withDefault} {@link withOverride} {@link withOverrides}
* @example
* function Card({ content, icon, border }: {
* content: string;
* icon?: "star" | "heart" | ...;
* }) {
* return <>...</>
* }
* const StandardCard = withFactory<{content: string; icon?: Icon}>("icon", ({content, icon}) => content.includes("star") ? "star" : icon)(Card);
*
* <StandardCard content="some content with star" icon="heart" />
* // is equivalent to
* <CardWithIcon content="some content with star" icon="star" />
*
* // and
* <StandardCard content="some content" icon="heart" />
* // is equivalent to
* <CardWithIcon content="some content" icon="heart" />
*/
export const withFactory = newHoc(function withFactory(Component, propName, init, dependencyNames) {
return function WithFactory(props) {
if (process.env.NODE_ENV !== "production") {
if (!dependencyNames) {
throw new Error("withFactory used with init function should have dependencyNames defined");
}
}
const value = useMemo(() => init(props), dependencyNames.map(dependencyName => props[dependencyName]));
return /*#__PURE__*/React.createElement(Component, {
...props,
[propName]: value
});
};
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZU1lbW8iLCJuZXdIb2MiLCJ3aXRoRmFjdG9yeSIsIkNvbXBvbmVudCIsInByb3BOYW1lIiwiaW5pdCIsImRlcGVuZGVuY3lOYW1lcyIsIldpdGhGYWN0b3J5IiwicHJvcHMiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJFcnJvciIsInZhbHVlIiwibWFwIiwiZGVwZW5kZW5jeU5hbWUiLCJjcmVhdGVFbGVtZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvY3Mvd2l0aEZhY3RvcnkudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnRUeXBlLCBGdW5jdGlvbkNvbXBvbmVudCwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeU5hbWVzIH0gZnJvbSBcIi4uL3R5cGVzL0RlcGVuZGVuY3lOYW1lc1wiO1xuaW1wb3J0IHtcbiAgRm4sXG4gIEhhc0FsbFByb3BzRm4sXG4gIElmVGhlbkZuLFxuICBJbnRlcnNlY3Rpb25GbixcbiAgS2VlcE5ldmVyc0ZuLFxuICBPbWl0Rm4sXG4gIFBpcGUsXG4gIFJlcGxhY2VGbixcbiAgVG9TY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy9GblwiO1xuaW1wb3J0IHsgSG9jIH0gZnJvbSBcIi4uL3R5cGVzL0hvY1wiO1xuaW1wb3J0IHsgbmV3SG9jIH0gZnJvbSBcIi4uL3V0aWxzL25ld0hvY1wiO1xuXG5pbnRlcmZhY2UgV2l0aEZhY3RvcnlGbjxcbiAgUHJvcE5hbWUgZXh0ZW5kcyBzdHJpbmcsXG4gIFByb3BWYWx1ZSxcbiAgRGVwZW5kZW5jeVByb3BzIGV4dGVuZHMgW3N0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgYW55XSxcbj4gZXh0ZW5kcyBGbiB7XG4gIHJldHVybjogUGlwZTxcbiAgICB0aGlzW1wiYXJnMFwiXSxcbiAgICBbXG4gICAgICBJZlRoZW5GbjxcbiAgICAgICAgSGFzQWxsUHJvcHNGbjxQcm9wTmFtZT4sXG4gICAgICAgIFtJbnRlcnNlY3Rpb25GbjxbUHJvcE5hbWUsIFByb3BWYWx1ZV0+LCBLZWVwTmV2ZXJzRm48T21pdEZuPFByb3BOYW1lPj5dXG4gICAgICA+LFxuICAgICAgS2VlcE5ldmVyc0ZuPFJlcGxhY2VGbjxEZXBlbmRlbmN5UHJvcHM+PixcbiAgICBdXG4gID47XG59XG5cbnR5cGUgV2l0aEZhY3RvcnlIb2MgPSA8XG4gIFByb3BWYWx1ZSxcbiAgUHJvcE5hbWUgZXh0ZW5kcyBzdHJpbmcsXG4gIERlcGVuZGVuY3lQcm9wcyBleHRlbmRzIG9iamVjdCxcbiAgVERlcGVuZGVuY3lOYW1lIGV4dGVuZHNcbiAgICBEZXBlbmRlbmN5TmFtZXM8RGVwZW5kZW5jeVByb3BzPiA9IERlcGVuZGVuY3lOYW1lczxEZXBlbmRlbmN5UHJvcHM+LFxuPihcbiAgcHJvcE5hbWU6IFByb3BOYW1lLFxuICBmYWN0b3J5OiAocHJvcHM6IERlcGVuZGVuY3lQcm9wcykgPT4gUHJvcFZhbHVlLFxuICBkZXBlbmRlbmN5TmFtZXM6IFREZXBlbmRlbmN5TmFtZSxcbikgPT4gSG9jPFtXaXRoRmFjdG9yeUZuPFByb3BOYW1lLCBQcm9wVmFsdWUsIFRvU2NoZW1hPERlcGVuZGVuY3lQcm9wcz4+XT47XG5cbi8qKlxuICogYWRkIHZhbHVlIHRvIGEgcHJvcCBiYXNlZCBvbiBhIGZ1bmN0aW9uIGFuZC9vciBvdGhlciBwcm9wc1xuICogQHNlZSB7QGxpbmsgd2l0aERlZmF1bHRzfSB7QGxpbmsgd2l0aERlZmF1bHR9IHtAbGluayB3aXRoT3ZlcnJpZGV9IHtAbGluayB3aXRoT3ZlcnJpZGVzfVxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIENhcmQoeyBjb250ZW50LCBpY29uLCBib3JkZXIgfToge1xuICogICBjb250ZW50OiBzdHJpbmc7XG4gKiAgIGljb24/OiBcInN0YXJcIiB8IFwiaGVhcnRcIiB8IC4uLjtcbiAqIH0pIHtcbiAqICAgcmV0dXJuIDw+Li4uPC8+XG4gKiB9XG4gKiBjb25zdCBTdGFuZGFyZENhcmQgPSB3aXRoRmFjdG9yeTx7Y29udGVudDogc3RyaW5nOyBpY29uPzogSWNvbn0+KFwiaWNvblwiLCAoe2NvbnRlbnQsIGljb259KSA9PiBjb250ZW50LmluY2x1ZGVzKFwic3RhclwiKSA/IFwic3RhclwiIDogaWNvbikoQ2FyZCk7XG4gKlxuICogPFN0YW5kYXJkQ2FyZCBjb250ZW50PVwic29tZSBjb250ZW50IHdpdGggc3RhclwiIGljb249XCJoZWFydFwiIC8+XG4gKiAvLyBpcyBlcXVpdmFsZW50IHRvXG4gKiA8Q2FyZFdpdGhJY29uIGNvbnRlbnQ9XCJzb21lIGNvbnRlbnQgd2l0aCBzdGFyXCIgaWNvbj1cInN0YXJcIiAvPlxuICpcbiAqIC8vIGFuZFxuICogPFN0YW5kYXJkQ2FyZCBjb250ZW50PVwic29tZSBjb250ZW50XCIgaWNvbj1cImhlYXJ0XCIgLz5cbiAqIC8vIGlzIGVxdWl2YWxlbnQgdG9cbiAqIDxDYXJkV2l0aEljb24gY29udGVudD1cInNvbWUgY29udGVudFwiIGljb249XCJoZWFydFwiIC8+XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmFjdG9yeSA9IG5ld0hvYzxXaXRoRmFjdG9yeUhvYz4oZnVuY3Rpb24gd2l0aEZhY3RvcnkoXG4gIENvbXBvbmVudDogQ29tcG9uZW50VHlwZSxcbiAgcHJvcE5hbWU6IHN0cmluZyxcbiAgaW5pdDogKHByb3BzOiBhbnkpID0+IGFueSxcbiAgZGVwZW5kZW5jeU5hbWVzOiBzdHJpbmdbXSxcbik6IEZ1bmN0aW9uQ29tcG9uZW50IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdpdGhGYWN0b3J5KHByb3BzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKCFkZXBlbmRlbmN5TmFtZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwid2l0aEZhY3RvcnkgdXNlZCB3aXRoIGluaXQgZnVuY3Rpb24gc2hvdWxkIGhhdmUgZGVwZW5kZW5jeU5hbWVzIGRlZmluZWRcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gaW5pdChwcm9wcyksXG5cbiAgICAgIGRlcGVuZGVuY3lOYW1lcy5tYXAoKGRlcGVuZGVuY3lOYW1lKSA9PiBwcm9wc1tkZXBlbmRlbmN5TmFtZV0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IHsuLi57IFtwcm9wTmFtZV06IHZhbHVlIH19IC8+O1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLEtBQUssSUFBc0NDLE9BQU8sUUFBUSxPQUFPO0FBY3hFLFNBQVNDLE1BQU0sUUFBUSxpQkFBaUI7QUErQnhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTUMsV0FBVyxHQUFHRCxNQUFNLENBQWlCLFNBQVNDLFdBQVdBLENBQ3BFQyxTQUF3QixFQUN4QkMsUUFBZ0IsRUFDaEJDLElBQXlCLEVBQ3pCQyxlQUF5QixFQUNOO0VBQ25CLE9BQU8sU0FBU0MsV0FBV0EsQ0FBQ0MsS0FBVSxFQUFlO0lBQ25ELElBQUlDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDQyxRQUFRLEtBQUssWUFBWSxFQUFFO01BQ3pDLElBQUksQ0FBQ0wsZUFBZSxFQUFFO1FBQ3BCLE1BQU0sSUFBSU0sS0FBSyxDQUNiLHlFQUNGLENBQUM7TUFDSDtJQUNGO0lBQ0EsTUFBTUMsS0FBSyxHQUFHYixPQUFPLENBQ25CLE1BQU1LLElBQUksQ0FBQ0csS0FBSyxDQUFDLEVBRWpCRixlQUFlLENBQUNRLEdBQUcsQ0FBRUMsY0FBYyxJQUFLUCxLQUFLLENBQUNPLGNBQWMsQ0FBQyxDQUMvRCxDQUFDO0lBRUQsb0JBQU9oQixLQUFBLENBQUFpQixhQUFBLENBQUNiLFNBQVM7TUFBQSxHQUFLSyxLQUFLO01BQVEsQ0FBQ0osUUFBUSxHQUFHUztJQUFLLENBQUssQ0FBQztFQUM1RCxDQUFDO0FBQ0gsQ0FBQyxDQUFDIn0=
//# sourceMappingURL=withFactory.js.map