Skip to content

Commit 619e026

Browse files
authored
Fork SubmenuItem pressable (#2435)
1 parent cf32d3b commit 619e026

File tree

4 files changed

+55
-5
lines changed

4 files changed

+55
-5
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "Fork SubmenuItem pressable",
4+
"packageName": "@fluentui-react-native/contextual-menu",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

packages/components/ContextualMenu/src/SubmenuItem.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/** @jsx withSlots */
22
import * as React from 'react';
3-
import { I18nManager, Platform, View } from 'react-native';
3+
import { I18nManager, Platform, Pressable, View } from 'react-native';
44
import {
55
SubmenuItemSlotProps,
66
SubmenuItemState,
@@ -15,7 +15,7 @@ import { Text } from '@fluentui-react-native/text';
1515
import { settings } from './SubmenuItem.settings';
1616
import { backgroundColorTokens, borderTokens, textTokens, foregroundColorTokens, getPaletteFromTheme } from '@fluentui-react-native/tokens';
1717
import { mergeSettings } from '@uifabricshared/foundation-settings';
18-
import { useKeyDownProps, useViewCommandFocus, useAsPressable } from '@fluentui-react-native/interactive-hooks';
18+
import { useKeyDownProps, useViewCommandFocus, useAsPressable, usePressableState } from '@fluentui-react-native/interactive-hooks';
1919
import { CMContext } from './ContextualMenu';
2020
import { Icon, SvgIconProps, createIconProps } from '@fluentui-react-native/icon';
2121
import { Svg, G, Path, SvgProps } from 'react-native-svg';
@@ -63,14 +63,24 @@ export const SubmenuItem = compose<SubmenuItemType>({
6363
}
6464
}, [context, disabled, itemKey, onClick]);
6565

66-
const pressable = useAsPressable({
66+
const pressableWin32 = usePressableState({
6767
...rest,
6868
onPress: onItemPress,
6969
onHoverIn: onItemHoverIn,
7070
delayHoverIn: onHoverInDelay,
7171
onHoverOut: onItemHoverOut,
7272
});
7373

74+
const pressableMacOS = useAsPressable({
75+
...rest,
76+
onPress: onItemPress,
77+
onHoverIn: onItemHoverIn,
78+
delayHoverIn: onHoverInDelay,
79+
onHoverOut: onItemHoverOut,
80+
});
81+
82+
const pressable = Platform.OS === 'macos' ? pressableMacOS : pressableWin32;
83+
7484
/**
7585
* GH #1267
7686
* We want onMouseEnter to fire right away to set focus, and then Pressable's onHoverIn to fire after a delay to show the submenu.
@@ -188,7 +198,7 @@ export const SubmenuItem = compose<SubmenuItemType>({
188198
);
189199
},
190200
slots: {
191-
root: View,
201+
root: Platform.OS === 'macos' ? View : Pressable,
192202
startstack: View,
193203
icon: Icon as React.ComponentType,
194204
content: Text,
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import * as React from 'react';
2+
import { IViewProps } from '@fluentui-react-native/adapters';
3+
import { IRenderData } from '@uifabricshared/foundation-composable';
4+
import { ITextProps } from '@fluentui-react-native/text';
5+
import { ContextualMenuItemProps, ContextualMenuItemTokens, ContextualMenuItemState } from './ContextualMenuItem.types';
6+
import { IconProps } from '@fluentui-react-native/icon';
7+
8+
export const submenuItemName = 'SubmenuItem';
9+
export interface SubmenuItemTokens extends ContextualMenuItemTokens {
10+
chevronColor?: string;
11+
}
12+
export type SubmenuItemProps = ContextualMenuItemProps;
13+
14+
export type SubmenuItemState = ContextualMenuItemState;
15+
16+
export interface SubmenuItemSlotProps {
17+
root: React.PropsWithRef<IViewProps>;
18+
startstack: IViewProps;
19+
icon: IconProps;
20+
content: ITextProps;
21+
endstack: IViewProps;
22+
chevron: IconProps;
23+
}
24+
25+
export type SubmenuItemRenderData = IRenderData<SubmenuItemSlotProps, SubmenuItemState>;
26+
27+
export interface SubmenuItemType {
28+
props: SubmenuItemProps;
29+
tokens: SubmenuItemTokens;
30+
slotProps: SubmenuItemSlotProps;
31+
state: SubmenuItemState;
32+
}

packages/components/ContextualMenu/src/SubmenuItem.types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { IRenderData } from '@uifabricshared/foundation-composable';
44
import { ITextProps } from '@fluentui-react-native/text';
55
import { ContextualMenuItemProps, ContextualMenuItemTokens, ContextualMenuItemState } from './ContextualMenuItem.types';
66
import { IconProps } from '@fluentui-react-native/icon';
7+
import { PressablePropsExtended } from '@fluentui-react-native/interactive-hooks';
78

89
export const submenuItemName = 'SubmenuItem';
910
export interface SubmenuItemTokens extends ContextualMenuItemTokens {
@@ -14,7 +15,7 @@ export type SubmenuItemProps = ContextualMenuItemProps;
1415
export type SubmenuItemState = ContextualMenuItemState;
1516

1617
export interface SubmenuItemSlotProps {
17-
root: React.PropsWithRef<IViewProps>;
18+
root: React.PropsWithRef<PressablePropsExtended>;
1819
startstack: IViewProps;
1920
icon: IconProps;
2021
content: ITextProps;

0 commit comments

Comments
 (0)