'use client'; import Link from 'next/link'; import { useTransition } from 'react'; import { Server, ServiceStatus, serviceStatusToString } from '@/lib/schemas'; import { startServerEventAction, restartServerEventAction, stopServerEventAction } from '@/lib/actions/servers'; import { useRouter } from 'next/navigation'; import { StatusDot } from '@/components/ui/StatusDot'; import { Badge } from '@/components/ui/Badge'; import { Button } from '@/components/ui/Button'; interface ServerCardProps { server: Server; } function statusBadgeVariant(status: ServiceStatus): 'green' | 'yellow' | 'gray' { if (status === ServiceStatus.Running) return 'green'; if ( [ServiceStatus.Starting, ServiceStatus.Restarting, ServiceStatus.Stopping].includes(status) ) return 'yellow'; return 'gray'; } export function ServerCard({ server }: ServerCardProps) { const [isPending, startTransition] = useTransition(); const router = useRouter(); const startServer = () => startTransition(async () => { await startServerEventAction(server.id); router.refresh(); }); const restartServer = () => startTransition(async () => { await restartServerEventAction(server.id); router.refresh(); }); const stopServer = () => startTransition(async () => { await stopServerEventAction(server.id); router.refresh(); }); const disabled = [ ServiceStatus.Restarting, ServiceStatus.Starting, ServiceStatus.Stopping, ServiceStatus.Unknown, ].includes(server.status); const isRunning = server.status === ServiceStatus.Running; return (
{server.name}
Players
{server.state?.playerCount ?? 0}
Track
{server.state?.track || 'N/A'}
{serviceStatusToString(server.status)} {server.lastActivity && ( by {server.lastActivity.username} )}
); }