diff --git a/apps/web/src/lib/components/FileUpload.svelte b/apps/web/src/lib/components/FileUpload.svelte index f02260a..33c8fac 100644 --- a/apps/web/src/lib/components/FileUpload.svelte +++ b/apps/web/src/lib/components/FileUpload.svelte @@ -32,7 +32,7 @@ const client = useConvexClient(); - let fileInput: HTMLInputElement; + let fileInput: HTMLInputElement | null = null; let uploading = $state(false); let error = $state(null); let fileName = $state(""); @@ -50,31 +50,52 @@ // Buscar URL do arquivo quando houver um storageId $effect(() => { - if (value && !fileName) { - // Tem storageId mas não é um upload recente - loadExistingFile(value); + if (!value || fileName) { + return; } + + let cancelled = false; + const storageId = value; + + (async () => { + try { + const url = await client.storage.getUrl(storageId as any); + if (!url || cancelled) { + return; + } + + fileUrl = url; + + const path = url.split('?')[0] ?? ''; + const nameFromUrl = path.split('/').pop() ?? 'arquivo'; + fileName = decodeURIComponent(nameFromUrl); + + const extension = fileName.toLowerCase().split('.').pop(); + const isPdf = + extension === 'pdf' || url.includes('.pdf') || url.includes('application/pdf'); + + if (isPdf) { + fileType = 'application/pdf'; + previewUrl = null; + } else { + fileType = 'image/jpeg'; + previewUrl = url; + } + } catch (err) { + if (!cancelled) { + console.error('Erro ao carregar arquivo existente:', err); + } + } + })(); + + return () => { + cancelled = true; + }; }); - async function loadExistingFile(storageId: string) { - try { - const url = await client.storage.getUrl(storageId as any); - if (url) { async function handleFileSelect(event: Event) { const target = event.target as HTMLInputElement; const file = target.files?.[0]; - // Detectar tipo pelo URL ou assumir PDF - if (url.includes('.pdf') || url.includes('application/pdf')) { - fileType = 'application/pdf'; - } else { - fileType = 'image/jpeg'; - previewUrl = url; // Para imagens, a URL serve como preview - } - } - } catch (err) { - console.error('Erro ao carregar arquivo existente:', err); - } - } error = null; @@ -144,6 +165,17 @@ function openFileDialog() { fileInput?.click(); } + + function setFileInput(node: HTMLInputElement) { + fileInput = node; + return { + destroy() { + if (fileInput === node) { + fileInput = null; + } + }, + }; + }
@@ -175,7 +207,7 @@ {:else}
- +
{/if}
diff --git a/apps/web/src/routes/(dashboard)/licitacoes/+page.svelte b/apps/web/src/routes/(dashboard)/licitacoes/+page.svelte index 65b2844..5e7ad18 100644 --- a/apps/web/src/routes/(dashboard)/licitacoes/+page.svelte +++ b/apps/web/src/routes/(dashboard)/licitacoes/+page.svelte @@ -1,5 +1,5 @@ @@ -30,7 +30,7 @@
- +

Módulo em Desenvolvimento

@@ -76,7 +76,7 @@

- +

Documentação

diff --git a/apps/web/src/routes/(dashboard)/perfil/+page.svelte b/apps/web/src/routes/(dashboard)/perfil/+page.svelte index 5a40e31..fa7e589 100644 --- a/apps/web/src/routes/(dashboard)/perfil/+page.svelte +++ b/apps/web/src/routes/(dashboard)/perfil/+page.svelte @@ -1,18 +1,27 @@