forked from Hacker0x01/react-datepicker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpopper_component.tsx
More file actions
109 lines (97 loc) · 3.03 KB
/
popper_component.tsx
File metadata and controls
109 lines (97 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import { FloatingArrow } from "@floating-ui/react";
import { clsx } from "clsx";
import React, { createElement } from "react";
import Portal from "./portal";
import TabLoop from "./tab_loop";
import withFloating from "./with_floating";
import type { FloatingProps } from "./with_floating";
import type { ReactNode } from "react";
interface PortalProps
extends Omit<React.ComponentPropsWithoutRef<typeof Portal>, "children"> {}
interface TabLoopProps
extends Omit<React.ComponentPropsWithoutRef<typeof TabLoop>, "children"> {}
interface PopperComponentProps
extends Omit<PortalProps, "portalId">,
TabLoopProps,
FloatingProps {
className?: string;
wrapperClassName?: string;
popperComponent: React.ReactNode;
popperContainer?: React.FC<{ children?: ReactNode | undefined }>;
targetComponent: React.ReactNode;
popperOnKeyDown: React.KeyboardEventHandler<HTMLDivElement>;
showArrow?: boolean;
portalId?: PortalProps["portalId"];
}
// Exported for testing purposes
export const PopperComponent: React.FC<PopperComponentProps> = (props) => {
const {
className,
wrapperClassName,
hidePopper = true,
popperComponent,
targetComponent,
enableTabLoop,
popperOnKeyDown,
portalId,
portalHost,
popperProps,
showArrow,
} = props;
let popper: React.ReactElement | undefined = undefined;
if (!hidePopper) {
const classes = clsx(
"react-datepicker-popper",
!showArrow && "react-datepicker-popper-offset",
className,
);
popper = (
<TabLoop enableTabLoop={enableTabLoop}>
{/* eslint-disable react-hooks/refs -- Floating UI values are designed to be used during render */}
<div
ref={popperProps.refs.setFloating}
style={popperProps.floatingStyles}
className={classes}
data-placement={popperProps.placement}
onKeyDown={popperOnKeyDown}
>
{popperComponent}
{showArrow && (
<FloatingArrow
ref={popperProps.arrowRef}
context={popperProps.context}
fill="currentColor"
strokeWidth={1}
height={8}
width={16}
style={{ transform: "translateY(-1px)" }}
className="react-datepicker__triangle"
/>
)}
</div>
{/* eslint-enable react-hooks/refs */}
</TabLoop>
);
}
if (props.popperContainer) {
popper = createElement(props.popperContainer, {}, popper);
}
if (portalId && !hidePopper) {
popper = (
<Portal portalId={portalId} portalHost={portalHost}>
{popper}
</Portal>
);
}
const wrapperClasses = clsx("react-datepicker-wrapper", wrapperClassName);
return (
<>
{/* eslint-disable-next-line react-hooks/refs -- Floating UI refs are designed to be used during render */}
<div ref={popperProps.refs.setReference} className={wrapperClasses}>
{targetComponent}
</div>
{popper}
</>
);
};
export default withFloating<PopperComponentProps>(PopperComponent);