Skip to content

Commit 1ed1484

Browse files
committed
feat: refactor onSelectItems handler to not trigger while updating (#278)
1 parent cab1c33 commit 1ed1484

File tree

2 files changed

+45
-8
lines changed

2 files changed

+45
-8
lines changed

packages/core/src/stories/BasicExamples.stories.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,3 +525,34 @@ export const DisableMultiselect = () => (
525525
<Tree treeId="tree-1" rootItem="root" treeLabel="Tree Example" />
526526
</UncontrolledTreeEnvironment>
527527
);
528+
529+
export const NavigateAway = () => {
530+
const [navigatedAway, setNavigatedAway] = useState(false);
531+
532+
if (navigatedAway) return <div>Navigated away!</div>;
533+
534+
return (
535+
<UncontrolledTreeEnvironment<string>
536+
canDragAndDrop
537+
canDropOnFolder
538+
canReorderItems
539+
dataProvider={
540+
new StaticTreeDataProvider(longTree.items, (item, data) => ({
541+
...item,
542+
data,
543+
}))
544+
}
545+
getItemTitle={item => item.data}
546+
onSelectItems={() => {
547+
setNavigatedAway(true);
548+
}}
549+
viewState={{
550+
'tree-1': {
551+
expandedItems: [],
552+
},
553+
}}
554+
>
555+
<Tree treeId="tree-1" rootItem="root" treeLabel="Tree Example" />
556+
</UncontrolledTreeEnvironment>
557+
);
558+
};

packages/core/src/uncontrolledEnvironment/UncontrolledTreeEnvironment.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import { ControlledTreeEnvironment } from '../controlledEnvironment/ControlledTreeEnvironment';
1111
import { CompleteTreeDataProvider } from './CompleteTreeDataProvider';
1212
import { 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

Comments
 (0)