"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 "poyraz-ui/molecules"; function formatMessageContent(text: string) { if (!text) return null; const lines = text.split("\n"); return lines.map((line, i) => ( {line.split(/(\*\*.*?\*\*|\*.*?\*)/g).map((part, j) => { if (part.startsWith("**") && part.endsWith("**")) { return ( {part.slice(2, -2)} ); } if (part.startsWith("*") && part.endsWith("*")) { return {part.slice(1, -1)}; } return {part}; })} {i !== lines.length - 1 &&
}
)); } 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 [isMobileSessionsOpen, setIsMobileSessionsOpen] = useState(false); 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 } }); } const SessionsSidebarContent = ( <>

Sohbetler

{sessions.length === 0 ? (
Henüz sohbet yok.
) : ( sessions.map((session) => ( )) )}
); return (
{/* Desktop Sidebar */} {/* Mobile Sidebar Overlay */} {isMobileSessionsOpen && (
setIsMobileSessionsOpen(false)} /> )} {/* Mobile Sidebar Drawer */}

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 (
{formatMessageContent(text)}
); }) )} {isLoading ? (
Yanıt hazırlanıyor...
) : null}