Skip to content

chore(site): refactor popover to make it easier to extend #13611

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 21, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Apply review suggestions and fix lint
  • Loading branch information
BrunoQuaresma committed Jun 21, 2024
commit 26951f598aa0031e12bb1c54db0c8471c614a8a0
2 changes: 1 addition & 1 deletion site/src/components/HelpTooltip/HelpTooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ export const HelpTooltipAction: FC<HelpTooltipActionProps> = ({
onClick={(event) => {
event.stopPropagation();
onClick();
popover.setIsOpen(false);
popover.setOpen(false);
}}
>
<Icon css={styles.actionIcon} />
Expand Down
12 changes: 7 additions & 5 deletions site/src/components/Popover/Popover.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ type BasePopoverProps = {
mode?: TriggerMode;
};

// By separating controlled and uncontrolled props, we achieve more accurate
// type inference.
type UncontrolledPopoverProps = BasePopoverProps & {
open?: undefined;
onOpenChange?: undefined;
Expand All @@ -57,16 +59,15 @@ export type PopoverProps = UncontrolledPopoverProps | ControlledPopoverProps;

export const Popover: FC<PopoverProps> = (props) => {
const hookId = useId();
const [open, setOpen] = useState(false);
const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
const triggerRef: TriggerRef = useRef(null);
const isControlled = props.open !== undefined;

const value: PopoverContextValue = {
triggerRef,
id: `${hookId}-popover`,
mode: props.mode ?? "click",
open: isControlled ? props.open : open,
setOpen: isControlled ? props.onOpenChange : setOpen,
open: props.open ?? uncontrolledOpen,
setOpen: props.onOpenChange ?? setUncontrolledOpen,
};

return (
Expand Down Expand Up @@ -113,7 +114,8 @@ export const PopoverTrigger = (
...elementProps,
...(popover.mode === "click" ? clickProps : hoverProps),
"aria-haspopup": true,
"aria-owns": popover.open ? popover.id : undefined,
"aria-owns": popover.id,
"aria-expanded": popover.open,
ref: popover.triggerRef,
});
};
Expand Down
2 changes: 1 addition & 1 deletion site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ const DeploymentDropdownContent: FC<DeploymentDropdownProps> = ({
}) => {
const popover = usePopover();

const onPopoverClose = () => popover.setIsOpen(false);
const onPopoverClose = () => popover.setOpen(false);

return (
<nav>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export const WorkspaceOutdatedTooltipContent: FC<TooltipProps> = ({
const popover = usePopover();
const { data: activeVersion } = useQuery({
...templateVersion(latestVersionId),
enabled: popover.isOpen,
enabled: popover.open,
});
const theme = useTheme();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ const BuildParametersPopoverContent: FC<BuildParametersPopoverContentProps> = ({
<Form
onSubmit={(buildParameters) => {
onSubmit(buildParameters);
popover.setIsOpen(false);
popover.setOpen(false);
}}
ephemeralParameters={ephemeralParameters}
buildParameters={buildParameters.map(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ const NotificationPill: FC<NotificationsProps> = ({
icon={icon}
css={(theme) => ({
"& svg": { color: theme.roles[severity].outline },
borderColor: popover.isOpen ? theme.roles[severity].outline : undefined,
borderColor: popover.open ? theme.roles[severity].outline : undefined,
})}
>
{items.length}
Expand Down
Loading