diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 0c05a82..f6a4b49 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -37,7 +37,29 @@ const Index = () => { return; } + // Pré-validação rápida (tamanho) antes de ler o arquivo inteiro na memória + const sizeCheck = validateModelFile(file.name, file.size, ext); + if (!sizeCheck.ok) { + toast.error(sizeCheck.reason!); + return; + } + if (ext === 'glb') { + // Para GLB, valida a assinatura antes de criar o objectURL + try { + const head = await file.slice(0, 16).arrayBuffer(); + const headBuf = new ArrayBuffer(file.size); + // Para validar assinatura precisamos só do header — slice já basta + const sigCheck = validateModelFile(file.name, file.size, ext, head); + if (!sigCheck.ok) { + toast.error(sigCheck.reason!); + if (sigCheck.detail) console.warn('[validateModelFile]', sigCheck.detail); + return; + } + void headBuf; + } catch (err) { + console.error('[upload] header read failed', err); + } const url = URL.createObjectURL(file); addModel({ fileName: file.name, fileSize: file.size, url }); toast.success(`Modelo "${file.name}" carregado com sucesso!`); @@ -48,6 +70,12 @@ const Index = () => { setConverting(true); try { const buffer = await file.arrayBuffer(); + const sigCheck = validateModelFile(file.name, file.size, ext, buffer); + if (!sigCheck.ok) { + toast.error(sigCheck.reason!); + if (sigCheck.detail) console.warn('[validateModelFile]', sigCheck.detail); + return; + } let result; if (ext === 'ifc') { result = await convertIFCtoGLB(buffer, file.name); @@ -58,8 +86,9 @@ const Index = () => { addModel({ fileName: result.fileName, fileSize: result.fileSize, url }); toast.success(`"${file.name}" convertido para GLB e carregado!`); } catch (err) { - console.error(err); - toast.error(`Falha ao converter "${file.name}"`); + console.error('[upload] conversion failed', err); + const msg = err instanceof Error ? err.message : 'erro desconhecido'; + toast.error(`Falha ao converter "${file.name}": ${msg}`); } finally { setConverting(false); }