From 81e764076f2ae8335de83c75b2d5e51eb385bf46 Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Tue, 19 Dec 2023 08:18:20 +1100 Subject: [PATCH 1/5] Separate types for submenus --- packages/@react-spectrum/menu/src/context.ts | 5 +++-- packages/@react-stately/menu/src/useMenuTriggerState.ts | 6 ++++-- packages/@react-stately/menu/src/useSubmenuTriggerState.ts | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/@react-spectrum/menu/src/context.ts b/packages/@react-spectrum/menu/src/context.ts index 623d1c630f0..f574b3e3e78 100644 --- a/packages/@react-spectrum/menu/src/context.ts +++ b/packages/@react-spectrum/menu/src/context.ts @@ -14,6 +14,7 @@ import {DOMProps, FocusStrategy, HoverEvents, KeyboardEvents, PressEvents} from import {MenuTriggerState} from '@react-stately/menu'; import React, {HTMLAttributes, MutableRefObject, RefObject, useContext} from 'react'; import {TreeState} from '@react-stately/tree'; +import {MenuTriggerWithSubmenuState} from '@react-stately/menu/src/useMenuTriggerState'; export interface MenuContextValue extends Omit, 'autoFocus' | 'onKeyDown'>, Pick { onClose?: () => void, @@ -21,7 +22,7 @@ export interface MenuContextValue extends Omit, 'aut shouldFocusWrap?: boolean, autoFocus?: boolean | FocusStrategy, ref?: MutableRefObject, - state?: MenuTriggerState, + state?: MenuTriggerWithSubmenuState, onBackButtonPress?: () => void, submenuLevel?: number } @@ -53,7 +54,7 @@ export interface MenuStateContextValue { trayContainerRef?: RefObject, menu?: RefObject, submenu?: RefObject, - rootMenuTriggerState?: MenuTriggerState + rootMenuTriggerState?: MenuTriggerWithSubmenuState } export const MenuStateContext = React.createContext>(undefined); diff --git a/packages/@react-stately/menu/src/useMenuTriggerState.ts b/packages/@react-stately/menu/src/useMenuTriggerState.ts index ab22f824375..e5b31cf443c 100644 --- a/packages/@react-stately/menu/src/useMenuTriggerState.ts +++ b/packages/@react-stately/menu/src/useMenuTriggerState.ts @@ -26,8 +26,10 @@ export interface MenuTriggerState extends OverlayTriggerState { toggle(focusStrategy?: FocusStrategy | null): void, /** Closes the menu and all submenus in the menu tree. */ - close: () => void, + close: () => void +} +export interface MenuTriggerWithSubmenuState extends MenuTriggerState { /** Opens a specific submenu tied to a specific menu item at a specific level. */ UNSTABLE_openSubmenu: (triggerKey: Key, level: number) => void, @@ -45,7 +47,7 @@ export interface MenuTriggerState extends OverlayTriggerState { * and controls which item will receive focus when it opens. Also tracks the open submenus within * the menu tree via their trigger keys. */ -export function useMenuTriggerState(props: MenuTriggerProps): MenuTriggerState { +export function useMenuTriggerState(props: MenuTriggerProps): MenuTriggerWithSubmenuState { let overlayTriggerState = useOverlayTriggerState(props); let [focusStrategy, setFocusStrategy] = useState(null); let [expandedKeysStack, setExpandedKeysStack] = useState([]); diff --git a/packages/@react-stately/menu/src/useSubmenuTriggerState.ts b/packages/@react-stately/menu/src/useSubmenuTriggerState.ts index f436344129f..8d9b4ef3536 100644 --- a/packages/@react-stately/menu/src/useSubmenuTriggerState.ts +++ b/packages/@react-stately/menu/src/useSubmenuTriggerState.ts @@ -11,7 +11,7 @@ */ import {FocusStrategy, Key} from '@react-types/shared'; -import type {MenuTriggerState} from './useMenuTriggerState'; +import {MenuTriggerWithSubmenuState} from './useMenuTriggerState'; import type {OverlayTriggerState} from '@react-stately/overlays'; import {useCallback, useMemo, useState} from 'react'; @@ -43,7 +43,7 @@ export interface SubmenuTriggerState extends OverlayTriggerState { * Manages state for a submenu trigger. Tracks whether the submenu is currently open, the level of the submenu, and * controls which item will receive focus when it opens. */ -export function UNSTABLE_useSubmenuTriggerState(props: SubmenuTriggerProps, state: MenuTriggerState): SubmenuTriggerState { +export function UNSTABLE_useSubmenuTriggerState(props: SubmenuTriggerProps, state: MenuTriggerWithSubmenuState): SubmenuTriggerState { let {triggerKey} = props; let {UNSTABLE_expandedKeysStack, UNSTABLE_openSubmenu, UNSTABLE_closeSubmenu, close: closeAll} = state; let [submenuLevel] = useState(UNSTABLE_expandedKeysStack?.length); From 0d4e79b8410b8cf95ed86f9a09daf4e78288475d Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Tue, 19 Dec 2023 08:20:36 +1100 Subject: [PATCH 2/5] fix lint --- packages/@react-spectrum/menu/src/context.ts | 3 +-- packages/@react-stately/menu/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/@react-spectrum/menu/src/context.ts b/packages/@react-spectrum/menu/src/context.ts index f574b3e3e78..10b2f86a5c6 100644 --- a/packages/@react-spectrum/menu/src/context.ts +++ b/packages/@react-spectrum/menu/src/context.ts @@ -11,10 +11,9 @@ */ import {DOMProps, FocusStrategy, HoverEvents, KeyboardEvents, PressEvents} from '@react-types/shared'; -import {MenuTriggerState} from '@react-stately/menu'; +import {MenuTriggerWithSubmenuState} from '@react-stately/menu'; import React, {HTMLAttributes, MutableRefObject, RefObject, useContext} from 'react'; import {TreeState} from '@react-stately/tree'; -import {MenuTriggerWithSubmenuState} from '@react-stately/menu/src/useMenuTriggerState'; export interface MenuContextValue extends Omit, 'autoFocus' | 'onKeyDown'>, Pick { onClose?: () => void, diff --git a/packages/@react-stately/menu/src/index.ts b/packages/@react-stately/menu/src/index.ts index 1417287e956..6bdc7225413 100644 --- a/packages/@react-stately/menu/src/index.ts +++ b/packages/@react-stately/menu/src/index.ts @@ -14,5 +14,5 @@ export {useMenuTriggerState} from './useMenuTriggerState'; export {UNSTABLE_useSubmenuTriggerState} from './useSubmenuTriggerState'; export type {MenuTriggerProps} from '@react-types/menu'; -export type {MenuTriggerState} from './useMenuTriggerState'; +export type {MenuTriggerState, MenuTriggerWithSubmenuState} from './useMenuTriggerState'; export type {SubmenuTriggerProps, SubmenuTriggerState} from './useSubmenuTriggerState'; From 769b074f2d8fc9da3a600ef479adf82ea6922b36 Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Tue, 19 Dec 2023 09:03:43 +1100 Subject: [PATCH 3/5] shuffle logic around to solve types --- packages/@react-spectrum/menu/src/context.ts | 6 ++--- packages/@react-stately/combobox/package.json | 2 +- .../combobox/src/useComboBoxState.ts | 14 +++++++---- packages/@react-stately/menu/src/index.ts | 2 +- .../menu/src/useMenuTriggerState.ts | 6 ++--- .../menu/src/useSubmenuTriggerState.ts | 4 ++-- packages/@react-stately/select/package.json | 2 +- .../select/src/useSelectState.ts | 24 ++++++++++++++----- 8 files changed, 38 insertions(+), 22 deletions(-) diff --git a/packages/@react-spectrum/menu/src/context.ts b/packages/@react-spectrum/menu/src/context.ts index 10b2f86a5c6..623d1c630f0 100644 --- a/packages/@react-spectrum/menu/src/context.ts +++ b/packages/@react-spectrum/menu/src/context.ts @@ -11,7 +11,7 @@ */ import {DOMProps, FocusStrategy, HoverEvents, KeyboardEvents, PressEvents} from '@react-types/shared'; -import {MenuTriggerWithSubmenuState} from '@react-stately/menu'; +import {MenuTriggerState} from '@react-stately/menu'; import React, {HTMLAttributes, MutableRefObject, RefObject, useContext} from 'react'; import {TreeState} from '@react-stately/tree'; @@ -21,7 +21,7 @@ export interface MenuContextValue extends Omit, 'aut shouldFocusWrap?: boolean, autoFocus?: boolean | FocusStrategy, ref?: MutableRefObject, - state?: MenuTriggerWithSubmenuState, + state?: MenuTriggerState, onBackButtonPress?: () => void, submenuLevel?: number } @@ -53,7 +53,7 @@ export interface MenuStateContextValue { trayContainerRef?: RefObject, menu?: RefObject, submenu?: RefObject, - rootMenuTriggerState?: MenuTriggerWithSubmenuState + rootMenuTriggerState?: MenuTriggerState } export const MenuStateContext = React.createContext>(undefined); diff --git a/packages/@react-stately/combobox/package.json b/packages/@react-stately/combobox/package.json index dc1636c4c86..f27c9b6ce5d 100644 --- a/packages/@react-stately/combobox/package.json +++ b/packages/@react-stately/combobox/package.json @@ -25,7 +25,7 @@ "@react-stately/collections": "^3.10.3", "@react-stately/form": "^3.0.0", "@react-stately/list": "^3.10.1", - "@react-stately/menu": "^3.5.7", + "@react-stately/overlays": "^3.6.4", "@react-stately/select": "^3.6.0", "@react-stately/utils": "^3.9.0", "@react-types/combobox": "^3.9.0", diff --git a/packages/@react-stately/combobox/src/useComboBoxState.ts b/packages/@react-stately/combobox/src/useComboBoxState.ts index 82c4b8d2380..9eee93cc4f7 100644 --- a/packages/@react-stately/combobox/src/useComboBoxState.ts +++ b/packages/@react-stately/combobox/src/useComboBoxState.ts @@ -18,7 +18,7 @@ import {ListCollection, useSingleSelectListState} from '@react-stately/list'; import {SelectState} from '@react-stately/select'; import {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import {useControlledState} from '@react-stately/utils'; -import {useMenuTriggerState} from '@react-stately/menu'; +import {useOverlayTriggerState} from '@react-stately/overlays'; export interface ComboBoxState extends SelectState, FormValidationState{ /** The current value of the combo box input. */ @@ -27,6 +27,8 @@ export interface ComboBoxState extends SelectState, FormValidationState{ setInputValue(value: string): void, /** Selects the currently focused item and updates the input value. */ commit(): void, + /** Controls which item will be auto focused when the menu opens. */ + readonly focusStrategy: FocusStrategy, /** Opens the menu. */ open(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void, /** Toggles the menu. */ @@ -62,6 +64,7 @@ export function useComboBoxState(props: ComboBoxStateOptions(null); let onSelectionChange = (key) => { if (props.onSelectionChange) { @@ -111,7 +114,7 @@ export function useComboBoxState(props: ComboBoxStateOptions { let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus')); // Prevent open operations from triggering if there is nothing to display @@ -124,7 +127,8 @@ export function useComboBoxState(props: ComboBoxStateOptions(props: ComboBoxStateOptions { @@ -347,6 +352,7 @@ export function useComboBoxState(props: ComboBoxStateOptions void -} + close: () => void, -export interface MenuTriggerWithSubmenuState extends MenuTriggerState { /** Opens a specific submenu tied to a specific menu item at a specific level. */ UNSTABLE_openSubmenu: (triggerKey: Key, level: number) => void, @@ -47,7 +45,7 @@ export interface MenuTriggerWithSubmenuState extends MenuTriggerState { * and controls which item will receive focus when it opens. Also tracks the open submenus within * the menu tree via their trigger keys. */ -export function useMenuTriggerState(props: MenuTriggerProps): MenuTriggerWithSubmenuState { +export function useMenuTriggerState(props: MenuTriggerProps): MenuTriggerState { let overlayTriggerState = useOverlayTriggerState(props); let [focusStrategy, setFocusStrategy] = useState(null); let [expandedKeysStack, setExpandedKeysStack] = useState([]); diff --git a/packages/@react-stately/menu/src/useSubmenuTriggerState.ts b/packages/@react-stately/menu/src/useSubmenuTriggerState.ts index 8d9b4ef3536..9eff0a83aef 100644 --- a/packages/@react-stately/menu/src/useSubmenuTriggerState.ts +++ b/packages/@react-stately/menu/src/useSubmenuTriggerState.ts @@ -11,7 +11,7 @@ */ import {FocusStrategy, Key} from '@react-types/shared'; -import {MenuTriggerWithSubmenuState} from './useMenuTriggerState'; +import {MenuTriggerState} from './useMenuTriggerState'; import type {OverlayTriggerState} from '@react-stately/overlays'; import {useCallback, useMemo, useState} from 'react'; @@ -43,7 +43,7 @@ export interface SubmenuTriggerState extends OverlayTriggerState { * Manages state for a submenu trigger. Tracks whether the submenu is currently open, the level of the submenu, and * controls which item will receive focus when it opens. */ -export function UNSTABLE_useSubmenuTriggerState(props: SubmenuTriggerProps, state: MenuTriggerWithSubmenuState): SubmenuTriggerState { +export function UNSTABLE_useSubmenuTriggerState(props: SubmenuTriggerProps, state: MenuTriggerState): SubmenuTriggerState { let {triggerKey} = props; let {UNSTABLE_expandedKeysStack, UNSTABLE_openSubmenu, UNSTABLE_closeSubmenu, close: closeAll} = state; let [submenuLevel] = useState(UNSTABLE_expandedKeysStack?.length); diff --git a/packages/@react-stately/select/package.json b/packages/@react-stately/select/package.json index 8b20b7f5390..4f1b92e4904 100644 --- a/packages/@react-stately/select/package.json +++ b/packages/@react-stately/select/package.json @@ -24,7 +24,7 @@ "dependencies": { "@react-stately/form": "^3.0.0", "@react-stately/list": "^3.10.1", - "@react-stately/menu": "^3.5.7", + "@react-stately/overlays": "^3.6.4", "@react-types/select": "^3.9.0", "@react-types/shared": "^3.22.0", "@swc/helpers": "^0.5.0" diff --git a/packages/@react-stately/select/src/useSelectState.ts b/packages/@react-stately/select/src/useSelectState.ts index 5de2f9033f8..d685397358d 100644 --- a/packages/@react-stately/select/src/useSelectState.ts +++ b/packages/@react-stately/select/src/useSelectState.ts @@ -10,21 +10,30 @@ * governing permissions and limitations under the License. */ -import {CollectionStateBase} from '@react-types/shared'; +import {CollectionStateBase, FocusStrategy} from '@react-types/shared'; import {FormValidationState, useFormValidationState} from '@react-stately/form'; -import {MenuTriggerState, useMenuTriggerState} from '@react-stately/menu'; +import {OverlayTriggerState, useOverlayTriggerState} from '@react-stately/overlays'; import {SelectProps} from '@react-types/select'; import {SingleSelectListState, useSingleSelectListState} from '@react-stately/list'; import {useState} from 'react'; export interface SelectStateOptions extends Omit, 'children'>, CollectionStateBase {} -export interface SelectState extends SingleSelectListState, MenuTriggerState, FormValidationState { +export interface SelectState extends SingleSelectListState, OverlayTriggerState, FormValidationState { /** Whether the select is currently focused. */ readonly isFocused: boolean, /** Sets whether the select is focused. */ - setFocused(isFocused: boolean): void + setFocused(isFocused: boolean): void, + + /** Controls which item will be auto focused when the menu opens. */ + readonly focusStrategy: FocusStrategy, + + /** Opens the menu. */ + open(): void, + + /** Toggles the menu. */ + toggle(focusStrategy?: FocusStrategy | null): void } /** @@ -33,7 +42,8 @@ export interface SelectState extends SingleSelectListState, MenuTriggerSta * multiple selection state. */ export function useSelectState(props: SelectStateOptions): SelectState { - let triggerState = useMenuTriggerState(props); + let triggerState = useOverlayTriggerState(props); + let [focusStrategy, setFocusStrategy] = useState(null); let listState = useSingleSelectListState({ ...props, onSelectionChange: (key) => { @@ -57,6 +67,7 @@ export function useSelectState(props: SelectStateOptions): ...validationState, ...listState, ...triggerState, + focusStrategy, open() { // Don't open if the collection is empty. if (listState.collection.size !== 0) { @@ -65,7 +76,8 @@ export function useSelectState(props: SelectStateOptions): }, toggle(focusStrategy) { if (listState.collection.size !== 0) { - triggerState.toggle(focusStrategy); + setFocusStrategy(focusStrategy); + triggerState.toggle(); } }, isFocused, From a7dbb93fb3f1acea820f3eb0c1b39d140b58a294 Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Tue, 19 Dec 2023 09:58:22 +1100 Subject: [PATCH 4/5] normalize focusstrategy and split types for menu stately --- packages/@react-aria/menu/src/useMenuTrigger.ts | 5 +++-- .../combobox/src/useComboBoxState.ts | 6 +++--- packages/@react-stately/menu/src/index.ts | 2 +- .../@react-stately/menu/src/useMenuTriggerState.ts | 14 ++++++++------ .../@react-stately/select/src/useSelectState.ts | 7 ++++--- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/@react-aria/menu/src/useMenuTrigger.ts b/packages/@react-aria/menu/src/useMenuTrigger.ts index 89f501252ac..ac1a4a6a00a 100644 --- a/packages/@react-aria/menu/src/useMenuTrigger.ts +++ b/packages/@react-aria/menu/src/useMenuTrigger.ts @@ -14,9 +14,9 @@ import {AriaButtonProps} from '@react-types/button'; import {AriaMenuOptions} from './useMenu'; // @ts-ignore import intlMessages from '../intl/*.json'; -import {MenuTriggerState} from '@react-stately/menu'; import {MenuTriggerType} from '@react-types/menu'; import {RefObject} from 'react'; +import {RootMenuTriggerState} from '@react-stately/menu'; import {useId} from '@react-aria/utils'; import {useLocalizedStringFormatter} from '@react-aria/i18n'; import {useLongPress} from '@react-aria/interactions'; @@ -43,8 +43,9 @@ export interface MenuTriggerAria { * Provides the behavior and accessibility implementation for a menu trigger. * @param props - Props for the menu trigger. * @param state - State for the menu trigger. + * @param ref - Ref to the HTML element trigger for the menu. */ -export function useMenuTrigger(props: AriaMenuTriggerProps, state: MenuTriggerState, ref: RefObject): MenuTriggerAria { +export function useMenuTrigger(props: AriaMenuTriggerProps, state: RootMenuTriggerState, ref: RefObject): MenuTriggerAria { let { type = 'menu' as AriaMenuTriggerProps['type'], isDisabled, diff --git a/packages/@react-stately/combobox/src/useComboBoxState.ts b/packages/@react-stately/combobox/src/useComboBoxState.ts index 9eee93cc4f7..19c2855f89c 100644 --- a/packages/@react-stately/combobox/src/useComboBoxState.ts +++ b/packages/@react-stately/combobox/src/useComboBoxState.ts @@ -115,7 +115,7 @@ export function useComboBoxState(props: ComboBoxStateOptions { + let open = (focusStrategy: FocusStrategy = null, trigger?: MenuTriggerAction) => { let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus')); // Prevent open operations from triggering if there is nothing to display // Also prevent open operations from triggering if items are uncontrolled but defaultItems is empty, even if displayAllItems is true. @@ -132,7 +132,7 @@ export function useComboBoxState(props: ComboBoxStateOptions { + let toggle = (focusStrategy: FocusStrategy = null, trigger?: MenuTriggerAction) => { let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus')); // If the menu is closed and there is nothing to display, early return so toggle isn't called to prevent extraneous onOpenChange if (!(allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) && !triggerState.isOpen) { @@ -158,7 +158,7 @@ export function useComboBoxState(props: ComboBoxStateOptions { + let toggleMenu = useCallback((focusStrategy: FocusStrategy = null) => { if (triggerState.isOpen) { updateLastCollection(); } diff --git a/packages/@react-stately/menu/src/index.ts b/packages/@react-stately/menu/src/index.ts index 1417287e956..e90da972bf6 100644 --- a/packages/@react-stately/menu/src/index.ts +++ b/packages/@react-stately/menu/src/index.ts @@ -14,5 +14,5 @@ export {useMenuTriggerState} from './useMenuTriggerState'; export {UNSTABLE_useSubmenuTriggerState} from './useSubmenuTriggerState'; export type {MenuTriggerProps} from '@react-types/menu'; -export type {MenuTriggerState} from './useMenuTriggerState'; +export type {MenuTriggerState, RootMenuTriggerState} from './useMenuTriggerState'; export type {SubmenuTriggerProps, SubmenuTriggerState} from './useSubmenuTriggerState'; diff --git a/packages/@react-stately/menu/src/useMenuTriggerState.ts b/packages/@react-stately/menu/src/useMenuTriggerState.ts index ab22f824375..7a57194d4ca 100644 --- a/packages/@react-stately/menu/src/useMenuTriggerState.ts +++ b/packages/@react-stately/menu/src/useMenuTriggerState.ts @@ -15,7 +15,7 @@ import {MenuTriggerProps} from '@react-types/menu'; import {OverlayTriggerState, useOverlayTriggerState} from '@react-stately/overlays'; import {useState} from 'react'; -export interface MenuTriggerState extends OverlayTriggerState { +export interface RootMenuTriggerState extends OverlayTriggerState { /** Controls which item will be auto focused when the menu opens. */ readonly focusStrategy: FocusStrategy, @@ -23,11 +23,10 @@ export interface MenuTriggerState extends OverlayTriggerState { open(focusStrategy?: FocusStrategy | null): void, /** Toggles the menu. */ - toggle(focusStrategy?: FocusStrategy | null): void, - - /** Closes the menu and all submenus in the menu tree. */ - close: () => void, + toggle(focusStrategy?: FocusStrategy | null): void +} +export interface MenuTriggerState extends RootMenuTriggerState { /** Opens a specific submenu tied to a specific menu item at a specific level. */ UNSTABLE_openSubmenu: (triggerKey: Key, level: number) => void, @@ -37,7 +36,10 @@ export interface MenuTriggerState extends OverlayTriggerState { /** An array of open submenu trigger keys within the menu tree. * The index of key within array matches the submenu level in the tree. */ - UNSTABLE_expandedKeysStack: Key[] + UNSTABLE_expandedKeysStack: Key[], + + /** Closes the menu and all submenus in the menu tree. */ + close: () => void } /** diff --git a/packages/@react-stately/select/src/useSelectState.ts b/packages/@react-stately/select/src/useSelectState.ts index d685397358d..0c19849b33b 100644 --- a/packages/@react-stately/select/src/useSelectState.ts +++ b/packages/@react-stately/select/src/useSelectState.ts @@ -30,7 +30,7 @@ export interface SelectState extends SingleSelectListState, OverlayTrigger readonly focusStrategy: FocusStrategy, /** Opens the menu. */ - open(): void, + open(focusStrategy?: FocusStrategy | null): void, /** Toggles the menu. */ toggle(focusStrategy?: FocusStrategy | null): void @@ -68,13 +68,14 @@ export function useSelectState(props: SelectStateOptions): ...listState, ...triggerState, focusStrategy, - open() { + open(focusStrategy: FocusStrategy = null) { // Don't open if the collection is empty. if (listState.collection.size !== 0) { + setFocusStrategy(focusStrategy); triggerState.open(); } }, - toggle(focusStrategy) { + toggle(focusStrategy: FocusStrategy = null) { if (listState.collection.size !== 0) { setFocusStrategy(focusStrategy); triggerState.toggle(); From e401f149dabe1bb85b5d43b82a1e9c39375a0824 Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Tue, 19 Dec 2023 10:17:10 +1100 Subject: [PATCH 5/5] swap types --- packages/@react-aria/menu/src/useMenuTrigger.ts | 4 ++-- packages/@react-spectrum/menu/src/context.ts | 6 +++--- packages/@react-stately/menu/src/useMenuTriggerState.ts | 6 +++--- packages/@react-stately/menu/src/useSubmenuTriggerState.ts | 4 ++-- packages/react-stately/src/index.ts | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/@react-aria/menu/src/useMenuTrigger.ts b/packages/@react-aria/menu/src/useMenuTrigger.ts index ac1a4a6a00a..e28b05a5aae 100644 --- a/packages/@react-aria/menu/src/useMenuTrigger.ts +++ b/packages/@react-aria/menu/src/useMenuTrigger.ts @@ -14,9 +14,9 @@ import {AriaButtonProps} from '@react-types/button'; import {AriaMenuOptions} from './useMenu'; // @ts-ignore import intlMessages from '../intl/*.json'; +import {MenuTriggerState} from '@react-stately/menu'; import {MenuTriggerType} from '@react-types/menu'; import {RefObject} from 'react'; -import {RootMenuTriggerState} from '@react-stately/menu'; import {useId} from '@react-aria/utils'; import {useLocalizedStringFormatter} from '@react-aria/i18n'; import {useLongPress} from '@react-aria/interactions'; @@ -45,7 +45,7 @@ export interface MenuTriggerAria { * @param state - State for the menu trigger. * @param ref - Ref to the HTML element trigger for the menu. */ -export function useMenuTrigger(props: AriaMenuTriggerProps, state: RootMenuTriggerState, ref: RefObject): MenuTriggerAria { +export function useMenuTrigger(props: AriaMenuTriggerProps, state: MenuTriggerState, ref: RefObject): MenuTriggerAria { let { type = 'menu' as AriaMenuTriggerProps['type'], isDisabled, diff --git a/packages/@react-spectrum/menu/src/context.ts b/packages/@react-spectrum/menu/src/context.ts index 623d1c630f0..cdba986d035 100644 --- a/packages/@react-spectrum/menu/src/context.ts +++ b/packages/@react-spectrum/menu/src/context.ts @@ -11,8 +11,8 @@ */ import {DOMProps, FocusStrategy, HoverEvents, KeyboardEvents, PressEvents} from '@react-types/shared'; -import {MenuTriggerState} from '@react-stately/menu'; import React, {HTMLAttributes, MutableRefObject, RefObject, useContext} from 'react'; +import {RootMenuTriggerState} from '@react-stately/menu'; import {TreeState} from '@react-stately/tree'; export interface MenuContextValue extends Omit, 'autoFocus' | 'onKeyDown'>, Pick { @@ -21,7 +21,7 @@ export interface MenuContextValue extends Omit, 'aut shouldFocusWrap?: boolean, autoFocus?: boolean | FocusStrategy, ref?: MutableRefObject, - state?: MenuTriggerState, + state?: RootMenuTriggerState, onBackButtonPress?: () => void, submenuLevel?: number } @@ -53,7 +53,7 @@ export interface MenuStateContextValue { trayContainerRef?: RefObject, menu?: RefObject, submenu?: RefObject, - rootMenuTriggerState?: MenuTriggerState + rootMenuTriggerState?: RootMenuTriggerState } export const MenuStateContext = React.createContext>(undefined); diff --git a/packages/@react-stately/menu/src/useMenuTriggerState.ts b/packages/@react-stately/menu/src/useMenuTriggerState.ts index 7a57194d4ca..a696ec34d34 100644 --- a/packages/@react-stately/menu/src/useMenuTriggerState.ts +++ b/packages/@react-stately/menu/src/useMenuTriggerState.ts @@ -15,7 +15,7 @@ import {MenuTriggerProps} from '@react-types/menu'; import {OverlayTriggerState, useOverlayTriggerState} from '@react-stately/overlays'; import {useState} from 'react'; -export interface RootMenuTriggerState extends OverlayTriggerState { +export interface MenuTriggerState extends OverlayTriggerState { /** Controls which item will be auto focused when the menu opens. */ readonly focusStrategy: FocusStrategy, @@ -26,7 +26,7 @@ export interface RootMenuTriggerState extends OverlayTriggerState { toggle(focusStrategy?: FocusStrategy | null): void } -export interface MenuTriggerState extends RootMenuTriggerState { +export interface RootMenuTriggerState extends MenuTriggerState { /** Opens a specific submenu tied to a specific menu item at a specific level. */ UNSTABLE_openSubmenu: (triggerKey: Key, level: number) => void, @@ -47,7 +47,7 @@ export interface MenuTriggerState extends RootMenuTriggerState { * and controls which item will receive focus when it opens. Also tracks the open submenus within * the menu tree via their trigger keys. */ -export function useMenuTriggerState(props: MenuTriggerProps): MenuTriggerState { +export function useMenuTriggerState(props: MenuTriggerProps): RootMenuTriggerState { let overlayTriggerState = useOverlayTriggerState(props); let [focusStrategy, setFocusStrategy] = useState(null); let [expandedKeysStack, setExpandedKeysStack] = useState([]); diff --git a/packages/@react-stately/menu/src/useSubmenuTriggerState.ts b/packages/@react-stately/menu/src/useSubmenuTriggerState.ts index 9eff0a83aef..4ba9f4e2c06 100644 --- a/packages/@react-stately/menu/src/useSubmenuTriggerState.ts +++ b/packages/@react-stately/menu/src/useSubmenuTriggerState.ts @@ -11,8 +11,8 @@ */ import {FocusStrategy, Key} from '@react-types/shared'; -import {MenuTriggerState} from './useMenuTriggerState'; import type {OverlayTriggerState} from '@react-stately/overlays'; +import {RootMenuTriggerState} from './useMenuTriggerState'; import {useCallback, useMemo, useState} from 'react'; export interface SubmenuTriggerProps { @@ -43,7 +43,7 @@ export interface SubmenuTriggerState extends OverlayTriggerState { * Manages state for a submenu trigger. Tracks whether the submenu is currently open, the level of the submenu, and * controls which item will receive focus when it opens. */ -export function UNSTABLE_useSubmenuTriggerState(props: SubmenuTriggerProps, state: MenuTriggerState): SubmenuTriggerState { +export function UNSTABLE_useSubmenuTriggerState(props: SubmenuTriggerProps, state: RootMenuTriggerState): SubmenuTriggerState { let {triggerKey} = props; let {UNSTABLE_expandedKeysStack, UNSTABLE_openSubmenu, UNSTABLE_closeSubmenu, close: closeAll} = state; let [submenuLevel] = useState(UNSTABLE_expandedKeysStack?.length); diff --git a/packages/react-stately/src/index.ts b/packages/react-stately/src/index.ts index 4b939bd887f..8afbb075561 100644 --- a/packages/react-stately/src/index.ts +++ b/packages/react-stately/src/index.ts @@ -17,7 +17,7 @@ export type {DateFieldState, DateFieldStateOptions, DatePickerState, DatePickerS export type {DraggableCollectionStateOptions, DraggableCollectionState, DroppableCollectionStateOptions, DroppableCollectionState} from '@react-stately/dnd'; export type {AsyncListData, AsyncListOptions, ListData, ListOptions, TreeData, TreeOptions} from '@react-stately/data'; export type {ListProps, ListState, SingleSelectListProps, SingleSelectListState} from '@react-stately/list'; -export type {MenuTriggerProps, MenuTriggerState} from '@react-stately/menu'; +export type {MenuTriggerProps, MenuTriggerState, RootMenuTriggerState} from '@react-stately/menu'; export type {OverlayTriggerProps, OverlayTriggerState} from '@react-stately/overlays'; export type {RadioGroupProps, RadioGroupState} from '@react-stately/radio'; export type {SearchFieldProps, SearchFieldState} from '@react-stately/searchfield';