"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/common"; 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()}
); }