@@ -10,6 +10,7 @@ import {
1010import { ControlledTreeEnvironment } from '../controlledEnvironment/ControlledTreeEnvironment' ;
1111import { CompleteTreeDataProvider } from './CompleteTreeDataProvider' ;
1212import { useIsMounted } from '../useIsMounted' ;
13+ import { useRefCopy } from '../useRefCopy' ;
1314
1415/* const createCompleteDataProvider = (provider: TreeDataProvider): CompleteTreeDataProvider => ({ // TODO Write class that internally uses provider instead
1516 ...provider,
@@ -28,6 +29,7 @@ export const UncontrolledTreeEnvironment = React.forwardRef<
2829 Record < TreeItemIndex , TreeItem >
2930 > ( { } ) ;
3031 const [ viewState , setViewState ] = useState ( props . viewState ) ;
32+ const viewStateRef = useRefCopy ( viewState ) ;
3133 const missingItemIds = useRef < TreeItemIndex [ ] > ( [ ] ) ;
3234 const dataProvider = useMemo (
3335 ( ) => new CompleteTreeDataProvider ( props . dataProvider ) ,
@@ -102,15 +104,19 @@ export const UncontrolledTreeEnvironment = React.forwardRef<
102104 props . onCollapseItem ?.( item , treeId ) ;
103105 } }
104106 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 {
111117 props . onSelectItems ?.( items , treeId ) ;
112- return { ...old , selectedItems : items } ;
113- } ) ;
118+ amendViewState ( treeId , old => ( { ...old , selectedItems : items } ) ) ;
119+ }
114120 } }
115121 onFocusItem = { ( item , treeId ) => {
116122 amendViewState ( treeId , old => ( { ...old , focusedItem : item . index } ) ) ;
0 commit comments