🐛 Fix restore/refresh after upload (#803)
This commit is contained in:
+1
-1
@@ -131,7 +131,7 @@ const PendingRootList = ({
|
||||
style={{ width: '100%', maxHeight: 300 }}
|
||||
>
|
||||
{keys.map(key => (
|
||||
<PendingRootRow key={key} rootKey={key} root={roots[key]} parentId={parentId} />
|
||||
<PendingRootRow key={key} rootKey={key} root={roots[key]} />
|
||||
))}
|
||||
</PerfectScrollbar>
|
||||
</div>
|
||||
|
||||
+15
-8
@@ -19,17 +19,16 @@ import Languages from 'app/features/global/services/languages-service';
|
||||
const PendingRootRow = ({
|
||||
rootKey,
|
||||
root,
|
||||
parentId,
|
||||
}: {
|
||||
rootKey: string;
|
||||
root: UploadRootType;
|
||||
parentId: string;
|
||||
}): JSX.Element => {
|
||||
const { pauseOrResumeRootUpload, cancelRootUpload, clearRoots } = useUpload();
|
||||
const [showFolder, setShowFolder] = useState(false);
|
||||
const [restoredFolder, setRestoredFolder] = useState(false);
|
||||
const { item } = useDriveItem(root?.id || '');
|
||||
const { restore } = useDriveActions();
|
||||
const { refresh } = useDriveItem(parentId || '');
|
||||
const { refresh, children } = useDriveItem(item?.parent_id || '');
|
||||
|
||||
const firstPendingFile = root.items[0];
|
||||
const uploadedFilesSize = root.uploadedSize;
|
||||
@@ -42,6 +41,7 @@ const PendingRootRow = ({
|
||||
if (!showFolder || isFileRoot) {
|
||||
const redirectionURL = RouterService.generateRouteFromState({
|
||||
itemId: root.id,
|
||||
dirId: item?.parent_id || '',
|
||||
});
|
||||
window.open(redirectionURL, '_blank');
|
||||
} else {
|
||||
@@ -74,16 +74,23 @@ const PendingRootRow = ({
|
||||
}
|
||||
}, [isUploadCompleted]);
|
||||
|
||||
const waitForChild = async (itemId: string, retries = 5, interval = 1000) => {
|
||||
for (let attempt = 0; attempt < retries; attempt++) {
|
||||
await new Promise(resolve => setTimeout(resolve, interval));
|
||||
if (children.some(child => child.id === itemId)) return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const postProcess = async () => {
|
||||
if (isUploadCompleted && !restoredFolder) {
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
await restore(root.id, parentId);
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
await refresh(parentId);
|
||||
if (!isFileRoot) await restore(root.id, item?.parent_id || '');
|
||||
const found = isFileRoot || (await waitForChild(root.id));
|
||||
if (found) await refresh(item?.parent_id || '');
|
||||
}
|
||||
};
|
||||
if (isUploadCompleted && !restoredFolder) {
|
||||
if (isUploadCompleted && root.id && !restoredFolder) {
|
||||
setRestoredFolder(true);
|
||||
postProcess();
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { ToasterService } from '@features/global/services/toaster-service';
|
||||
import { LoadingStateInitTrue } from '@features/global/state/atoms/Loading';
|
||||
import useRouterCompany from '@features/router/hooks/use-router-company';
|
||||
import { useCallback } from 'react';
|
||||
import { useCallback, useEffect } from 'react';
|
||||
import { useRecoilCallback, useRecoilState, useRecoilValue } from 'recoil';
|
||||
import { DriveItemAtom, DriveItemChildrenAtom, DriveItemPagination } from '../state/store';
|
||||
import { DriveItem } from '../types';
|
||||
@@ -154,6 +154,12 @@ export const useDriveItem = (id: string) => {
|
||||
item?.item?.is_in_trash;
|
||||
const sharedWithMe = id == 'shared_with_me';
|
||||
|
||||
useEffect(() => {
|
||||
if (id) {
|
||||
refresh(id, true); // Re-fetch from backend and update Recoil state
|
||||
}
|
||||
}, [id, refresh]);
|
||||
|
||||
return {
|
||||
sharedWithMe,
|
||||
inTrash,
|
||||
|
||||
@@ -341,8 +341,6 @@ export default memo(
|
||||
companyId,
|
||||
parentId,
|
||||
});
|
||||
await new Promise (resolve => setTimeout(resolve, 1000));
|
||||
refresh(parentId);
|
||||
}}
|
||||
onDragOver={handleDragOver}
|
||||
onDrop={handleDrop}
|
||||
|
||||
Reference in New Issue
Block a user