-
Notifications
You must be signed in to change notification settings - Fork 75
Expand file tree
/
Copy pathComboboxMenuWrapper.tsx
More file actions
105 lines (99 loc) · 3.32 KB
/
ComboboxMenuWrapper.tsx
File metadata and controls
105 lines (99 loc) · 3.32 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
import classNames from "classnames";
import { UseComboboxPropGetters } from "downshift/typings";
import { MouseEvent, PropsWithChildren, ReactElement, ReactNode } from "react";
import { useMenuStyle } from "../hooks/useMenuStyle";
import { NoOptionsPlaceholder } from "./Placeholder";
interface ComboboxMenuWrapperProps extends PropsWithChildren, Partial<UseComboboxPropGetters<string>> {
alwaysOpen?: boolean;
highlightedIndex?: number | null;
isEmpty: boolean;
isLoading: boolean;
isOpen: boolean;
lazyLoading: boolean;
loader: ReactNode;
menuFooterContent?: ReactNode;
menuHeaderContent?: ReactNode;
noOptionsText?: string;
onOptionClick?: (e: MouseEvent) => void;
onScroll?: (e: any) => void;
}
function PreventMenuCloseEventHandler(e: MouseEvent): void {
e.stopPropagation();
}
function ForcePreventMenuCloseEventHandler(e: MouseEvent): void {
e.preventDefault();
e.stopPropagation();
}
export function ComboboxMenuWrapper(props: ComboboxMenuWrapperProps): ReactElement {
const {
alwaysOpen,
children,
getMenuProps,
highlightedIndex,
isEmpty,
isLoading,
isOpen,
lazyLoading,
loader,
menuFooterContent,
menuHeaderContent,
noOptionsText,
onOptionClick,
onScroll
} = props;
const [ref, style] = useMenuStyle<HTMLDivElement>(isOpen);
return (
<div
ref={ref}
className={classNames("widget-combobox-menu", { "widget-combobox-menu-hidden": !isOpen })}
style={
alwaysOpen
? {
display: "block",
visibility: "visible",
position: "relative"
}
: style
}
data-overlay-content={isOpen || undefined}
>
{menuHeaderContent && (
<div
className="widget-combobox-menu-header widget-combobox-item"
onMouseDown={PreventMenuCloseEventHandler}
tabIndex={0}
>
{menuHeaderContent}
</div>
)}
<ul
className={classNames("widget-combobox-menu-list", {
"widget-combobox-menu-highlighted": (highlightedIndex ?? -1) >= 0,
"widget-combobox-menu-lazy-scroll": lazyLoading && !isEmpty
})}
{...getMenuProps?.(
{
onClick: onOptionClick,
onMouseDown: ForcePreventMenuCloseEventHandler,
onScroll
},
{ suppressRefError: true }
)}
>
{isOpen ? (
isEmpty && !isLoading ? (
<NoOptionsPlaceholder>{noOptionsText}</NoOptionsPlaceholder>
) : (
children
)
) : null}
{loader}
</ul>
{menuFooterContent && (
<div tabIndex={0} className="widget-combobox-menu-footer" onMouseDown={PreventMenuCloseEventHandler}>
{menuFooterContent}
</div>
)}
</div>
);
}