@@ -74,6 +74,11 @@ function BaseNavButton({
74
74
const theme = useTheme ( ) ;
75
75
const [ showDisabledMessage , setShowDisabledMessage ] = useState ( false ) ;
76
76
77
+ // Inline state sync - this is safe/recommended by the React team in this case
78
+ if ( ! disabled && showDisabledMessage ) {
79
+ setShowDisabledMessage ( false ) ;
80
+ }
81
+
77
82
useEffect ( ( ) => {
78
83
if ( ! showDisabledMessage ) {
79
84
return ;
@@ -84,19 +89,24 @@ function BaseNavButton({
84
89
disabledMessageTimeout ,
85
90
) ;
86
91
87
- return ( ) => window . clearTimeout ( timeoutId ) ;
92
+ return ( ) => {
93
+ setShowDisabledMessage ( false ) ;
94
+ window . clearTimeout ( timeoutId ) ;
95
+ } ;
88
96
} , [ showDisabledMessage , disabledMessageTimeout ] ) ;
89
97
90
- // Using inline state sync to help MUI render accurately more quickly; same
91
- // idea as the useEffect approach, but state changes flush faster
92
- if ( ! disabled && showDisabledMessage ) {
93
- setShowDisabledMessage ( false ) ;
94
- }
95
-
96
98
return (
97
99
< Tooltip title = { disabledMessage } open = { showDisabledMessage } >
100
+ { /*
101
+ * Going more out of the way to avoid attaching the disabled prop directly
102
+ * to avoid unwanted side effects of using the prop:
103
+ * - Not being focusable/keyboard-navigable
104
+ * - Not being able to call functions in response to invalid actions
105
+ * (mostly for giving direct UI feedback to those actions)
106
+ */ }
98
107
< Button
99
108
aria-label = { ariaLabel }
109
+ aria-disabled = { disabled }
100
110
css = {
101
111
disabled && {
102
112
borderColor : theme . palette . divider ,
0 commit comments