From 825b4f449a196ca54260d724b4b48e2d3620f7a6 Mon Sep 17 00:00:00 2001 From: abnercosta97 Date: Fri, 21 Nov 2025 18:59:02 -0300 Subject: [PATCH] ajustes no layout do chatbot --- frontend/src/pages/guide/Guide.tsx | 175 ++++++++++++++++++----------- 1 file changed, 107 insertions(+), 68 deletions(-) diff --git a/frontend/src/pages/guide/Guide.tsx b/frontend/src/pages/guide/Guide.tsx index 737597e..35c9190 100644 --- a/frontend/src/pages/guide/Guide.tsx +++ b/frontend/src/pages/guide/Guide.tsx @@ -1,6 +1,7 @@ import { useState, useEffect, useRef } from "react"; import { Input } from "../../components/ui/input"; import { Button } from "../../components/ui/button"; +import { Send, Bot, Sparkles } from "lucide-react"; // Ícones para melhor UX const topics = [ "o que é cuidar", @@ -36,7 +37,7 @@ const topics = [ "exercícios de mobilização passiva", ]; -function getRandomSuggestions(num: number = 6): string[] { +function getRandomSuggestions(num: number = 5): string[] { const shuffled = [...topics].sort(() => 0.5 - Math.random()); return shuffled.slice(0, num); } @@ -45,7 +46,7 @@ export default function Guide() { const [messages, setMessages] = useState<{ text: string; isUser: boolean }[]>( [ { - text: 'Olá! Sou seu assistente virtual para tirar dúvidas sobre cuidados com idosos. Posso ajudar com informações baseadas no manual "Amar é Cuidar" da PUC Minas. Como posso ajudar você hoje?', + text: 'Olá! Sou seu assistente virtual D-Care. Tire suas dúvidas sobre cuidados com idosos baseadas no manual "Amar é Cuidar".', isUser: false, }, ] @@ -59,10 +60,6 @@ export default function Guide() { (import.meta.env.REACT_APP_CHATBOT_BACKEND_URL as string) || "http://localhost:8888/query"; - /* const backendUrl = - process.env.REACT_APP_CHATBOT_BACKEND_URL || - "http://chatbot_backend_dcare:8000/query"; */ - useEffect(() => { setSuggestions(getRandomSuggestions()); }, []); @@ -76,15 +73,16 @@ export default function Guide() { const sendMessage = async (question: string) => { if (!question.trim()) return; - setMessages((prev) => [...prev, { text: question, isUser: true }]); - setInput(""); + const currentInput = question; + setInput(""); // Limpa imediatamente para UX fluida + setMessages((prev) => [...prev, { text: currentInput, isUser: true }]); setIsTyping(true); try { const response = await fetch(backendUrl, { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ question, top_k: 3 }), + body: JSON.stringify({ question: currentInput, top_k: 3 }), }); if (!response.ok) throw new Error("Erro na resposta"); @@ -94,32 +92,42 @@ export default function Guide() { let botResponse = ""; results.forEach((res: any) => { - botResponse += `${res.topic} (${ + // Formatação mais limpa + botResponse += `
`; + botResponse += `

${ + res.topic + } (${ res.module || "Geral" - })

`; - botResponse += `${res.content}

`; + })

`; + botResponse += `

${res.content}

`; + if (res.confidence) { - botResponse += `Confiança: ${(res.confidence * 100).toFixed( - 2 - )}%
`; - } else if (res.score) { - botResponse += `Score: ${res.score.toFixed(2)}
`; + // Opcional: mostrar confiança apenas se for relevante para debug + // botResponse += `Confiança: ${(res.confidence * 100).toFixed(0)}%`; } - botResponse += `Fonte: Manual "Amar é Cuidar" - PUC Minas

`; + botResponse += `
`; }); + if (!botResponse) + botResponse = + "Desculpe, não encontrei informações relevantes para essa dúvida."; + else + botResponse += `
Fonte: Manual "Amar é Cuidar" - PUC Minas
`; + setMessages((prev) => [ ...prev, { - text: - botResponse || "Desculpe, não encontrei informações relevantes.", + text: botResponse, isUser: false, }, ]); } catch (error) { setMessages((prev) => [ ...prev, - { text: "Desculpe, ocorreu um erro. Tente novamente.", isUser: false }, + { + text: "Desculpe, ocorreu um erro de conexão. Tente novamente.", + isUser: false, + }, ]); } finally { setIsTyping(false); @@ -133,67 +141,98 @@ export default function Guide() { }; return ( -
-
-
- 👵🏻👴🏻 ChatBot D-Care -
- Baseado no manual "Amar é Cuidar" - PUC Minas + // Mudança 1: h-screen para mobile (h-[100dvh]) e bg ajustado +
+ {/* Container Principal: Removemos bordas arredondadas no mobile para parecer app nativo */} +
+ {/* HEADER: Mais compacto */} +
+
+ +
+
+

ChatBot D-Care

+

+ Assistente Virtual +

+ + {/* AREA DE MENSAGENS */}
{messages.map((msg, index) => (
- ))} -
- Digitando... -
-
-
- {suggestions.map((sug, index) => ( -
sendMessage(sug)} > - {sug} +
))} + + {isTyping && ( +
+
+
+
+
+ )}
-
- setInput(e.target.value)} - onKeyPress={handleKeyPress} - placeholder="Digite sua dúvida sobre cuidados com idosos..." - className="flex-1 p-3 border border-[#ccc] rounded-[25px] text-base outline-none mr-[10px]" - /> - -
-
- Baseado no manual "Amar é Cuidar" - PUC Minas Betim | Solução com - embeddings locais + + {/* SUGESTÕES E INPUT */} +
+ {/* SUGESTÕES: Scroll Horizontal (Carousel) para economizar altura */} + {suggestions.length > 0 && ( +
+
+ Dicas: +
+ {suggestions.map((sug, index) => ( + + ))} +
+ )} + + {/* INPUT AREA */} +
+ setInput(e.target.value)} + onKeyPress={handleKeyPress} + placeholder="Digite sua dúvida..." + className="flex-1 bg-gray-50 border-gray-200 rounded-full px-4 focus-visible:ring-[#2c6fb5] focus-visible:ring-1" + /> + +