Skip to content

Commit 132e615

Browse files
committed
fix upload file remove issue and improve duplicate file name validation
1 parent 2f14831 commit 132e615

File tree

5 files changed

+82
-16
lines changed

5 files changed

+82
-16
lines changed

frontend/src/App.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { renameAPI } from "./api/renameAPI";
55
import { deleteAPI } from "./api/deleteAPI";
66
import { copyItemAPI, moveItemAPI } from "./api/fileTransferAPI";
77
import { getAllFilesAPI } from "./api/getAllFilesAPI";
8-
import "./App.scss";
98
import { downloadFile } from "./api/downloadFileAPI";
9+
import "./App.scss";
1010

1111
function App() {
1212
const fileUploadConfig = {
@@ -107,8 +107,8 @@ function App() {
107107
console.log(`Opening file: ${file.name}`);
108108
};
109109

110-
const handleError = (error) => {
111-
console.error(error.message);
110+
const handleError = (error, file) => {
111+
console.error(error);
112112
};
113113

114114
const handleDownload = async (file) => {

frontend/src/FileManager/Actions/UploadFile/UploadFile.action.jsx

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import ReactLoading from "react-loading";
66
import { useFileNavigation } from "../../../contexts/FileNavigationContext";
77
import { getFileExtension } from "../../../utils/getFileExtension";
88
import { getDataSize } from "../../../utils/getDataSize";
9+
import { useFiles } from "../../../contexts/FilesContext";
910
import "./UploadFile.action.scss";
1011

1112
const UploadFileAction = ({
@@ -19,13 +20,14 @@ const UploadFileAction = ({
1920
const [isDragging, setIsDragging] = useState(false);
2021
const [isUploading, setIsUploading] = useState({});
2122
const { currentFolder, currentPathFiles } = useFileNavigation();
23+
const { onError } = useFiles();
2224

2325
const checkFileError = (file) => {
2426
const extError = !acceptedFileTypes.includes(getFileExtension(file.name));
2527
if (extError) return "File type is not allowed.";
2628

2729
const fileExists = currentPathFiles.some(
28-
(item) => item.name === file.name && !item.isDirectory
30+
(item) => item.name.toLowerCase() === file.name.toLowerCase() && !item.isDirectory
2931
);
3032
if (fileExists) return "File already exists.";
3133

@@ -35,13 +37,15 @@ const UploadFileAction = ({
3537

3638
const setSelectedFiles = (selectedFiles) => {
3739
selectedFiles = selectedFiles.filter(
38-
(item) => !files.some((fileData) => fileData.file.name === item.name)
40+
(item) =>
41+
!files.some((fileData) => fileData.file.name.toLowerCase() === item.name.toLowerCase())
3942
);
4043

4144
if (selectedFiles.length > 0) {
4245
const newFiles = selectedFiles.map((file) => {
4346
const appendData = onFileUploading(file, currentFolder);
4447
const error = checkFileError(file);
48+
error && onError({ type: "upload", message: error }, file);
4549
return {
4650
file: file,
4751
appendData: appendData,
@@ -65,12 +69,18 @@ const UploadFileAction = ({
6569
setSelectedFiles(choosenFiles);
6670
};
6771

68-
// Issue: If a file is removed from the array and there are more files after it,
69-
// e.g. files = [file1, file2, file3] & file2 was removed because it was unsupported,
70-
// and file3 was successfully uploaded.
71-
// Removing file2 resests the states incl. upload progress as it is now shifted to index 1.
7272
const handleFileRemove = (index) => {
73-
setFiles((prev) => prev.filter((_, i) => i !== index));
73+
setFiles((prev) =>
74+
prev.map((file, i) => {
75+
if (index === i) {
76+
return {
77+
...file,
78+
removed: true,
79+
};
80+
}
81+
return file;
82+
})
83+
);
7484
};
7585

7686
return (
@@ -120,6 +130,7 @@ const UploadFileAction = ({
120130
index={index}
121131
key={index}
122132
fileData={fileData}
133+
setFiles={setFiles}
123134
fileUploadConfig={fileUploadConfig}
124135
setIsUploading={setIsUploading}
125136
onFileUploaded={onFileUploaded}

frontend/src/FileManager/Actions/UploadFile/UploadItem.jsx

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import { useEffect, useRef, useState } from "react";
77
import { getDataSize } from "../../../utils/getDataSize";
88
import { FaRegCheckCircle } from "react-icons/fa";
99
import { IoMdRefresh } from "react-icons/io";
10+
import { useFiles } from "../../../contexts/FilesContext";
1011

1112
const UploadItem = ({
1213
index,
1314
fileData,
15+
setFiles,
1416
setIsUploading,
1517
fileUploadConfig,
1618
onFileUploaded,
@@ -19,8 +21,39 @@ const UploadItem = ({
1921
const [uploadProgress, setUploadProgress] = useState(0);
2022
const [isUploaded, setIsUploaded] = useState(false);
2123
const [isCanceled, setIsCanceled] = useState(false);
24+
const [uploadFailed, setUploadFailed] = useState(false);
2225
const fileIcons = useFileIcons(33);
2326
const xhrRef = useRef();
27+
const { onError } = useFiles();
28+
29+
const handleUploadError = (xhr) => {
30+
setUploadProgress(0);
31+
const error = {
32+
type: "upload",
33+
message: "Upload failed.",
34+
response: {
35+
status: xhr.status,
36+
statusText: xhr.statusText,
37+
data: xhr.response,
38+
},
39+
};
40+
41+
setFiles((prev) =>
42+
prev.map((file, i) => {
43+
if (index === i) {
44+
return {
45+
...file,
46+
error: error.message,
47+
};
48+
}
49+
return file;
50+
})
51+
);
52+
53+
setUploadFailed(true);
54+
55+
onError(error, fileData.file);
56+
};
2457

2558
const fileUpload = (fileData) => {
2659
if (!!fileData.error) return;
@@ -51,10 +84,14 @@ const UploadItem = ({
5184
resolve(xhr.response);
5285
} else {
5386
reject(xhr.statusText);
87+
handleUploadError(xhr);
5488
}
5589
};
5690

57-
xhr.onerror = () => reject(xhr.statusText);
91+
xhr.onerror = () => {
92+
reject(xhr.statusText);
93+
handleUploadError(xhr);
94+
};
5895

5996
xhr.open("POST", fileUploadConfig?.url, true);
6097
const headers = fileUploadConfig?.headers;
@@ -94,11 +131,29 @@ const UploadItem = ({
94131

95132
const handleRetry = () => {
96133
if (fileData?.file) {
97-
fileUpload(fileData);
134+
setFiles((prev) =>
135+
prev.map((file, i) => {
136+
if (index === i) {
137+
return {
138+
...file,
139+
error: false,
140+
};
141+
}
142+
return file;
143+
})
144+
);
145+
fileUpload({ ...fileData, error: false });
98146
setIsCanceled(false);
147+
setUploadFailed(false);
99148
}
100149
};
101150

151+
// File was removed by the user beacuse it was unsupported or exceeds file size limit.
152+
if (!!fileData.removed) {
153+
return null;
154+
}
155+
//
156+
102157
return (
103158
<li>
104159
<div className="file-icon">
@@ -114,7 +169,7 @@ const UploadItem = ({
114169
</div>
115170
{isUploaded ? (
116171
<FaRegCheckCircle color="#5c5bb1" title="Uploaded" />
117-
) : isCanceled ? (
172+
) : isCanceled || uploadFailed ? (
118173
<IoMdRefresh className="retry-upload" title="Retry" onClick={handleRetry} />
119174
) : (
120175
<div

frontend/src/FileManager/FileManager.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const FileManager = ({
4343
return (
4444
<main className="file-explorer" onContextMenu={(e) => e.preventDefault()}>
4545
<Loader isLoading={isLoading} />
46-
<FilesProvider filesData={files}>
46+
<FilesProvider filesData={files} onError={onError}>
4747
<FileNavigationProvider>
4848
<SelectionProvider>
4949
<ClipBoardProvider>

frontend/src/contexts/FilesContext.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { createContext, useContext, useEffect, useState } from "react";
22

33
const FilesContext = createContext();
44

5-
export const FilesProvider = ({ children, filesData }) => {
5+
export const FilesProvider = ({ children, filesData, onError }) => {
66
const [files, setFiles] = useState([]);
77

88
useEffect(() => {
@@ -16,7 +16,7 @@ export const FilesProvider = ({ children, filesData }) => {
1616
};
1717

1818
return (
19-
<FilesContext.Provider value={{ files, setFiles, getChildren }}>
19+
<FilesContext.Provider value={{ files, setFiles, getChildren, onError }}>
2020
{children}
2121
</FilesContext.Provider>
2222
);

0 commit comments

Comments
 (0)