1 | import { useWarning } from "reakit-warning";
|
2 | import { createComponent } from "reakit-system/createComponent";
|
3 | import { useCreateElement } from "reakit-system/useCreateElement";
|
4 | import { createHook } from "reakit-system/createHook";
|
5 | import { useForkRef } from "reakit-utils/useForkRef";
|
6 | import { DialogOptions, DialogHTMLProps, useDialog } from "../Dialog/Dialog";
|
7 | import { PopoverStateReturn } from "./PopoverState";
|
8 | import { POPOVER_KEYS } from "./__keys";
|
9 |
|
10 | export type PopoverOptions = DialogOptions &
|
11 | Pick<
|
12 | Partial<PopoverStateReturn>,
|
13 | "unstable_popoverRef" | "unstable_popoverStyles"
|
14 | >;
|
15 |
|
16 | export type PopoverHTMLProps = DialogHTMLProps;
|
17 |
|
18 | export type PopoverProps = PopoverOptions & PopoverHTMLProps;
|
19 |
|
20 | export const usePopover = createHook<PopoverOptions, PopoverHTMLProps>({
|
21 | name: "Popover",
|
22 | compose: useDialog,
|
23 | keys: POPOVER_KEYS,
|
24 |
|
25 | useOptions({ modal = false, ...options }) {
|
26 | return { modal, ...options };
|
27 | },
|
28 |
|
29 | useProps(options, { ref: htmlRef, style: htmlStyle, ...htmlProps }) {
|
30 | return {
|
31 | ref: useForkRef(options.unstable_popoverRef, htmlRef),
|
32 | style: { ...options.unstable_popoverStyles, ...htmlStyle },
|
33 | ...htmlProps,
|
34 | };
|
35 | },
|
36 | });
|
37 |
|
38 | export const Popover = createComponent({
|
39 | as: "div",
|
40 | useHook: usePopover,
|
41 | useCreateElement: (type, props, children) => {
|
42 | useWarning(
|
43 | !props["aria-label"] && !props["aria-labelledby"],
|
44 | "You should provide either `aria-label` or `aria-labelledby` props.",
|
45 | "See https://reakit.io/docs/popover"
|
46 | );
|
47 | return useCreateElement(type, props, children);
|
48 | },
|
49 | });
|