UNPKG

@wordpress/components

Version:
87 lines (65 loc) 2.97 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useContextSystem = useContextSystem; var _emotion = require("emotion"); var _warning = _interopRequireDefault(require("@wordpress/warning")); var _contextSystemProvider = require("./context-system-provider"); var _utils = require("./utils"); var _getStyledClassNameFromKey = require("./get-styled-class-name-from-key"); /** * WordPress dependencies */ /** * Internal dependencies */ /* eslint-disable jsdoc/valid-types */ /** * @template TProps * @typedef {TProps & { className: string; children?: import('react').ReactNode }} ConnectedProps */ /* eslint-enable jsdoc/valid-types */ /** * Custom hook that derives registered props from the Context system. * These derived props are then consolidated with incoming component props. * * @template {{ className?: string }} P * @param {P} props Incoming props from the component. * @param {string} namespace The namespace to register and to derive context props from. * @return {ConnectedProps<P>} The connected props. */ function useContextSystem(props, namespace) { const contextSystemProps = (0, _contextSystemProvider.useComponentsContext)(); if (typeof namespace === 'undefined') { typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? (0, _warning.default)('useContextSystem: Please provide a namespace') : void 0; } const contextProps = (contextSystemProps === null || contextSystemProps === void 0 ? void 0 : contextSystemProps[namespace]) || {}; /* eslint-disable jsdoc/no-undefined-types */ /** @type {ConnectedProps<P>} */ // @ts-ignore We fill in the missing properties below const finalComponentProps = { ...(0, _utils.getConnectedNamespace)(), ...(0, _utils.getNamespace)(namespace) }; /* eslint-enable jsdoc/no-undefined-types */ const { _overrides: overrideProps, ...otherContextProps } = contextProps; const initialMergedProps = Object.entries(otherContextProps).length ? Object.assign({}, otherContextProps, props) : props; const classes = (0, _emotion.cx)((0, _getStyledClassNameFromKey.getStyledClassNameFromKey)(namespace), props.className); // Provides the ability to customize the render of the component. const rendered = typeof initialMergedProps.renderChildren === 'function' ? initialMergedProps.renderChildren(initialMergedProps) : initialMergedProps.children; for (const key in initialMergedProps) { // @ts-ignore filling in missing props finalComponentProps[key] = initialMergedProps[key]; } for (const key in overrideProps) { // @ts-ignore filling in missing props finalComponentProps[key] = overrideProps[key]; } finalComponentProps.children = rendered; finalComponentProps.className = classes; return finalComponentProps; } //# sourceMappingURL=use-context-system.js.map