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