rsuite
Version:
A suite of react components
60 lines (54 loc) • 2.21 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
import React, { useEffect } from 'react';
import { getClassNamePrefix, prefix } from '../utils/prefix';
import { addClass, removeClass, canUseDOM } from '../DOMHelper';
import ToastContainer, { toastPlacements } from '../toaster/ToastContainer';
import { usePortal } from '../utils';
var CustomContext = /*#__PURE__*/React.createContext({});
var Consumer = CustomContext.Consumer,
Provider = CustomContext.Provider;
var themes = ['light', 'dark', 'high-contrast'];
var CustomProvider = function CustomProvider(props) {
var children = props.children,
_props$classPrefix = props.classPrefix,
classPrefix = _props$classPrefix === void 0 ? getClassNamePrefix() : _props$classPrefix,
theme = props.theme,
container = props.toastContainer,
rest = _objectWithoutPropertiesLoose(props, ["children", "classPrefix", "theme", "toastContainer"]);
var toasters = React.useRef(new Map());
var _usePortal = usePortal({
container: container
}),
Portal = _usePortal.Portal;
var value = React.useMemo(function () {
return _extends({
classPrefix: classPrefix,
theme: theme,
toasters: toasters
}, rest);
}, [classPrefix, theme, rest]);
useEffect(function () {
if (canUseDOM && theme) {
addClass(document.body, prefix(classPrefix, "theme-" + theme)); // Remove the className that will cause style conflicts
themes.forEach(function (t) {
if (t !== theme) {
removeClass(document.body, prefix(classPrefix, "theme-" + t));
}
});
}
}, [classPrefix, theme]);
return /*#__PURE__*/React.createElement(Provider, {
value: value
}, children, /*#__PURE__*/React.createElement(Portal, null, toastPlacements.map(function (placement) {
return /*#__PURE__*/React.createElement(ToastContainer, {
key: placement,
placement: placement,
ref: function ref(_ref) {
toasters.current.set(placement, _ref);
}
});
})));
};
export { CustomContext, Consumer as CustomConsumer };
export default CustomProvider;