'use client'; import Link from 'next/link'; import { Server, serviceStatusToString, ServiceStatus } from '@/lib/schemas/server'; import { startServerEventAction, restartServerEventAction, stopServerEventAction } from '@/lib/actions/servers'; import { hasPermission, User } from '@/lib/schemas'; import { useState, useTransition } from 'react'; import { useRouter } from 'next/navigation'; import { DeleteServerModal } from './DeleteServerModal'; import { Badge } from '@/components/ui/Badge'; import { Button } from '@/components/ui/Button'; interface ServerHeaderProps { server: Server; user: User; } export function ServerHeader({ server, user }: ServerHeaderProps) { const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isPending, startTransition] = useTransition(); const router = useRouter(); const canDeleteServer = hasPermission(user, 'server.delete'); 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); return ( <>
Servers / {server.name}
● {serviceStatusToString(server.status)} {canDeleteServer && ( )}
{[ { label: 'Track', value: server.state?.track ?? 'N/A' }, { label: 'Players', value: `${server.state?.playerCount ?? 0} / ${server.state?.maxConnections ?? 0}` }, { label: 'Session', value: server.state?.session ?? 'N/A' }, ].map(({ label, value }) => (
{label}
{value}
))}
setIsDeleteModalOpen(false)} server={server} /> ); }