Skip to content

Commit 9b56564

Browse files
committed
fix(website) new useMenu hook to adjust null values to undefined
1 parent 556fff4 commit 9b56564

File tree

4 files changed

+40
-45
lines changed

4 files changed

+40
-45
lines changed

frontend/src/components/dashboard/aliases/AliasGenerationButton.tsx

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,22 @@ import {
22
FocusScope,
33
useOverlay,
44
useMenuTrigger,
5-
useMenu,
65
DismissButton,
76
mergeProps,
87
useMenuItem,
98
useFocus,
109
useButton,
11-
AriaOverlayProps,
1210
} from "react-aria";
1311
import { AriaMenuItemProps } from "@react-aria/menu";
1412
import {
1513
Item,
16-
MenuTriggerState,
1714
TreeProps,
1815
TreeState,
1916
useMenuTriggerState,
2017
useOverlayTriggerState,
2118
useTreeState,
2219
} from "react-stately";
23-
import {
24-
HTMLAttributes,
25-
Key,
26-
ReactNode,
27-
useEffect,
28-
useRef,
29-
useState,
30-
} from "react";
20+
import { Key, ReactNode, useEffect, useRef, useState } from "react";
3121
import styles from "./AliasGenerationButton.module.scss";
3222
import { ArrowDownIcon, PlusIcon } from "../../Icons";
3323
import { ProfileData } from "../../../hooks/api/profile";
@@ -41,6 +31,7 @@ import { CustomAddressGenerationModal } from "./CustomAddressGenerationModal";
4131
import { useGaEvent } from "../../../hooks/gaEvent";
4232
import { useL10n } from "../../../hooks/l10n";
4333
import { isFlagActive } from "../../../functions/waffle";
34+
import { MenuPopupProps, useMenu } from "../../../hooks/menu";
4435
import { AddressPickerModal } from "./AddressPickerModal";
4536

4637
export type Props = {
@@ -301,12 +292,7 @@ const AliasTypeMenuButton = (props: AliasTypeMenuButtonProps) => {
301292
);
302293
};
303294

304-
type AliasTypeMenuPopupProps = TreeProps<Record<string, never>> & {
305-
onAction: AriaMenuItemProps["onAction"];
306-
domProps: HTMLAttributes<HTMLElement>;
307-
onClose?: AriaOverlayProps["onClose"];
308-
autoFocus?: MenuTriggerState["focusStrategy"];
309-
};
295+
type AliasTypeMenuPopupProps = MenuPopupProps<Record<string, never>>;
310296
const AliasTypeMenuPopup = (props: AliasTypeMenuPopupProps) => {
311297
const popupState = useTreeState({ ...props, selectionMode: "none" });
312298

frontend/src/components/layout/navigation/AppPicker.tsx

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,19 @@ import {
33
useTreeState,
44
TreeProps,
55
TreeState,
6-
MenuTriggerState,
76
Item,
87
} from "react-stately";
98
import {
109
useMenuTrigger,
1110
useButton,
12-
useMenu,
1311
useOverlay,
1412
FocusScope,
1513
DismissButton,
1614
mergeProps,
1715
useMenuItem,
1816
useFocus,
19-
AriaOverlayProps,
2017
} from "react-aria";
21-
import {
22-
HTMLAttributes,
23-
Key,
24-
ReactNode,
25-
useRef,
26-
useState,
27-
useEffect,
28-
RefObject,
29-
} from "react";
18+
import { Key, ReactNode, useRef, useState, useEffect, RefObject } from "react";
3019
import { AriaMenuItemProps } from "@react-aria/menu";
3120
import styles from "./AppPicker.module.scss";
3221
import FirefoxLogo from "../images/fx.png";
@@ -41,6 +30,7 @@ import { BentoIcon } from "../../Icons";
4130
import Image from "../../Image";
4231
import { useGaEvent } from "../../../hooks/gaEvent";
4332
import { useL10n } from "../../../hooks/l10n";
33+
import { MenuPopupProps, useMenu } from "../../../hooks/menu";
4434

4535
const getProducts = (referringSiteUrl: string) => ({
4636
monitor: {
@@ -302,12 +292,7 @@ const AppPickerTrigger = ({
302292
);
303293
};
304294

305-
type AppPickerPopupProps = TreeProps<Record<string, never>> & {
306-
onAction: AriaMenuItemProps["onAction"];
307-
domProps: HTMLAttributes<HTMLElement>;
308-
onClose?: AriaOverlayProps["onClose"];
309-
autoFocus?: MenuTriggerState["focusStrategy"];
310-
};
295+
type AppPickerPopupProps = MenuPopupProps<Record<string, never>>;
311296
const AppPickerPopup = (props: AppPickerPopupProps) => {
312297
const l10n = useL10n();
313298
const popupState = useTreeState({ ...props, selectionMode: "none" });

frontend/src/components/layout/navigation/UserMenu.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,19 @@ import {
33
useTreeState,
44
TreeProps,
55
TreeState,
6-
MenuTriggerState,
76
Item,
87
} from "react-stately";
98
import {
109
useMenuTrigger,
1110
useButton,
12-
useMenu,
1311
useOverlay,
1412
FocusScope,
1513
DismissButton,
1614
mergeProps,
1715
useMenuItem,
1816
useFocus,
19-
AriaOverlayProps,
2017
} from "react-aria";
21-
import { HTMLAttributes, Key, ReactNode, useRef, useState } from "react";
18+
import { Key, ReactNode, useRef, useState } from "react";
2219
import { AriaMenuItemProps } from "@react-aria/menu";
2320
import Link from "next/link";
2421
import styles from "./UserMenu.module.scss";
@@ -37,6 +34,7 @@ import { useRuntimeData } from "../../../hooks/api/runtimeData";
3734
import { setCookie } from "../../../functions/cookies";
3835
import { useGaEvent } from "../../../hooks/gaEvent";
3936
import { useL10n } from "../../../hooks/l10n";
37+
import { MenuPopupProps, useMenu } from "../../../hooks/menu";
4038

4139
export type Props = {
4240
style: string;
@@ -266,12 +264,7 @@ const UserMenuTrigger = ({
266264
);
267265
};
268266

269-
type UserMenuPopupProps = TreeProps<Record<string, never>> & {
270-
onAction: AriaMenuItemProps["onAction"];
271-
domProps: HTMLAttributes<HTMLElement>;
272-
onClose?: AriaOverlayProps["onClose"];
273-
autoFocus?: MenuTriggerState["focusStrategy"];
274-
};
267+
type UserMenuPopupProps = MenuPopupProps<Record<string, never>>;
275268
const UserMenuPopup = (props: UserMenuPopupProps) => {
276269
const popupState = useTreeState({ ...props, selectionMode: "none" });
277270

frontend/src/hooks/menu.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { AriaOverlayProps, useMenu as useAriaMenu } from "react-aria";
2+
import { AriaMenuItemProps, AriaMenuOptions, MenuAria } from "@react-aria/menu";
3+
import { MenuTriggerState, TreeProps, TreeState } from "react-stately";
4+
import { RefObject } from "@react-types/shared";
5+
import { HTMLAttributes } from "react";
6+
7+
// MenuTriggerState focusStrategy from react-stately 3.34.0 is typed as
8+
// FocusStrategy | null
9+
// In react-aria 3.36.0, autoFocus is typed as
10+
// boolean | FocusStrategy | undefined
11+
// So, adjust a null value into undefined for use in react-aria
12+
// Presumably, react-aria will reconcile its typings with react-stately
13+
// at some point, at which point this commit can be reverted again.
14+
export type MenuPopupProps<T> = TreeProps<T> & {
15+
onAction: AriaMenuItemProps["onAction"];
16+
domProps: HTMLAttributes<HTMLElement>;
17+
onClose?: AriaOverlayProps["onClose"];
18+
autoFocus?: MenuTriggerState["focusStrategy"] | null;
19+
};
20+
21+
export function useMenu<T>(
22+
props: MenuPopupProps<T>,
23+
state: TreeState<T>,
24+
ref: RefObject<HTMLElement | null>,
25+
): MenuAria {
26+
const adjustedProps: AriaMenuOptions<T> = {
27+
...props,
28+
autoFocus: props.autoFocus ?? undefined,
29+
};
30+
return useAriaMenu(adjustedProps, state, ref);
31+
}

0 commit comments

Comments
 (0)