-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPopupManagerForExternalControl.tsx
More file actions
53 lines (46 loc) · 1.76 KB
/
PopupManagerForExternalControl.tsx
File metadata and controls
53 lines (46 loc) · 1.76 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
import React from "react";
import { provideRef } from "@worksolutions/react-utils";
import { observer } from "mobx-react-lite";
import { Manager } from "primitives/Popper/Manager";
import { Reference } from "primitives/Popper/Reference";
import VisibilityManager, { VisibilityManagerContextInterface } from "../../VisibilityManager";
import { SetVisibilityContextAndTriggerRef } from "./types";
export type PopupManagerForExternalControlTriggerElementContext = Required<VisibilityManagerContextInterface>;
export interface PopupManagerForExternalControlInterface {
popupElementNode: React.ReactNode;
setVisibilityContextAndTriggerRef: SetVisibilityContextAndTriggerRef;
renderTriggerElement: (context: PopupManagerForExternalControlTriggerElementContext) => JSX.Element;
}
function PopupManagerForExternalControl({
popupElementNode,
renderTriggerElement: TriggerElement,
setVisibilityContextAndTriggerRef,
}: PopupManagerForExternalControlInterface) {
const Element = React.useCallback(
(context: VisibilityManagerContextInterface) => (
<>
<Reference>
{({ ref: reactPopperReferenceRef }) => (
<TriggerElement
toggle={context.toggle}
visible={context.visible}
hide={context.hide}
show={context.show}
initRef={provideRef(context.initRef, reactPopperReferenceRef, setVisibilityContextAndTriggerRef(context))}
/>
)}
</Reference>
</>
),
[TriggerElement, setVisibilityContextAndTriggerRef],
);
return (
<>
<Manager>
<VisibilityManager closeOnClickOutside={false}>{Element}</VisibilityManager>
{popupElementNode}
</Manager>
</>
);
}
export default observer(PopupManagerForExternalControl);