Skip to content

Commit de6fa2a

Browse files
devongovettsbiswaribiswarisomya
authored
feat(s2): Add triggerRef prop to S2 Popover (#8257)
* Added triggerRef to s2 popover * Refactor Popover component to use isOpen and onOpenChange props, removing deprecated button handling logic. Update stories to demonstrate new trigger functionality. * Update PopoverDialogProps to include triggerRef, isOpen, and onOpenChange properties for improved prop management. * Refactor import statements in Popover component and stories for consistency and clarity. * Make example a bit prettier --------- Co-authored-by: sbiswari <sbiswari@adobe.com> Co-authored-by: biswarisomya <102928682+biswarisomya@users.noreply.github.com>
1 parent b0c35c0 commit de6fa2a

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

packages/@react-spectrum/s2/src/Popover.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,9 @@ export const PopoverBase = forwardRef(function PopoverBase(props: PopoverProps,
220220
);
221221
});
222222

223-
export interface PopoverDialogProps extends Pick<PopoverProps, 'size' | 'hideArrow'| 'placement' | 'shouldFlip' | 'containerPadding' | 'offset' | 'crossOffset'>, Omit<DialogProps, 'className' | 'style'>, StyleProps {}
223+
export interface PopoverDialogProps extends Pick<PopoverProps, 'size' | 'hideArrow'| 'placement' | 'shouldFlip' | 'containerPadding' | 'offset' | 'crossOffset' | 'triggerRef' | 'isOpen' | 'onOpenChange'>, Omit<DialogProps, 'className' | 'style'>, StyleProps {
224+
}
225+
224226

225227
const dialogStyle = style({
226228
padding: 8,
@@ -238,11 +240,13 @@ const dialogStyle = style({
238240
*/
239241
export const Popover = forwardRef(function Popover(props: PopoverDialogProps, ref: DOMRef) {
240242
let domRef = useDOMRef(ref);
243+
const {triggerRef, isOpen, onOpenChange, ...otherProps} = props;
244+
241245

242246
return (
243-
<PopoverBase size={props.size} hideArrow={props.hideArrow} placement={props.placement} shouldFlip={props.shouldFlip} containerPadding={props.containerPadding} offset={props.offset} crossOffset={props.crossOffset}>
247+
<PopoverBase isOpen={isOpen} onOpenChange={onOpenChange} triggerRef={triggerRef} size={props.size} hideArrow={props.hideArrow} placement={props.placement} shouldFlip={props.shouldFlip} containerPadding={props.containerPadding} offset={props.offset} crossOffset={props.crossOffset}>
244248
<Dialog
245-
{...props}
249+
{...otherProps}
246250
ref={domRef}
247251
style={props.UNSAFE_style}
248252
className={(props.UNSAFE_className || '') + dialogStyle(null, props.styles)}>

packages/@react-spectrum/s2/stories/Popover.stories.tsx

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {Autocomplete as RACAutocomplete, useFilter} from 'react-aria-components'
2222
import Settings from '../s2wf-icons/S2_Icon_Settings_20_N.svg';
2323
import {style} from '../style/spectrum-theme' with {type: 'macro'};
2424
import User from '../s2wf-icons/S2_Icon_User_20_N.svg';
25+
import {useRef, useState} from 'react';
2526
import Users from '../s2wf-icons/S2_Icon_UserGroup_20_N.svg';
2627

2728
const meta: Meta<typeof Popover> = {
@@ -167,7 +168,6 @@ AccountMenu.argTypes = {
167168
placement: {table: {disable: true}}
168169
};
169170

170-
171171
function Autocomplete(props) {
172172
let {contains} = useFilter({sensitivity: 'base'});
173173
return (
@@ -194,3 +194,25 @@ export const AutocompletePopover = (args: any) => (
194194
</DialogTrigger>
195195
</>
196196
);
197+
198+
export const CustomTrigger = () => {
199+
const [open, setOpen] = useState(false);
200+
const triggerRef = useRef<any>(null);
201+
202+
const handleOpenChange = (isOpen: boolean) => {
203+
if (!isOpen) {
204+
setOpen(false);
205+
}
206+
};
207+
208+
return (
209+
<div style={{display: 'flex', gap: 12, alignItems: 'center'}}>
210+
<Button onPress={() => setOpen(!open)}>Open Popover</Button>
211+
<div className={style({font: 'ui'})} ref={triggerRef}>Popover appears here</div>
212+
<Popover isOpen={open} onOpenChange={handleOpenChange} triggerRef={triggerRef}>
213+
<span className={style({font: 'ui'})}>Popover with trigger on button</span>
214+
</Popover>
215+
</div>
216+
);
217+
};
218+

0 commit comments

Comments
 (0)