'use client'; import { useEffect, useState } from 'react'; import { io, Socket } from 'socket.io-client'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card } from '@/components/ui/card'; import { User, fetchUsers } from '@/utils/api'; interface ChatMessage { id: string; user: string; message: string; timestamp: number; } export default function ChatModeration() { const [messages, setMessages] = useState([]); const [socket, setSocket] = useState(null); const [editingMessage, setEditingMessage] = useState(null); const [editText, setEditText] = useState(''); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const loadUsers = async () => { try { const usersData = await fetchUsers(); setUsers(usersData); } catch (error) { console.error('Error loading users:', error); } finally { setLoading(false); } }; loadUsers(); }, []); useEffect(() => { const newSocket = io('https://wschat.duelfi.io'); setSocket(newSocket); newSocket.on('recent messages', (recentMessages: ChatMessage[]) => { setMessages(recentMessages); }); newSocket.on('chat message', (message: ChatMessage) => { setMessages(prev => [...prev, message]); }); newSocket.on('message edited', ({ messageId, newMessage }: { messageId: string; newMessage: string }) => { setMessages(prev => prev.map(msg => msg.id === messageId ? { ...msg, message: newMessage } : msg ) ); }); newSocket.on('message deleted', (messageId: string) => { setMessages(prev => prev.filter(msg => msg.id !== messageId)); }); return () => { newSocket.close(); }; }, []); const getUserDisplayName = (userId: string): string => { const user = users.find(u => u.id === userId); if (user?.username) { return user.username; } // If no username found, return a truncated version of the ID return userId.startsWith('did:privy:') ? `User ${userId.slice(-4)}` : userId; }; const handleEdit = (message: ChatMessage) => { setEditingMessage(message.id); setEditText(message.message); }; const handleSaveEdit = (messageId: string) => { if (socket) { socket.emit('edit message', { messageId, newMessage: editText }); setEditingMessage(null); } }; const handleDelete = (messageId: string) => { if (socket && confirm('Are you sure you want to delete this message?')) { socket.emit('delete message', messageId); } }; if (loading) { return (
Loading...
); } return (

Chat Moderation

{messages.map((message) => (
{getUserDisplayName(message.user)} • {new Date(message.timestamp).toLocaleString()}
{editingMessage === message.id ? (
) => setEditText(e.target.value)} className="flex-1" />
) : (
{message.message}
)}
{editingMessage !== message.id && (
)}
))}
); }