1 | "use client";
|
2 |
|
3 | import * as React from 'react';
|
4 | import useMergedState from "rc-util/es/hooks/useMergedState";
|
5 | import ConfigProvider, { ConfigContext } from '../config-provider';
|
6 | export function withPureRenderTheme(Component) {
|
7 | return props => (React.createElement(ConfigProvider, {
|
8 | theme: {
|
9 | token: {
|
10 | motion: false,
|
11 | zIndexPopupBase: 0
|
12 | }
|
13 | }
|
14 | }, React.createElement(Component, Object.assign({}, props))));
|
15 | }
|
16 |
|
17 | const 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 |
|
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 React.createElement("div", {
|
74 | ref: holderRef,
|
75 | style: mergedStyle
|
76 | }, React.createElement(Component, Object.assign({}, mergedProps)));
|
77 | };
|
78 | return withPureRenderTheme(PurePanel);
|
79 | };
|
80 | export default genPurePanel; |
\ | No newline at end of file |