UNPKG

2.68 kBJavaScriptView Raw
1"use client";
2
3import * as React from 'react';
4import useMergedState from "rc-util/es/hooks/useMergedState";
5import ConfigProvider, { ConfigContext } from '../config-provider';
6export function withPureRenderTheme(Component) {
7 return props => (/*#__PURE__*/React.createElement(ConfigProvider, {
8 theme: {
9 token: {
10 motion: false,
11 zIndexPopupBase: 0
12 }
13 }
14 }, /*#__PURE__*/React.createElement(Component, Object.assign({}, props))));
15}
16/* istanbul ignore next */
17const genPurePanel = (Component, defaultPrefixCls, getDropdownCls, postProps) => {
18 const PurePanel = props => {
19 const {
20 prefixCls: customizePrefixCls,
21 style
22 } = props;
23 const holderRef = React.useRef(null);
24 const [popupHeight, setPopupHeight] = React.useState(0);
25 const [popupWidth, setPopupWidth] = React.useState(0);
26 const [open, setOpen] = useMergedState(false, {
27 value: props.open
28 });
29 const {
30 getPrefixCls
31 } = React.useContext(ConfigContext);
32 const prefixCls = getPrefixCls(defaultPrefixCls || 'select', customizePrefixCls);
33 React.useEffect(() => {
34 // We do not care about ssr
35 setOpen(true);
36 if (typeof ResizeObserver !== 'undefined') {
37 const resizeObserver = new ResizeObserver(entries => {
38 const element = entries[0].target;
39 setPopupHeight(element.offsetHeight + 8);
40 setPopupWidth(element.offsetWidth);
41 });
42 const interval = setInterval(() => {
43 var _a;
44 const dropdownCls = getDropdownCls ? `.${getDropdownCls(prefixCls)}` : `.${prefixCls}-dropdown`;
45 const popup = (_a = holderRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(dropdownCls);
46 if (popup) {
47 clearInterval(interval);
48 resizeObserver.observe(popup);
49 }
50 }, 10);
51 return () => {
52 clearInterval(interval);
53 resizeObserver.disconnect();
54 };
55 }
56 }, []);
57 let mergedProps = Object.assign(Object.assign({}, props), {
58 style: Object.assign(Object.assign({}, style), {
59 margin: 0
60 }),
61 open,
62 visible: open,
63 getPopupContainer: () => holderRef.current
64 });
65 if (postProps) {
66 mergedProps = postProps(mergedProps);
67 }
68 const mergedStyle = {
69 paddingBottom: popupHeight,
70 position: 'relative',
71 minWidth: popupWidth
72 };
73 return /*#__PURE__*/React.createElement("div", {
74 ref: holderRef,
75 style: mergedStyle
76 }, /*#__PURE__*/React.createElement(Component, Object.assign({}, mergedProps)));
77 };
78 return withPureRenderTheme(PurePanel);
79};
80export default genPurePanel;
\No newline at end of file