@@ -10,6 +10,7 @@ import {
10
10
import { ControlledTreeEnvironment } from '../controlledEnvironment/ControlledTreeEnvironment' ;
11
11
import { CompleteTreeDataProvider } from './CompleteTreeDataProvider' ;
12
12
import { useIsMounted } from '../useIsMounted' ;
13
+ import { useRefCopy } from '../useRefCopy' ;
13
14
14
15
/* const createCompleteDataProvider = (provider: TreeDataProvider): CompleteTreeDataProvider => ({ // TODO Write class that internally uses provider instead
15
16
...provider,
@@ -28,6 +29,7 @@ export const UncontrolledTreeEnvironment = React.forwardRef<
28
29
Record < TreeItemIndex , TreeItem >
29
30
> ( { } ) ;
30
31
const [ viewState , setViewState ] = useState ( props . viewState ) ;
32
+ const viewStateRef = useRefCopy ( viewState ) ;
31
33
const missingItemIds = useRef < TreeItemIndex [ ] > ( [ ] ) ;
32
34
const dataProvider = useMemo (
33
35
( ) => new CompleteTreeDataProvider ( props . dataProvider ) ,
@@ -102,15 +104,19 @@ export const UncontrolledTreeEnvironment = React.forwardRef<
102
104
props . onCollapseItem ?.( item , treeId ) ;
103
105
} }
104
106
onSelectItems = { ( items , treeId ) => {
105
- amendViewState ( treeId , old => {
106
- if ( props . disableMultiselect ) {
107
- const newSelected = old . focusedItem ? [ old . focusedItem ] : [ ] ;
108
- props . onSelectItems ?.( newSelected , treeId ) ;
109
- return { ...old , selectedItems : newSelected } ;
110
- }
107
+ const oldFocusedItem = viewStateRef . current [ treeId ] ?. focusedItem ;
108
+
109
+ if ( props . disableMultiselect ) {
110
+ const newSelected = oldFocusedItem ? [ oldFocusedItem ] : [ ] ;
111
+ props . onSelectItems ?.( newSelected , treeId ) ;
112
+ amendViewState ( treeId , old => ( {
113
+ ...old ,
114
+ selectedItems : newSelected ,
115
+ } ) ) ;
116
+ } else {
111
117
props . onSelectItems ?.( items , treeId ) ;
112
- return { ...old , selectedItems : items } ;
113
- } ) ;
118
+ amendViewState ( treeId , old => ( { ...old , selectedItems : items } ) ) ;
119
+ }
114
120
} }
115
121
onFocusItem = { ( item , treeId ) => {
116
122
amendViewState ( treeId , old => ( { ...old , focusedItem : item . index } ) ) ;
0 commit comments