Skip to content

Commit b06e45f

Browse files
committed
fix: mark failed uploads in store, surface errors, validate extensions on drop
- uploadFile now catches errors and sets status to 'failed' with error message - Both create page and drag-drop check uploadFiles results for failures and show error notifications - Drag-drop validates file extensions against bucket allowedFileExtensions before uploading, rejecting disallowed files with a notification
1 parent b9334ab commit b06e45f

3 files changed

Lines changed: 62 additions & 20 deletions

File tree

src/lib/stores/uploader.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,22 +82,29 @@ const createUploader = () => {
8282
n.files.unshift(newFile);
8383
return n;
8484
});
85-
const uploadedFile = await temporaryStorage(region, projectId).createFile({
86-
bucketId,
87-
fileId: id ?? ID.unique(),
88-
file,
89-
permissions,
90-
onProgress: (progress) => {
91-
newFile.$id = progress.$id;
92-
newFile.progress = progress.progress;
93-
newFile.status = progress.progress === 100 ? 'success' : 'pending';
94-
updateFile(progress.$id, newFile);
95-
}
96-
});
97-
newFile.$id = uploadedFile.$id;
98-
newFile.progress = 100;
99-
newFile.status = 'success';
100-
updateFile(newFile.$id, newFile);
85+
try {
86+
const uploadedFile = await temporaryStorage(region, projectId).createFile({
87+
bucketId,
88+
fileId: id ?? ID.unique(),
89+
file,
90+
permissions,
91+
onProgress: (progress) => {
92+
newFile.$id = progress.$id;
93+
newFile.progress = progress.progress;
94+
newFile.status = progress.progress === 100 ? 'success' : 'pending';
95+
updateFile(progress.$id, newFile);
96+
}
97+
});
98+
newFile.$id = uploadedFile.$id;
99+
newFile.progress = 100;
100+
newFile.status = 'success';
101+
updateFile(newFile.$id, newFile);
102+
} catch (e) {
103+
newFile.status = 'failed';
104+
newFile.error = e?.message ?? 'Upload failed';
105+
updateFile(newFile.$id, newFile);
106+
throw e;
107+
}
101108
};
102109

103110
const uploadFiles = async (

src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,28 +105,56 @@
105105
isDragging = false;
106106
if (!event.dataTransfer?.files?.length) return;
107107
108+
const allowedExtensions: string[] = data.bucket.allowedFileExtensions ?? [];
108109
const droppedFiles = Array.from(event.dataTransfer.files);
109-
const count = droppedFiles.length;
110110
111+
const validFiles: File[] = [];
112+
const rejectedFiles: File[] = [];
113+
for (const file of droppedFiles) {
114+
const ext = file.name.split('.').pop()?.toLowerCase();
115+
if (allowedExtensions.length && (!ext || !allowedExtensions.includes(ext))) {
116+
rejectedFiles.push(file);
117+
} else {
118+
validFiles.push(file);
119+
}
120+
}
121+
122+
if (rejectedFiles.length) {
123+
addNotification({
124+
type: 'error',
125+
message: `${rejectedFiles.length} file(s) rejected — only ${allowedExtensions.join(', ')} allowed`
126+
});
127+
}
128+
129+
if (!validFiles.length) return;
130+
131+
const count = validFiles.length;
111132
addNotification({
112133
type: 'success',
113134
message: count === 1 ? 'File upload in progress' : `${count} file uploads in progress`
114135
});
115136
116137
trackEvent(Submit.FileCreate, { customId: false });
117138
118-
const filesToUpload = droppedFiles.map((file) => ({
139+
const filesToUpload = validFiles.map((file) => ({
119140
id: ID.unique(),
120141
file
121142
}));
122143
123-
await uploader.uploadFiles(
144+
const results = await uploader.uploadFiles(
124145
page.params.region,
125146
page.params.project,
126147
page.params.bucket,
127148
filesToUpload,
128149
[]
129150
);
151+
const failures = results.filter((r) => r.status === 'rejected');
152+
if (failures.length) {
153+
addNotification({
154+
type: 'error',
155+
message: `${failures.length} file(s) failed to upload`
156+
});
157+
}
130158
invalidate(Dependencies.FILES);
131159
}
132160

src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/create/+page.svelte

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,14 @@
6969
trackEvent(Submit.FileCreate, {
7070
customId: !!id
7171
});
72-
await promise;
72+
const results = await promise;
73+
const failures = results.filter((r) => r.status === 'rejected');
74+
if (failures.length) {
75+
addNotification({
76+
type: 'error',
77+
message: `${failures.length} file(s) failed to upload`
78+
});
79+
}
7380
invalidate(Dependencies.FILES);
7481
} catch (e) {
7582
addNotification({

0 commit comments

Comments
 (0)