+ {#each groups as group (group.key)}
+
+ {/each}
+
{/if}
+
+
diff --git a/src/lib/helpers/files.ts b/src/lib/helpers/files.ts
index de236f5f28..1efd2319ef 100644
--- a/src/lib/helpers/files.ts
+++ b/src/lib/helpers/files.ts
@@ -80,6 +80,25 @@ export async function gzipUpload(files: FileList) {
return uploadFile;
}
+export function getInvalidDeploymentArchiveReason(
+ files: FileList | File[] | null | undefined,
+ maxSize?: number
+) {
+ if (!files) return null;
+
+ const normalizedFiles = Array.from(files);
+
+ if (!normalizedFiles.length) return null;
+ if (maxSize !== undefined && normalizedFiles.some((file) => file.size > maxSize)) {
+ return InvalidFileType.SIZE;
+ }
+ if (normalizedFiles.some((file) => !file.name.toLowerCase().endsWith('.tar.gz'))) {
+ return InvalidFileType.EXTENSION;
+ }
+
+ return null;
+}
+
export function removeFile(file: File, files: FileList) {
const filteredFiles = Array.from(files).filter((f) => f.name !== file.name);
const dataTransfer = new DataTransfer();
diff --git a/src/lib/stores/uploader.ts b/src/lib/stores/uploader.ts
index 97f475f992..9640326ff5 100644
--- a/src/lib/stores/uploader.ts
+++ b/src/lib/stores/uploader.ts
@@ -1,21 +1,39 @@
+import { page } from '$app/state';
+import { getApiEndpoint } from '$lib/stores/sdk';
import { Client, Functions, ID, type Models, Sites, Storage } from '@appwrite.io/console';
import { writable } from 'svelte/store';
-import { getApiEndpoint } from '$lib/stores/sdk';
-import { page } from '$app/state';
-type UploaderFile = {
+export type UploadKind = 'storage' | 'site-deployment' | 'function-deployment';
+export type UploadGroupKey = 'storage' | 'deployments';
+
+export type UploaderFile = {
$id: string;
+ clientId: string;
resourceId: string;
name: string;
progress: number;
size: number;
status: 'failed' | 'pending' | 'success';
+ kind: UploadKind;
error?: string;
};
+
+export type UploadGroupState = {
+ isOpen: boolean;
+ isVisible: boolean;
+};
+
+type UploadGroups = Record