11/** @jsxRuntime classic */
22/** @jsx withSlots */
3- import React , { useRef , useState , useCallback } from 'react' ;
3+ import React , { useRef , useState , useCallback , useMemo } from 'react' ;
4+ import { Platform } from 'react-native' ;
45
56import { ButtonV1 as Button } from '@fluentui-react-native/button' ;
67import type { UseSlots } from '@fluentui-react-native/framework' ;
@@ -37,6 +38,38 @@ export const MenuButton = compose<MenuButtonType>({
3738 setShowContextualMenu ( ! showContextualMenu ) ;
3839 } , [ showContextualMenu , setShowContextualMenu ] ) ;
3940
41+ // Default accessibility actions to help screen readers announce expanded/collapsed state
42+ // Only provide on win32 to follow platform-specific accessibility patterns
43+ const defaultAccessibilityActions = useMemo ( ( ) => {
44+ if ( Platform . OS === ( 'win32' as any ) ) {
45+ return [
46+ { name : 'Expand' , label : 'Expand menu' } ,
47+ { name : 'Collapse' , label : 'Collapse menu' } ,
48+ ] ;
49+ }
50+ return [ ] ;
51+ } , [ ] ) ;
52+
53+ const onAccessibilityAction = useCallback (
54+ ( event ) => {
55+ if ( Platform . OS === ( 'win32' as any ) ) {
56+ switch ( event . nativeEvent . actionName ) {
57+ case 'Expand' :
58+ if ( ! showContextualMenu ) {
59+ setShowContextualMenu ( true ) ;
60+ }
61+ break ;
62+ case 'Collapse' :
63+ if ( showContextualMenu ) {
64+ setShowContextualMenu ( false ) ;
65+ }
66+ break ;
67+ }
68+ }
69+ } ,
70+ [ showContextualMenu ] ,
71+ ) ;
72+
4073 const buttonProps = {
4174 disabled,
4275 appearance,
@@ -45,6 +78,9 @@ export const MenuButton = compose<MenuButtonType>({
4578 componentRef : stdBtnRef ,
4679 onClick : toggleShowContextualMenu ,
4780 iconOnly : content ? false : true ,
81+ accessibilityState : { expanded : showContextualMenu } ,
82+ accessibilityActions : defaultAccessibilityActions ,
83+ onAccessibilityAction,
4884 ...rest ,
4985 } ;
5086
0 commit comments