Integração com o banco de dados

This commit is contained in:
luisfepsale
2025-10-23 23:27:28 -03:00
parent 8a9096470f
commit a85465e332
9 changed files with 1909 additions and 670 deletions
+90 -47
View File
@@ -4,7 +4,7 @@ import { ChatMessage } from "./ChatMessage";
import { ChatInput } from "./ChatInput";
import { ChatSidebar } from "./ChatSidebar";
import { ScrollArea } from "@/components/ui/scroll-area";
import { chatService, StoredChat } from "@/services/chat";
import { chatService, ChatRecord, MessageRecord } from "@/services/chat";
import { useToast } from "@/hooks/use-toast";
import { getModelId } from "@/config/models";
@@ -38,40 +38,38 @@ export const ChatView = () => {
const [isLoading, setIsLoading] = useState(false);
// Salva o chat no localStorage sempre que as mensagens mudam
useEffect(() => {
if (messages.length > 1) { // Salva apenas se houver mensagens além da inicial
saveCurrentChat();
// Dispara evento customizado para a sidebar recarregar
window.dispatchEvent(new Event('chatUpdated'));
}
}, [messages]);
// NOTA: Salvamento automático desabilitado - mensagens já são salvas na API
// quando enviadas via handleSendMessage
// useEffect(() => {
// if (messages.length > 1) {
// saveCurrentChat();
// window.dispatchEvent(new Event('chatUpdated'));
// }
// }, [messages]);
// Função para salvar o chat atual
const saveCurrentChat = () => {
try {
const chatTitle = chatService.generateChatTitle(
messages.find(m => m.role === 'user')?.content || 'Nova Conversa'
);
const storedChat: StoredChat = {
id: currentChatId,
title: chatTitle,
createdAt: new Date(),
updatedAt: new Date(),
model: selectedModel,
systemPrompt: systemPrompt,
messages: messages.map(msg => ({
...msg,
timestamp: new Date(),
})),
};
chatService.saveChat(storedChat);
} catch (error) {
console.error('Erro ao salvar chat:', error);
}
};
// NOTA: Função de salvamento localStorage desabilitada - migrado para banco de dados
// const saveCurrentChat = () => {
// try {
// const chatTitle = chatService.generateChatTitle(
// messages.find(m => m.role === 'user')?.content || 'Nova Conversa'
// );
// const storedChat: StoredChat = {
// id: currentChatId,
// title: chatTitle,
// createdAt: new Date(),
// updatedAt: new Date(),
// model: selectedModel,
// systemPrompt: systemPrompt,
// messages: messages.map(msg => ({
// ...msg,
// timestamp: new Date(),
// })),
// };
// chatService.saveChat(storedChat);
// } catch (error) {
// console.error('Erro ao salvar chat:', error);
// }
// };
const handleNewChat = () => {
// Reseta para "0" - novo chat sempre começa com chat_id "0"
@@ -89,22 +87,56 @@ export const ChatView = () => {
window.dispatchEvent(new Event('chatUpdated'));
};
const handleLoadChat = (chat: StoredChat) => {
// Carrega um chat existente do histórico
const handleLoadChat = async (chat: ChatRecord) => {
// Carrega um chat existente do banco de dados
setCurrentChatId(chat.id);
setSelectedModel(chat.model);
setSystemPrompt(chat.systemPrompt);
// Converte mensagens do StoredChat para Message
const loadedMessages: Message[] = chat.messages.map(msg => ({
id: msg.id,
role: msg.role,
content: msg.content,
model: msg.model,
attachments: msg.attachments,
}));
// Limpa mensagens enquanto carrega
setMessages([]);
setIsLoading(true);
setMessages(loadedMessages);
try {
// Busca mensagens do chat na API
const messagesFromAPI = await chatService.getChatMessages(chat.id);
console.log('Mensagens carregadas da API:', messagesFromAPI);
// Converte MessageRecord para Message
const loadedMessages: Message[] = messagesFromAPI.map((msg: MessageRecord) => ({
id: msg.id,
role: msg.role,
content: msg.content,
model: undefined, // model_id vem como número, não temos mapeamento reverso
attachments: msg.has_attachments ? [] : undefined, // Não temos detalhes dos anexos no GET
}));
setMessages(loadedMessages);
toast({
title: "Chat carregado",
description: `${loadedMessages.length} mensagens carregadas.`,
});
} catch (error: any) {
console.error('Erro ao carregar mensagens:', error);
toast({
title: "Erro ao carregar chat",
description: error.message || "Não foi possível carregar as mensagens.",
variant: "destructive",
});
// Inicia com mensagem padrão em caso de erro
setMessages([
{
id: "1",
role: "assistant",
content: "Olá! Sou o assistente HGTX Codex. Como posso ajudá-lo hoje?",
model: selectedModel,
},
]);
} finally {
setIsLoading(false);
}
};
const handleSendMessage = async (content: string, files?: File[]) => {
@@ -142,7 +174,18 @@ export const ChatView = () => {
// Isso mantém o contexto da conversa para as próximas mensagens
if (response.chat_id && response.chat_id !== currentChatId) {
console.log(`Chat ID atualizado: ${currentChatId}${response.chat_id}`);
// Se estava com chat_id "0", significa que é a primeira mensagem
// e o chat acabou de ser criado no backend
const isFirstMessage = currentChatId === "0";
setCurrentChatId(response.chat_id);
// Dispara evento para ChatSidebar recarregar e mostrar o novo chat
if (isFirstMessage) {
console.log('Primeira mensagem - novo chat criado, atualizando sidebar');
window.dispatchEvent(new Event('chatUpdated'));
}
}
const aiResponse: Message = {