import React, { useState, useRef, useEffect } from "react"; import { trpc } from "@/lib/trpc"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Badge } from "@/components/ui/badge"; import { Copy, Download, Send, Bot, User, Loader2 } from "lucide-react"; import { toast } from "sonner"; interface Message { id: string; role: "user" | "assistant"; content: string; timestamp: string; mode?: string; } export default function ChatInterface() { const [messages, setMessages] = useState([]); const [input, setInput] = useState(""); const [mode, setMode] = useState("auto"); const [contentType, setContentType] = useState("code"); const [isLoading, setIsLoading] = useState(false); const messagesEndRef = useRef(null); const sendMutation = trpc.chat.sendMessage.useMutation({ onSuccess: (data) => { setMessages((prev) => [ ...prev, { id: Date.now().toString(), role: "assistant", content: data.content, timestamp: new Date().toLocaleTimeString(), mode: data.mode, }, ]); setIsLoading(false); }, onError: (error) => { toast.error("Failed to send message: " + error.message); setIsLoading(false); }, }); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }; useEffect(() => { scrollToBottom(); }, [messages]); const handleSend = async () => { if (!input.trim()) return; const userMessage: Message = { id: Date.now().toString(), role: "user", content: input, timestamp: new Date().toLocaleTimeString(), }; setMessages((prev) => [...prev, userMessage]); setInput(""); setIsLoading(true); await sendMutation.mutateAsync({ message: input, mode: mode as any, contentType: contentType as any, }); }; const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); toast.success("Copied to clipboard!"); }; return (
{/* Header */}

AI Code Generator & Evaluator

{/* Chat Area */}
{/* Messages */} {messages.length === 0 ? (

Start a conversation with the AI

) : ( messages.map((msg) => (
{msg.role === "assistant" && (
)}

{msg.content}

{msg.role === "assistant" && (
)}
{msg.role === "user" && (
)}
)) )} {isLoading && (

Processing...

)}
{/* Input Area */}