"use client"; import { createClient } from "@/lib/supabase/client"; import { useChat } from "@ai-sdk/react"; import { DefaultChatTransport, type UIMessage } from "ai"; import { Brain, Loader2, MessageSquare, Plus, Send, Trash2 } from "lucide-react"; import { Button } from "poyraz-ui/atoms"; import { useEffect, useRef, useState } from "react"; import toast from "react-hot-toast"; type ChatSession = { id: string; title: string; created_at: string; }; export default function AIChatPage() { const [supabase] = useState(() => createClient()); const [sessions, setSessions] = useState([]); const [activeSessionId, setActiveSessionId] = useState(null); const [input, setInput] = useState(""); const messagesEndRef = useRef(null); const { messages, sendMessage, setMessages, status, stop } = useChat({ transport: new DefaultChatTransport({ api: "/api/chat" }), onError: (error) => { console.error(error); toast.error(error.message || "Yapay zeka ile iletişim kurulurken bir hata oluştu."); }, }); const isLoading = status === "submitted" || status === "streaming"; useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages]); useEffect(() => { async function fetchSessions() { const { data: { user }, } = await supabase.auth.getUser(); if (!user) return; const { data } = await supabase .from("chat_sessions") .select("id, title, created_at") .eq("user_id", user.id) .order("created_at", { ascending: false }); if (data) { setSessions(data); setActiveSessionId(data[0]?.id || null); } } void fetchSessions(); }, [supabase]); useEffect(() => { async function fetchMessages() { if (!activeSessionId) { setMessages([]); return; } const { data } = await supabase .from("chat_messages") .select("id, role, content") .eq("session_id", activeSessionId) .order("created_at", { ascending: true }); const formattedMessages: UIMessage[] = (data || []).map((message) => ({ id: message.id, role: message.role as UIMessage["role"], parts: [{ type: "text", text: message.content || "" }], })); setMessages(formattedMessages); } void fetchMessages(); }, [activeSessionId, setMessages, supabase]); async function handleNewChat() { setActiveSessionId(null); setMessages([]); } async function handleDeleteSession(id: string, event: React.MouseEvent) { event.stopPropagation(); await supabase.from("chat_sessions").delete().eq("id", id); const nextSessions = sessions.filter((session) => session.id !== id); setSessions(nextSessions); if (activeSessionId === id) { setActiveSessionId(nextSessions[0]?.id || null); if (nextSessions.length === 0) setMessages([]); } } async function handleSubmit(event: { preventDefault: () => void }) { event.preventDefault(); const currentInput = input.trim(); if (!currentInput || isLoading) return; let sessionId = activeSessionId; setInput(""); if (!sessionId) { const { data: { user }, } = await supabase.auth.getUser(); if (!user) return; const { data: newSession } = await supabase .from("chat_sessions") .insert({ user_id: user.id, title: currentInput.length > 32 ? `${currentInput.slice(0, 32)}...` : currentInput, }) .select("id, title, created_at") .single(); if (!newSession) return; sessionId = newSession.id; setActiveSessionId(sessionId); setSessions((currentSessions) => [newSession, ...currentSessions]); } await sendMessage({ text: currentInput }, { body: { sessionId } }); } return (

AI Asistan

Kayıtlı verilerin hakkında soru sor.

{messages.length === 0 ? (

Verilerine danış

Görevler, projeler, müşteriler, finans ve günlük kayıtların hakkında soru sorabilirsin.

) : ( messages.map((message) => { const text = getMessageText(message); return (
{text}
); }) )} {isLoading ? (
Yanıt hazırlanıyor...
) : null}