UNPKG

@appbuckets/react-ui

Version:
75 lines (72 loc) 2.07 kB
import { __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import realyFastDeepClone from 'rfdc'; import { defaultBucketThemeConfig } from './BucketTheme.default.js'; /* -------- * Build the Deep Clone Function * -------- */ var deepClone = realyFastDeepClone(); /* -------- * Prebuild the Context * -------- */ var ThemeContext = React.createContext(undefined); function useBucketTheme() { /** Get the current context value */ var currentContext = React.useContext(ThemeContext); /** Allow hook call outside content, returning the default object */ if (!currentContext) { return { theme: defaultBucketThemeConfig, }; } /** Return the Context if exists */ return currentContext; } /* -------- * Define an Hook to get Theme Options * -------- */ function useComponentProps(componentName) { /** Get the theme */ var _a = useBucketTheme(), _b = componentName, componentProps = _a.theme[_b]; return React.useMemo( function () { return deepClone(componentProps); }, [componentProps] ); } function useWithDefaultProps(componentName, props) { /** Get the Theme Component Props */ var componentProps = useComponentProps(componentName); /** Produce props unions */ var propsUnions = __assign(__assign({}, componentProps), props); /** Merge classNames */ if (componentProps.className || props.className) { propsUnions.className = clsx(componentProps.className, props.className); } /** Merge style */ if (componentProps.style || props.style) { propsUnions.style = __assign( __assign({}, componentProps.style), props.style ); } return propsUnions; } function withDefaultProps(componentName, Component) { return function (receivedProps) { /** Merge props with default */ var props = useWithDefaultProps(componentName, receivedProps); /** Return the Component */ return React.createElement(Component, __assign({}, props)); }; } export { ThemeContext, useComponentProps, useWithDefaultProps, withDefaultProps, };