import { useState } from "react"; import { Button } from "@/components/ui/button"; import Icon from "@/components/ui/icon"; import { useChatMutation, useSelectedOrganisation, useSelectedProject } from "@/lib/query/hooks"; import { parseError } from "@/lib/server"; import { IconButton } from "./ui/icon-button"; import { Input } from "./ui/input"; export function Chat() { const selectedOrganisation = useSelectedOrganisation(); const selectedProject = useSelectedProject(); const chatMutation = useChatMutation(); const [isOpen, setIsOpen] = useState(false); const [message, setMessage] = useState(""); const [response, setResponse] = useState(""); const [error, setError] = useState(null); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!message.trim()) return; if (!selectedOrganisation || !selectedProject) { setError("Please select an organisation and project first"); return; } setError(null); setResponse(""); try { const data = await chatMutation.mutateAsync({ orgId: selectedOrganisation.Organisation.id, projectId: selectedProject.Project.id, message: message.trim(), }); setResponse(data.text); setMessage(""); } catch (err) { const errorMessage = parseError(err as Error); setError(errorMessage); } }; return ( <> setIsOpen(!isOpen)} className="fixed bottom-4 left-1/2 -translate-x-1/2 z-50 rounded-full" size="lg" variant="outline" > {isOpen && (
{response && (

{response}

)} {chatMutation.isPending && (
)}
) => setMessage(e.target.value)} placeholder={`Ask me anything about the ${selectedProject?.Project.name || "..."} project...`} disabled={chatMutation.isPending} showCounter={false} />
{error && (

{error}

)}
)} ); }