UNPKG

@geezee/react-ui

Version:

Modern and minimalist React UI library.

72 lines (61 loc) 2.25 kB
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;