"use client"; import { useEffect, useRef, useState } from "react"; import { createClient } from "@/lib/supabase/client"; import { sendMessage } from "@/lib/actions/messages"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { cn } from "@/lib/utils"; type Message = { id: string; conversation_id: string; sender_id: string; body: string; created_at: string; }; export function ChatWindow({ conversationId, currentUserId, initialMessages, }: { conversationId: string; currentUserId: string; initialMessages: Message[]; }) { const [messages, setMessages] = useState(initialMessages); const bottomRef = useRef(null); useEffect(() => { const supabase = createClient(); const channel = supabase .channel(`conversation:${conversationId}`) .on( "postgres_changes", { event: "INSERT", schema: "public", table: "messages", filter: `conversation_id=eq.${conversationId}`, }, (payload) => { const newMessage = payload.new as Message; setMessages((current) => { if (current.some((m) => m.id === newMessage.id)) return current; return [...current, newMessage]; }); } ) .subscribe(); return () => { supabase.removeChannel(channel); }; }, [conversationId]); useEffect(() => { bottomRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages]); const sendMessageWithConversation = sendMessage.bind(null, conversationId); return (
{messages.map((message) => { const isMine = message.sender_id === currentUserId; return (
{message.body}
); })}
{ await sendMessageWithConversation(formData); (document.getElementById("chat-input") as HTMLInputElement).value = ""; }} className="flex gap-2 border-t p-3" >
); }