@appbuckets/react-ui
Version:
Just Another React UI Framework
75 lines (72 loc) • 2.07 kB
JavaScript
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,
};