Skip to content

Commit 6711804

Browse files
committed
feat(DialogTrigger): pass state to trigger
1 parent 94994d1 commit 6711804

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

src/components/overlays/Dialog/DialogTrigger.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Fragment, ReactElement, RefObject, useEffect, useRef } from 'react';
2-
import { useOverlayTriggerState } from 'react-stately';
2+
import { OverlayTriggerState, useOverlayTriggerState } from 'react-stately';
33
import { PressResponder } from '@react-aria/interactions';
44
import { useMediaQuery } from '@react-spectrum/utils';
55
import {
@@ -23,7 +23,10 @@ export interface CubeDialogTriggerProps
2323
PositionProps,
2424
WithCloseBehavior {
2525
/** The Dialog and its trigger element. See the DialogTrigger [Content section](#content) for more information on what to provide as children. */
26-
children: [ReactElement, CubeDialogClose | ReactElement];
26+
children: [
27+
ReactElement | ((state: OverlayTriggerState) => ReactElement),
28+
CubeDialogClose | ReactElement,
29+
];
2730
/**
2831
* The type of Dialog that should be rendered. See the DialogTrigger [types section](#dialog-types) for an explanation on each.
2932
* @default 'modal'
@@ -102,6 +105,10 @@ function DialogTrigger(props: CubeDialogTriggerProps) {
102105

103106
let state = useOverlayTriggerState(props);
104107

108+
if (typeof trigger === 'function') {
109+
trigger = trigger(state);
110+
}
111+
105112
let wasOpen = useRef(false);
106113
let isExiting = useRef(false);
107114
let onExiting = () => (isExiting.current = true);

src/components/overlays/Dialog/stories/Dialog.stories.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
Paragraph,
1818
Title,
1919
Space,
20+
DirectionIcon,
2021
} from '../../../../index';
2122
import { timeout } from '../../../../utils/promise';
2223
import { baseProps } from '../../../../stories/lists/baseProps';
@@ -64,6 +65,25 @@ const Template: StoryFn<
6465
);
6566
};
6667

68+
const WithTriggerStateTemplate: StoryFn<
69+
CubeDialogTriggerProps & { size: CubeDialogProps['size'] }
70+
> = ({ size, styles, ...props }) => {
71+
return (
72+
<DialogTrigger {...props} type="popover">
73+
{({ isOpen }) => (
74+
<Button rightIcon={<DirectionIcon to={isOpen ? 'top' : 'bottom'} />}>
75+
Open modal
76+
</Button>
77+
)}
78+
<Dialog size={size} styles={styles}>
79+
<Content>
80+
<Paragraph>Test content</Paragraph>
81+
</Content>
82+
</Dialog>
83+
</DialogTrigger>
84+
);
85+
};
86+
6787
export const Default = Template.bind({});
6888
Default.play = async ({ canvasElement, viewMode }) => {
6989
if (viewMode === 'docs') return;
@@ -312,3 +332,7 @@ DoNotCloseOnClickAtParticularElement.play = async (context) => {
312332
await expect(await findByRole('dialog')).toBeInTheDocument();
313333
await expect(button).toHaveTextContent('It works!');
314334
};
335+
336+
export const WithTriggerState = WithTriggerStateTemplate.bind({});
337+
WithTriggerState.args = {};
338+
WithTriggerState.play = Default.play;

src/components/pickers/Menu/MenuTrigger.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ function MenuTrigger(props: CubeMenuTriggerProps, ref: DOMRef<HTMLElement>) {
4848
isDisabled,
4949
} = props;
5050

51+
if (!Array.isArray(children) || children.length > 2) {
52+
throw new Error('MenuTrigger must have exactly 2 children');
53+
}
54+
5155
let [menuTrigger, menu] = children;
5256
const state: MenuTriggerState = useMenuTriggerState(props);
5357

src/icons/DirectionIcon.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export const DirectionIcon = memo(function DirectionIcon(
7777

7878
return (
7979
<StyledUpIcon
80+
data-direction={direction}
8081
{...iconProps}
8182
style={{
8283
rotate: `${rotate}deg`,

0 commit comments

Comments
 (0)