diff --git a/Chat/components/ChatInput.tsx b/Chat/components/ChatInput.tsx index 2a1de198..b785ff4f 100644 --- a/Chat/components/ChatInput.tsx +++ b/Chat/components/ChatInput.tsx @@ -127,40 +127,57 @@ export const ChatInput: React.FC = ({ }, [input]); const attachFiles = async (files: FileList | File[]) => { - const newAttachments: Attachment[] = []; + const fileArray = Array.from(files); const errors: string[] = []; - for (const file of Array.from(files)) { - const validation = validateFileForUpload(file); - if (!validation.isValid) { - errors.push(`${file.name}: ${validation.error}`); - continue; - } - try { - const result = await processFile(file); - logFileProcessing(result); - if (result.success) { - const previewUrl = result.imageData || result.text || result.base64 || ''; - newAttachments.push({ - id: uuidv4(), - file, - previewUrl, - type: result.type, - name: result.name, - size: result.size - }); - } else { - errors.push(`${file.name}: ${result.error}`); + + const processingResults = await Promise.all( + fileArray.map(async (file) => { + const validation = validateFileForUpload(file); + if (!validation.isValid) { + return { success: false, error: validation.error, fileName: file.name }; + } + + try { + const result = await processFile(file); + logFileProcessing(result); + if (result.success) { + const previewUrl = result.imageData || result.text || result.base64 || ''; + return { + success: true, + attachment: { + id: uuidv4(), + file, + previewUrl, + type: result.type, + name: result.name, + size: result.size + } + }; + } else { + return { success: false, error: result.error, fileName: file.name }; + } + } catch { + return { success: false, error: 'Failed to process file', fileName: file.name }; } - } catch { - errors.push(`${file.name}: Failed to process file`); + }) + ); + + const newAttachments: Attachment[] = []; + processingResults.forEach((res) => { + if (res.success && res.attachment) { + newAttachments.push(res.attachment); + } else if (!res.success) { + errors.push(`${res.fileName}: ${res.error}`); } - } + }); + if (errors.length > 0) { setFileErrors(errors); errors.forEach(error => addToast(error, 'error')); } else { setFileErrors([]); } + if (newAttachments.length > 0) { setAttachments(prev => [...prev, ...newAttachments]); addToast(t('chat_input.toast_attached', { count: newAttachments.length }), 'success'); diff --git a/Chat/services/fileService.ts b/Chat/services/fileService.ts index e3d36aa9..e5b033ac 100644 --- a/Chat/services/fileService.ts +++ b/Chat/services/fileService.ts @@ -257,14 +257,7 @@ export const processFile = async (file: File): Promise => { // Múltiplos arquivos export const processMultipleFiles = async (files: File[]): Promise => { - const results: FileUploadResult[] = []; - - for (const file of files) { - const result = await processFile(file); - results.push(result); - } - - return results; + return Promise.all(files.map(file => processFile(file))); }; // Validar arquivo antes do upload diff --git a/benchmark.js b/benchmark.js new file mode 100644 index 00000000..10430ee1 --- /dev/null +++ b/benchmark.js @@ -0,0 +1,44 @@ + +const mockProcessFile = async (file) => { + // Simulate file processing delay (e.g., reading, resizing, etc.) + await new Promise(resolve => setTimeout(resolve, 100)); + return { success: true, name: file.name }; +}; + +const sequentialProcess = async (files) => { + const results = []; + for (const file of files) { + const result = await mockProcessFile(file); + results.push(result); + } + return results; +}; + +const parallelProcess = async (files) => { + return await Promise.all(files.map(file => mockProcessFile(file))); +}; + +const runBenchmark = async () => { + const dummyFiles = Array.from({ length: 10 }, (_, i) => ({ name: `file${i}.png` })); + + console.log(`🚀 Starting benchmark with ${dummyFiles.length} files...`); + + // Sequential + const startSeq = Date.now(); + await sequentialProcess(dummyFiles); + const endSeq = Date.now(); + const seqTime = endSeq - startSeq; + console.log(`⏱️ Sequential processing: ${seqTime}ms`); + + // Parallel + const startPar = Date.now(); + await parallelProcess(dummyFiles); + const endPar = Date.now(); + const parTime = endPar - startPar; + console.log(`⏱️ Parallel processing: ${parTime}ms`); + + const improvement = ((seqTime - parTime) / seqTime * 100).toFixed(2); + console.log(`✅ Improvement: ${improvement}% faster`); +}; + +runBenchmark();