import { useState, useEffect } from "react"; import { Link, useLocation } from "wouter"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card } from "@/components/ui/card"; import { ArrowLeft, Send, Search, Loader2 } from "lucide-react"; import { MobileHeader } from "@/components/mobile/MobileHeader"; import { supabase } from "@/lib/supabase"; import { useAuth } from "@/lib/auth"; import { nanoid } from "nanoid"; interface Chat { id: string; username: string; avatar?: string; lastMessage: string; timestamp: string; unread: boolean; } interface Message { id: string; sender: string; content: string; timestamp: string; isOwn: boolean; } export default function Messaging() { const { user } = useAuth(); const [chats, setChats] = useState([]); const [selectedChatId, setSelectedChatId] = useState(""); const [messages, setMessages] = useState([]); const [messageInput, setMessageInput] = useState(""); const [searchQuery, setSearchQuery] = useState(""); const [loading, setLoading] = useState(true); useEffect(() => { if (user?.id) fetchMessages(); }, [user]); const fetchMessages = async () => { try { const { data, error } = await supabase .from('messages') .select('*') .or(`sender_id.eq.${user?.id},recipient_id.eq.${user?.id}`) .order('created_at', { ascending: false }); if (!error && data) { setMessages(data.map(m => ({ id: m.id, sender: m.sender_id === user?.id ? 'You' : m.sender_id, content: m.content, timestamp: new Date(m.created_at).toLocaleTimeString(), isOwn: m.sender_id === user?.id }))); } } catch (err) { console.error('Error fetching messages:', err); } finally { setLoading(false); } }; const handleSendMessage = async () => { if (!messageInput.trim() || !user?.id || !selectedChatId) return; try { const { data, error } = await supabase.from('messages').insert({ id: nanoid(), sender_id: user.id, recipient_id: selectedChatId, content: messageInput, read: false }).select().single(); if (!error && data) { const newMessage: Message = { id: data.id, sender: "You", content: messageInput, timestamp: new Date().toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", }), isOwn: true, }; setMessages([...messages, newMessage]); setMessageInput(""); } } catch (err) { console.error('Error sending message:', err); } }; const selectedChat = chats.find((c) => c.id === selectedChatId); const filteredChats = chats.filter((c) => c.username.toLowerCase().includes(searchQuery.toLowerCase()) ); return (
{/* Mobile Header */}
{/* Desktop Header */}

Messages

{/* Chat List */}
setSearchQuery(e.target.value)} className="bg-slate-700 border-slate-600 text-white pl-10" />
{filteredChats.map((chat) => ( ))}
{/* Chat Area */} {selectedChat && (
{/* Chat Header */}

{selectedChat.username}

Online
{/* Messages */}
{messages.map((msg) => (

{msg.content}

{msg.timestamp}
))}
{/* Input Area */}
setMessageInput(e.target.value)} onKeyPress={(e) => { if (e.key === "Enter") handleSendMessage(); }} className="bg-slate-700 border-slate-600 text-white" />
)}
); }