'use client' import { Pause, Play, RefreshCw } from 'lucide-react' import { useRouter } from 'next/navigation' import { useCallback, useEffect, useState } from 'react' import { DataTable } from '@/components/admin/data-table' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { getAvatarUrl } from '@/lib/imager' import type { DataTableColumn, PaginatedResult } from '@/types' interface OnlineUserRow { id: number username: string motto: string look: string } const columns: DataTableColumn[] = [ { key: 'id', label: 'ID', sortable: true }, { key: 'username', label: 'Username', sortable: true, render: (_, row) => (
{row.username}
), }, { key: 'motto', label: 'Motto', render: (value) => {String(value) || '-'}, }, { key: 'look', label: 'Avatar', render: (_, row) => {row.username}, }, ] interface OnlineTableProps { data: PaginatedResult } const REFRESH_INTERVAL = 15_000 // 15 seconds export function OnlineTable({ data }: OnlineTableProps) { const router = useRouter() const [autoRefresh, setAutoRefresh] = useState(false) const [lastUpdated, setLastUpdated] = useState(() => new Date()) const [isRefreshing, setIsRefreshing] = useState(false) const doRefresh = useCallback(() => { setIsRefreshing(true) router.refresh() setLastUpdated(new Date()) // Small delay to show spinner setTimeout(() => setIsRefreshing(false), 500) }, [router]) useEffect(() => { if (!autoRefresh) return const timer = setInterval(doRefresh, REFRESH_INTERVAL) return () => clearInterval(timer) }, [autoRefresh, doRefresh]) // Update lastUpdated when data changes // biome-ignore lint/correctness/useExhaustiveDependencies: explicitly chosen here, see surrounding code useEffect(() => { setLastUpdated(new Date()) }, [data.total]) return (
{/* Auto-refresh controls */}
{autoRefresh && ( Every {REFRESH_INTERVAL / 1000}s )} Last updated: {lastUpdated.toLocaleTimeString()}
) }