Primeiro Commit

This commit is contained in:
luisfepsale
2025-10-22 12:52:23 -03:00
parent 27820254e7
commit 235fb538e1
19 changed files with 2132 additions and 426 deletions
+44 -9
View File
@@ -3,6 +3,7 @@ import { Button } from "@/components/ui/button";
import { Textarea } from "@/components/ui/textarea";
import { useState, useRef, useEffect } from "react";
import { useToast } from "@/hooks/use-toast";
import { chatService } from "@/services/chat";
interface ChatInputProps {
onSendMessage: (message: string, files?: File[]) => void;
@@ -67,21 +68,54 @@ export const ChatInput = ({ onSendMessage }: ChatInputProps) => {
const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {
const files = Array.from(e.target.files || []);
// Validate file size (max 10MB per file)
const validFiles = files.filter((file) => {
const newFiles = [...attachedFiles, ...files];
// Valida quantidade máxima de anexos (5)
if (newFiles.length > chatService.getMaxAttachments()) {
toast({
title: "Limite de anexos excedido",
description: `Você pode anexar no máximo ${chatService.getMaxAttachments()} arquivos por mensagem.`,
variant: "destructive",
});
if (fileInputRef.current) {
fileInputRef.current.value = "";
}
return;
}
// Valida tipos de arquivo e tamanho
const validFiles: File[] = [];
for (const file of files) {
// Valida tamanho (max 10MB por arquivo)
if (file.size > 10 * 1024 * 1024) {
toast({
title: "Arquivo muito grande",
description: `${file.name} excede o limite de 10MB`,
variant: "destructive",
});
return false;
continue;
}
return true;
});
setAttachedFiles([...attachedFiles, ...validFiles]);
validFiles.push(file);
}
// Valida formatos permitidos
const allFiles = [...attachedFiles, ...validFiles];
const validation = chatService.validateAttachments(allFiles);
if (!validation.valid) {
toast({
title: "Formato de arquivo não permitido",
description: validation.error,
variant: "destructive",
});
if (fileInputRef.current) {
fileInputRef.current.value = "";
}
return;
}
setAttachedFiles(allFiles);
if (fileInputRef.current) {
fileInputRef.current.value = "";
}
@@ -156,7 +190,8 @@ export const ChatInput = ({ onSendMessage }: ChatInputProps) => {
multiple
className="hidden"
onChange={handleFileSelect}
accept=".pdf,.txt,.doc,.docx,.xls,.xlsx,.csv,.png,.jpg,.jpeg,.gif,.webp"
accept={chatService.getAllowedFileExtensions()}
title={`Formatos aceitos: ${chatService.getAllowedFileTypesLabel()}`}
/>
<Button
variant="outline"
@@ -179,7 +214,7 @@ export const ChatInput = ({ onSendMessage }: ChatInputProps) => {
</div>
<p className="hidden md:block text-xs text-muted-foreground text-center">
Pressione Enter para enviar, Shift + Enter para nova linha Máx. 10MB por arquivo
Pressione Enter para enviar, Shift + Enter para nova linha Máx. {chatService.getMaxAttachments()} anexos Formatos: {chatService.getAllowedFileTypesLabel()}
</p>
</div>
</div>