Skip to content

Commit 29d2565

Browse files
committed
fixup! feat(react-menu): add base hooks for Menu, MenuList and export them
1 parent 21792df commit 29d2565

15 files changed

Lines changed: 151 additions & 75 deletions

File tree

packages/react-components/react-menu/library/etc/react-menu.api.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ export const Menu: React_2.FC<MenuProps>;
3232
// @public
3333
export const MENU_ENTER_EVENT = "fuimenuenter";
3434

35+
// @public (undocumented)
36+
export type MenuBaseProps = Omit<MenuProps, 'surfaceMotion'>;
37+
38+
// @public (undocumented)
39+
export type MenuBaseState = Omit<MenuState, 'surfaceMotion' | 'components'>;
40+
3541
// @public (undocumented)
3642
export type MenuCheckedValueChangeData = {
3743
checkedItems: string[];
@@ -167,6 +173,12 @@ export type MenuItemProps = Omit<ComponentProps<Partial<MenuItemSlots>>, 'conten
167173
// @public
168174
export const MenuItemRadio: ForwardRefComponent<MenuItemRadioProps>;
169175

176+
// @public
177+
export type MenuItemRadioBaseProps = MenuItemRadioProps;
178+
179+
// @public
180+
export type MenuItemRadioBaseState = MenuItemRadioState;
181+
170182
// @public (undocumented)
171183
export const menuItemRadioClassNames: SlotClassNames<Omit<MenuItemSlots, 'submenuIndicator'>>;
172184

@@ -482,6 +494,13 @@ export const useMenu_unstable: (props: MenuProps & {
482494
};
483495
}) => MenuState;
484496

497+
// @public
498+
export const useMenuBase_unstable: (props: MenuBaseProps & {
499+
safeZone?: boolean | {
500+
timeout?: number;
501+
};
502+
}) => MenuBaseState;
503+
485504
// @public (undocumented)
486505
export const useMenuContext_unstable: <T>(selector: ContextSelector<MenuContextValue, T>) => T;
487506

@@ -515,21 +534,33 @@ export const useMenuGroupStyles_unstable: (state: MenuGroupState) => MenuGroupSt
515534
// @public
516535
export const useMenuItem_unstable: (props: MenuItemProps, ref: React_2.Ref<ARIAButtonElement<"div">>) => MenuItemState;
517536

537+
// @internal
538+
export const useMenuItemBase_unstable: (props: MenuItemProps, ref: React_2.Ref<ARIAButtonElement<"div">>) => MenuItemState;
539+
518540
// @public
519541
export const useMenuItemCheckbox_unstable: (props: MenuItemCheckboxProps, ref: React_2.Ref<ARIAButtonElement<"div">>) => MenuItemCheckboxState;
520542

543+
// @internal
544+
export const useMenuItemCheckboxBase_unstable: (props: MenuItemCheckboxProps, ref: React_2.Ref<ARIAButtonElement<"div">>) => MenuItemCheckboxState;
545+
521546
// @public (undocumented)
522547
export const useMenuItemCheckboxStyles_unstable: (state: MenuItemCheckboxState) => MenuItemCheckboxState;
523548

524549
// @public
525550
export const useMenuItemLink_unstable: (props: MenuItemLinkProps, ref: React_2.Ref<HTMLAnchorElement>) => MenuItemLinkState;
526551

552+
// @public
553+
export const useMenuItemLinkBase_unstable: (props: MenuItemLinkProps, ref: React_2.Ref<HTMLAnchorElement>) => MenuItemLinkState;
554+
527555
// @public
528556
export const useMenuItemLinkStyles_unstable: (state: MenuItemLinkState) => MenuItemLinkState;
529557

530558
// @public
531559
export const useMenuItemRadio_unstable: (props: MenuItemRadioProps, ref: React_2.Ref<ARIAButtonElement<"div">>) => MenuItemRadioState;
532560

561+
// @internal
562+
export const useMenuItemRadioBase_unstable: (props: MenuItemRadioBaseProps, ref: React_2.Ref<ARIAButtonElement<"div">>) => MenuItemRadioBaseState;
563+
533564
// @public (undocumented)
534565
export const useMenuItemRadioStyles_unstable: (state: MenuItemRadioState) => void;
535566

@@ -539,12 +570,18 @@ export const useMenuItemStyles_unstable: (state: MenuItemState) => MenuItemState
539570
// @public
540571
export const useMenuItemSwitch_unstable: (props: MenuItemSwitchProps, ref: React_2.Ref<HTMLDivElement>) => MenuItemSwitchState;
541572

573+
// @internal
574+
export const useMenuItemSwitchBase_unstable: (props: MenuItemSwitchProps, ref: React_2.Ref<HTMLDivElement>) => MenuItemSwitchState;
575+
542576
// @public
543577
export const useMenuItemSwitchStyles_unstable: (state: MenuItemSwitchState) => MenuItemSwitchState;
544578

545579
// @public
546580
export const useMenuList_unstable: (props: MenuListProps, ref: React_2.Ref<HTMLElement>) => MenuListState;
547581

582+
// @public
583+
export const useMenuListBase_unstable: (props: MenuListProps, ref: React_2.Ref<HTMLElement>) => MenuListState;
584+
548585
// @public (undocumented)
549586
export const useMenuListContext_unstable: <T>(selector: ContextSelector<MenuListContextValue, T>) => T;
550587

@@ -557,6 +594,9 @@ export const useMenuListStyles_unstable: (state: MenuListState) => MenuListState
557594
// @public
558595
export const useMenuPopover_unstable: (props: MenuPopoverProps, ref: React_2.Ref<HTMLElement>) => MenuPopoverState;
559596

597+
// @public
598+
export const useMenuPopoverBase_unstable: (props: MenuPopoverProps, ref: React_2.Ref<HTMLElement>) => MenuPopoverState;
599+
560600
// @public
561601
export const useMenuPopoverStyles_unstable: (state: MenuPopoverState) => MenuPopoverState;
562602

packages/react-components/react-menu/library/src/MenuItemLink.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export {
33
MenuItemLink,
44
menuItemLinkClassNames,
55
renderMenuItemLink_unstable,
6+
useMenuItemLinkBase_unstable,
67
useMenuItemLinkStyles_unstable,
78
useMenuItemLink_unstable,
89
} from './components/MenuItemLink/index';
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
export type { MenuItemRadioProps, MenuItemRadioState } from './components/MenuItemRadio/index';
1+
export type {
2+
MenuItemRadioBaseProps,
3+
MenuItemRadioBaseState,
4+
MenuItemRadioProps,
5+
MenuItemRadioState,
6+
} from './components/MenuItemRadio/index';
27
export {
38
MenuItemRadio,
49
menuItemRadioClassNames,
510
renderMenuItemRadio_unstable,
11+
useMenuItemRadioBase_unstable,
612
useMenuItemRadioStyles_unstable,
713
useMenuItemRadio_unstable,
8-
useMenuItemRadioBase_unstable,
914
} from './components/MenuItemRadio/index';

packages/react-components/react-menu/library/src/MenuList.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
export type {
22
MenuCheckedValueChangeData,
33
MenuCheckedValueChangeEvent,
4-
MenuListBaseProps,
5-
MenuListBaseState,
64
MenuListContextValues,
75
MenuListProps,
86
MenuListSlots,

packages/react-components/react-menu/library/src/MenuPopover.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export {
33
MenuPopover,
44
menuPopoverClassNames,
55
renderMenuPopover_unstable,
6+
useMenuPopoverBase_unstable,
67
useMenuPopoverStyles_unstable,
78
useMenuPopover_unstable,
89
} from './components/MenuPopover/index';

packages/react-components/react-menu/library/src/components/Menu/Menu.types.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,9 @@ export type MenuState = ComponentState<InternalMenuSlots> &
187187
safeZone?: React.ReactElement | null;
188188
};
189189

190-
/**
191-
* MenuBase Props - omits the design-related `surfaceMotion` slot.
192-
*/
193190
export type MenuBaseProps = Omit<MenuProps, 'surfaceMotion'>;
194191

195-
/**
196-
* MenuBase State - omits the design-related `surfaceMotion` slot and its `components` entry.
197-
*/
198-
export type MenuBaseState = Omit<MenuState, 'surfaceMotion' | 'components'> & {
199-
components: Record<string, never>;
200-
};
192+
export type MenuBaseState = Omit<MenuState, 'surfaceMotion' | 'components'>;
201193

202194
export type MenuContextValues = {
203195
menu: MenuContextValue;

packages/react-components/react-menu/library/src/components/Menu/useMenu.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export const useMenu_unstable = (props: MenuProps & { safeZone?: boolean | { tim
7979
* Base hook for Menu component, produces state required to render the component.
8080
* It doesn't set any design-related slots specific to Menu such as `surfaceMotion`.
8181
*
82-
* @internal
82+
* @param props - props from this instance of Menu
8383
*/
8484
export const useMenuBase_unstable = (
8585
props: MenuBaseProps & { safeZone?: boolean | { timeout?: number } },
@@ -224,7 +224,6 @@ export const useMenuBase_unstable = (
224224
mountNode,
225225
triggerRef,
226226
menuPopoverRef,
227-
components: {},
228227
openOnContext,
229228
open,
230229
setOpen,
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export { MenuItemLink } from './MenuItemLink';
22
export type { MenuItemLinkProps, MenuItemLinkSlots, MenuItemLinkState } from './MenuItemLink.types';
33
export { renderMenuItemLink_unstable } from './renderMenuItemLink';
4-
export { useMenuItemLink_unstable } from './useMenuItemLink';
4+
export { useMenuItemLinkBase_unstable, useMenuItemLink_unstable } from './useMenuItemLink';
55
export { menuItemLinkClassNames, useMenuItemLinkStyles_unstable } from './useMenuItemLinkStyles.styles';

packages/react-components/react-menu/library/src/components/MenuItemLink/useMenuItemLink.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type * as React from 'react';
44
import type { ExtractSlotProps, Slot } from '@fluentui/react-utilities';
55
import { getIntrinsicElementProps, slot } from '@fluentui/react-utilities';
66
import type { MenuItemLinkProps, MenuItemLinkState } from './MenuItemLink.types';
7-
import { useMenuItem_unstable } from '../MenuItem/useMenuItem';
7+
import { useMenuItemBase_unstable, useMenuItem_unstable } from '../MenuItem/useMenuItem';
88
import type { MenuItemProps } from '../MenuItem/MenuItem.types';
99

1010
/**
@@ -43,3 +43,34 @@ export const useMenuItemLink_unstable = (
4343
),
4444
};
4545
};
46+
47+
/**
48+
* Base hook for MenuItemLink, mirrors `useMenuItemLink_unstable` but composes with
49+
* `useMenuItemBase_unstable`.
50+
*
51+
* @param props - props from this instance of MenuItemLink
52+
* @param ref - reference to root HTMLElement of MenuItemLink
53+
*/
54+
export const useMenuItemLinkBase_unstable = (
55+
props: MenuItemLinkProps,
56+
ref: React.Ref<HTMLAnchorElement>,
57+
): MenuItemLinkState => {
58+
const baseState = useMenuItemBase_unstable(props as MenuItemProps, null);
59+
const _props = { ...props, ...(baseState.root as ExtractSlotProps<Slot<'a'>>), ref, tabIndex: props.tabIndex };
60+
61+
return {
62+
...baseState,
63+
components: {
64+
// eslint-disable-next-line @typescript-eslint/no-deprecated
65+
...baseState.components,
66+
root: 'a',
67+
},
68+
root: slot.always(
69+
getIntrinsicElementProps('a', {
70+
role: 'menuitem',
71+
..._props,
72+
}),
73+
{ elementType: 'a' },
74+
),
75+
};
76+
};

packages/react-components/react-menu/library/src/components/MenuList/MenuList.types.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,6 @@ export type MenuListState = ComponentState<MenuListSlots> &
7171
hasMenuContext?: boolean;
7272
};
7373

74-
/**
75-
* MenuListBase Props - omits design-related props (`hasIcons`, `hasCheckmarks`).
76-
*/
77-
export type MenuListBaseProps = Omit<MenuListProps, 'hasIcons' | 'hasCheckmarks'>;
78-
79-
/**
80-
* MenuListBase State - omits design-related state (`hasIcons`, `hasCheckmarks`).
81-
*/
82-
export type MenuListBaseState = Omit<MenuListState, 'hasIcons' | 'hasCheckmarks'>;
83-
8474
export type MenuListContextValues = {
8575
menuList: MenuListContextValue;
8676
};

0 commit comments

Comments
 (0)