"use client"; import { useRef, useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Send, Loader2, Sparkles, User, Bot, Check, X, GitMerge, Code, FileEdit, Eye } from "lucide-react"; import { ChatMessage } from "@/services/gemini"; import { DiffResult, generateDiffSummary } from "@/services/diffPatch"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; interface ChangeProposal { filename: string; diff: DiffResult; } interface ChatInterfaceProps { prompt: string; setPrompt: (prompt: string) => void; messages: ChatMessage[]; isLoading: boolean; onSubmit: (e: React.FormEvent) => void; pendingModification: { changes: ChangeProposal[] } | null; onAccept: () => void; onReject: () => void; onReview: (diff: DiffResult) => void; selectedElement: { tagName: string; description: string } | null; onClearSelectedElement: () => void; } const loadingMessages = [ "Thinking...", "Warming up the AI...", "Analyzing your request...", "Consulting with the code spirits...", "Brewing a fresh batch of code...", "Thinking more deeply...", "Structuring the layout...", "Compiling pixels...", "Almost done...", "Putting on the finishing touches..." ]; const ChatInterface = ({ prompt, setPrompt, messages, isLoading, onSubmit, pendingModification, onAccept, onReject, onReview, selectedElement, onClearSelectedElement, }: ChatInterfaceProps) => { const chatContainerRef = useRef(null); const [loadingMessage, setLoadingMessage] = useState(loadingMessages[0]); useEffect(() => { if (chatContainerRef.current) { chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight; } }, [messages, isLoading, pendingModification]); useEffect(() => { let intervalId: NodeJS.Timeout; if (isLoading) { let messageIndex = 0; setLoadingMessage(loadingMessages[0]); intervalId = setInterval(() => { messageIndex = (messageIndex + 1) % loadingMessages.length; setLoadingMessage(loadingMessages[messageIndex]); }, 3500); } return () => { if (intervalId) { clearInterval(intervalId); } }; }, [isLoading]); const handleFormSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!prompt.trim() || isLoading) return; onSubmit(e); // Clear the prompt after submission setPrompt(""); }; const renderMessage = (message: ChatMessage, index: number) => (
{message.role === "user" ? : } {message.role === "user" ? "You" : "Assistant"}
{message.content}
); return (
{messages.length === 0 && !isLoading && (

Describe your website prototype

Example: "Create a landing page and an about page..."

)} {messages.map(renderMessage)} {pendingModification && (

Code Modification Proposed

Review the changes below.

{pendingModification.changes.map((change, index) => { const summary = generateDiffSummary(change.diff); return (

{change.filename}

+{summary.added}, -{summary.removed} lines

); })}
)} {isLoading && (
{loadingMessage}
)}
{selectedElement && (

{selectedElement.tagName}

{selectedElement.description}

)}