UNPKG

1.71 kBJavaScriptView Raw
1import _extends from "@babel/runtime/helpers/esm/extends";
2import forwardRef from '@restart/context/forwardRef';
3import React, { useContext, useMemo } from 'react';
4var ThemeContext = React.createContext({});
5var Consumer = ThemeContext.Consumer,
6 Provider = ThemeContext.Provider;
7
8function ThemeProvider(_ref) {
9 var prefixes = _ref.prefixes,
10 children = _ref.children;
11 var copiedPrefixes = useMemo(function () {
12 return _extends({}, prefixes);
13 }, [prefixes]);
14 return React.createElement(Provider, {
15 value: copiedPrefixes
16 }, children);
17}
18
19export function useBootstrapPrefix(prefix, defaultPrefix) {
20 var prefixes = useContext(ThemeContext);
21 return prefix || prefixes[defaultPrefix] || defaultPrefix;
22}
23
24function createBootstrapComponent(Component, opts) {
25 if (typeof opts === 'string') opts = {
26 prefix: opts
27 };
28 var isClassy = Component.prototype && Component.prototype.isReactComponent; // If it's a functional component make sure we don't break it with a ref
29
30 var _opts = opts,
31 prefix = _opts.prefix,
32 _opts$forwardRefAs = _opts.forwardRefAs,
33 forwardRefAs = _opts$forwardRefAs === void 0 ? isClassy ? 'ref' : 'innerRef' : _opts$forwardRefAs;
34 return forwardRef(function (_ref2, ref) {
35 var props = _extends({}, _ref2);
36
37 props[forwardRefAs] = ref; // eslint-disable-next-line react/prop-types
38
39 var bsPrefix = useBootstrapPrefix(props.bsPrefix, prefix);
40 return React.createElement(Component, _extends({}, props, {
41 bsPrefix: bsPrefix
42 }));
43 }, {
44 displayName: "Bootstrap(" + (Component.displayName || Component.name) + ")"
45 });
46}
47
48export { createBootstrapComponent, Consumer as ThemeConsumer };
49export default ThemeProvider;
\No newline at end of file