UNPKG

react-with-hoc

Version:

Work with React and HOCs (Higher-Order Components)

39 lines 6.42 kB
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