20251: Fix flaky collection file browser by using race-free state update callback
[arvados-workbench2.git] / src / components / collection-panel-files / collection-panel-files.tsx
index 2ba29d44801435ccc258ebfd0fea533186567bd7..fb36ebce549d25171e38fed562db654d887a79ed 100644 (file)
@@ -233,11 +233,12 @@ export const CollectionPanelFiles = withStyles(styles)(connect((state: RootState
     const { classes, onItemMenuOpen, onUploadDataClick, isWritable, dispatch, collectionPanelFiles, collectionPanel } = props;
     const { apiToken, config } = props.auth;
 
-    const webdavClient = new WebDAV();
-    webdavClient.defaults.baseURL = config.keepWebServiceUrl;
-    webdavClient.defaults.headers = {
-        Authorization: `Bearer ${apiToken}`
-    };
+    const webdavClient = new WebDAV({
+        baseURL: config.keepWebServiceUrl,
+        headers: {
+            Authorization: `Bearer ${apiToken}`
+        },
+    });
 
     const webDAVRequestConfig: WebDAVRequestConfig = {
         headers: {
@@ -308,8 +309,7 @@ export const CollectionPanelFiles = withStyles(styles)(connect((state: RootState
             }).reduce((prev, next) => {
                 return { ...next, ...prev };
             }, {});
-
-            setPathData({ ...pathData, ...newState });
+            setPathData((state) => ({ ...state, ...newState }));
         })
         .finally(() => {
             setIsLoading(false);
@@ -404,7 +404,7 @@ export const CollectionPanelFiles = withStyles(styles)(connect((state: RootState
 
                 if (breadcrumbPath) {
                     const index = path.indexOf(breadcrumbPath);
-                    setPath([...path.slice(0, index + 1)]);
+                    setPath((state) => ([...state.slice(0, index + 1)]));
                 }
 
                 if (parentPath && type === 'directory') {
@@ -412,11 +412,11 @@ export const CollectionPanelFiles = withStyles(styles)(connect((state: RootState
                         path.pop()
                     }
 
-                    setPath([...path, parentPath]);
+                    setPath((state) => ([...state, parentPath]));
                 }
 
                 if (subfolderPath && type === 'directory') {
-                    setPath([...path, subfolderPath]);
+                    setPath((state) => ([...state, subfolderPath]));
                 }
 
                 if (elem.dataset.id && type === 'file') {
@@ -502,7 +502,7 @@ export const CollectionPanelFiles = withStyles(styles)(connect((state: RootState
         <div className={classes.wrapper}>
             <div className={classNames(classes.leftPanel, path.length > 1 ? classes.leftPanelVisible : classes.leftPanelHidden)} data-cy="collection-files-left-panel">
                 <Tooltip title="Go back" className={path.length > 1 ? classes.backButton : classes.backButtonHidden}>
-                    <IconButton onClick={() => setPath([...path.slice(0, path.length -1)])}>
+                    <IconButton onClick={() => setPath((state) => ([...state.slice(0, state.length -1)]))}>
                         <BackIcon />
                     </IconButton>
                 </Tooltip>