@geezee/react-ui
Version:
Modern and minimalist React UI library.
72 lines (61 loc) • 2.25 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _typeof from "@babel/runtime/helpers/esm/typeof";
import React from 'react';
import useTheme from '../use-theme';
import darkTheme from '../themes/dark';
import lightTheme from '../themes/default';
import ThemeContext from '../use-theme/theme-context';
import useWarning from '../../utils/use-warning';
export var isObject = function isObject(target) {
return target && _typeof(target) === 'object';
};
export var deepMergeObject = function deepMergeObject(source, target) {
if (!isObject(target) || !isObject(source)) return source;
var sourceKeys = Object.keys(source);
var result = {};
for (var _i = 0, _sourceKeys = sourceKeys; _i < _sourceKeys.length; _i++) {
var _key = _sourceKeys[_i];
var sourceValue = source[_key];
var targetValue = target[_key];
if (Array.isArray(sourceValue) && Array.isArray(targetValue)) {
result[_key] = targetValue.concat(sourceValue);
} else if (isObject(sourceValue) && isObject(targetValue)) {
result[_key] = deepMergeObject(sourceValue, _extends({}, targetValue));
} else if (targetValue) {
result[_key] = targetValue;
} else {
result[_key] = sourceValue;
}
}
return result;
};
var mergeTheme = function mergeTheme(current, custom) {
if (!custom) return current;
if (typeof custom === 'function') {
var merged = custom(current);
if (!merged || _typeof(merged) !== 'object') {
useWarning('The theme function must return object value.');
}
return merged;
}
return deepMergeObject(current, custom);
};
var switchTheme = function switchTheme(mergedTheme) {
var themes = {
light: lightTheme,
dark: darkTheme
};
return _extends(_extends({}, mergedTheme), themes[mergedTheme.type]);
};
var ThemeProvider = function ThemeProvider(_ref) {
var children = _ref.children,
theme = _ref.theme;
var customTheme = theme;
var currentTheme = useTheme();
var merged = mergeTheme(currentTheme, customTheme);
var userTheme = currentTheme.type !== merged.type ? switchTheme(merged) : merged;
return /*#__PURE__*/React.createElement(ThemeContext.Provider, {
value: userTheme
}, children);
};
export default ThemeProvider;