@@ -28,6 +28,13 @@ import { useFeatureFlag } from '../FeatureFlags';
2828import { IconButton } from '../IconButton' ;
2929import { TreeContext , DepthContext } from './TreeContext' ;
3030
31+ type UncontrolledOnToggle = (
32+ event : React . MouseEvent | React . KeyboardEvent ,
33+ node : Pick < TreeNodeProps , 'id' | 'label' | 'value' | 'isExpanded' >
34+ ) => void ;
35+
36+ type ControlledOnToggle = ( isExpanded : TreeNodeProps [ 'isExpanded' ] ) => void ;
37+
3138export type TreeNodeProps = {
3239 /**
3340 * **Note:** this is controlled by the parent TreeView component, do not set manually.
@@ -76,20 +83,20 @@ export type TreeNodeProps = {
7683 * Callback function for when the node is selected
7784 */
7885 onSelect ?: (
79- event : React . MouseEvent ,
80- node ?: Omit < TreeNodeProps , 'children ' >
86+ event : React . MouseEvent | React . KeyboardEvent ,
87+ node : Pick < TreeNodeProps , 'id' | 'label' | 'value '>
8188 ) => void ;
8289 /**
8390 * Callback function for when a parent node is expanded or collapsed
8491 */
85- onToggle ?: (
86- event : React . MouseEvent | React . KeyboardEvent ,
87- node ?: Omit < TreeNodeProps , 'children' >
88- ) => void ;
92+ onToggle ?: UncontrolledOnToggle | ControlledOnToggle ;
8993 /**
9094 * Callback function for when any node in the tree is selected
9195 */
92- onTreeSelect ?: ( event : React . MouseEvent , node ?: TreeNodeProps ) => void ;
96+ onTreeSelect ?: (
97+ event : React . MouseEvent | React . KeyboardEvent ,
98+ node : Pick < TreeNodeProps , 'id' | 'label' | 'value' >
99+ ) => void ;
93100 /**
94101 * A component used to render an icon.
95102 */
@@ -274,14 +281,7 @@ const TreeNode = React.forwardRef<HTMLElement, TreeNodeProps>(
274281
275282 const controllableExpandedState = useControllableState ( {
276283 value : isExpanded ,
277- onChange : ( newValue : boolean ) => {
278- onToggle ?.( undefined as unknown as MouseEvent , {
279- id,
280- isExpanded : newValue ,
281- label,
282- value,
283- } ) ;
284- } ,
284+ onChange : onToggle as ControlledOnToggle ,
285285 defaultValue : defaultIsExpanded ?? false ,
286286 } ) ;
287287 const uncontrollableExpandedState = useState ( isExpanded ?? false ) ;
@@ -360,7 +360,12 @@ const TreeNode = React.forwardRef<HTMLElement, TreeNodeProps>(
360360 }
361361
362362 if ( ! enableTreeviewControllable ) {
363- onToggle ?.( event , { id, isExpanded : ! expanded , label, value } ) ;
363+ ( onToggle as UncontrolledOnToggle ) ?.( event , {
364+ id,
365+ isExpanded : ! expanded ,
366+ label,
367+ value,
368+ } ) ;
364369 }
365370 setExpanded ( ! expanded ) ;
366371 }
@@ -406,7 +411,12 @@ const TreeNode = React.forwardRef<HTMLElement, TreeNodeProps>(
406411
407412 if ( children && expanded ) {
408413 if ( ! enableTreeviewControllable ) {
409- onToggle ?.( event , { id, isExpanded : false , label, value } ) ;
414+ ( onToggle as UncontrolledOnToggle ) ?.( event , {
415+ id,
416+ isExpanded : false ,
417+ label,
418+ value,
419+ } ) ;
410420 }
411421 setExpanded ( false ) ;
412422 } else {
@@ -438,7 +448,12 @@ const TreeNode = React.forwardRef<HTMLElement, TreeNodeProps>(
438448 ) ?. focus ( ) ;
439449 } else {
440450 if ( ! enableTreeviewControllable ) {
441- onToggle ?.( event , { id, isExpanded : true , label, value } ) ;
451+ ( onToggle as UncontrolledOnToggle ) ?.( event , {
452+ id,
453+ isExpanded : true ,
454+ label,
455+ value,
456+ } ) ;
442457 }
443458 setExpanded ( true ) ;
444459 }
@@ -449,7 +464,12 @@ const TreeNode = React.forwardRef<HTMLElement, TreeNodeProps>(
449464 if ( match ( event , keys . Enter ) && children ) {
450465 // Toggle expansion state for parent nodes
451466 if ( ! enableTreeviewControllable ) {
452- onToggle ?.( event , { id, isExpanded : ! expanded , label, value } ) ;
467+ ( onToggle as UncontrolledOnToggle ) ?.( event , {
468+ id,
469+ isExpanded : ! expanded ,
470+ label,
471+ value,
472+ } ) ;
453473 }
454474 setExpanded ( ! expanded ) ;
455475 }
0 commit comments