@@ -143,14 +143,15 @@ function ControlledTree<T extends object>({
143143 [ tree ] ,
144144 ) ;
145145
146- const handleLabelClick = useCallback (
146+ const handleSingleSelection = useCallback (
147147 ( nodeValue : string , selected : boolean ) => {
148148 if ( selectionMode !== "single" ) {
149149 return ;
150150 }
151151
152152 if ( selected ) {
153153 tree . deselect ( nodeValue ) ;
154+ onSelect ?.( [ ] ) ;
154155 } else {
155156 tree . select ( nodeValue ) ;
156157 const selectedNode = findNodeById ( nodes , mantineNodeValueToId ( nodeValue ) ) ;
@@ -186,6 +187,10 @@ function ControlledTree<T extends object>({
186187 [ styles . selectOnClick ] : selectionMode === "single" ,
187188 [ styles . selectedPath ] : selected ,
188189 } ) }
190+ onClick = { ( event : React . MouseEvent < HTMLDivElement > ) => {
191+ handleSingleSelection ( node . value , selected ) ;
192+ elementProps . onClick ( event ) ;
193+ } }
189194 >
190195 { selectionMode === "multiple" && (
191196 < Checkbox . Indicator
@@ -212,18 +217,13 @@ function ControlledTree<T extends object>({
212217 </ ActionIcon >
213218 ) }
214219
215- < div
216- className = { styles . labelContainer }
217- onClick = { ( ) => {
218- handleLabelClick ( node . value , selected ) ;
219- } }
220- >
220+ < div className = { styles . labelContainer } >
221221 < span > { node . label } </ span >
222222 </ div >
223223 </ div >
224224 ) ;
225225 } ,
226- [ selectionMode , tree , handleCheckboxClick , handleExpandClick , handleLabelClick ] ,
226+ [ selectionMode , tree , handleCheckboxClick , handleExpandClick , handleSingleSelection ] ,
227227 ) ;
228228
229229 // Update tree state controlled selection changes
@@ -266,33 +266,7 @@ function ControlledTree<T extends object>({
266266 ) ;
267267}
268268
269- export default memo ( ControlledTree , ( prevProps , nextProps ) => {
270- // Custom comparison to prevent re-renders when array contents haven't changed
271- if ( prevProps . selectionMode !== nextProps . selectionMode ) {
272- return false ;
273- }
274-
275- if ( prevProps . nodes !== nextProps . nodes ) {
276- return false ;
277- }
278-
279- if ( prevProps . onSelect !== nextProps . onSelect ) {
280- return false ;
281- }
282-
283- // Deep comparison for selectedNodeIds array
284- if ( prevProps . selectedNodeIds . length !== nextProps . selectedNodeIds . length ) {
285- return false ;
286- }
287-
288- for ( let i = 0 ; i < prevProps . selectedNodeIds . length ; i ++ ) {
289- if ( prevProps . selectedNodeIds [ i ] !== nextProps . selectedNodeIds [ i ] ) {
290- return false ;
291- }
292- }
293-
294- return true ;
295- } ) as typeof ControlledTree ;
269+ export default memo ( ControlledTree ) as typeof ControlledTree ;
296270
297271// UTILITIES
298272// -------------------------------------------------------------------------------------------------
0 commit comments