import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Plus, Gamepad2 } from 'lucide-react'; import { api } from '@/lib/api'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; interface Game { id: string; slug: string; name: string; dockerImage: string; defaultPort: number; startupCommand: string; } interface PaginatedResponse { data: T[]; meta: { total: number }; } export function AdminGamesPage() { const queryClient = useQueryClient(); const [open, setOpen] = useState(false); const [name, setName] = useState(''); const [slug, setSlug] = useState(''); const [dockerImage, setDockerImage] = useState(''); const [defaultPort, setDefaultPort] = useState(25565); const [startupCommand, setStartupCommand] = useState(''); const { data } = useQuery({ queryKey: ['admin-games'], queryFn: () => api.get>('/admin/games'), }); const createMutation = useMutation({ mutationFn: (body: Record) => api.post('/admin/games', body), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-games'] }); setOpen(false); setName(''); setSlug(''); setDockerImage(''); setStartupCommand(''); }, }); const games = data?.data ?? []; return (

Games

Add Game
{ e.preventDefault(); createMutation.mutate({ name, slug, dockerImage, defaultPort, startupCommand }); }} className="space-y-4" >
setName(e.target.value)} required />
setSlug(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '')) } required />
setDockerImage(e.target.value)} placeholder="itzg/minecraft-server:latest" required />
setDefaultPort(Number(e.target.value))} />
setStartupCommand(e.target.value)} required />
{games.map((game) => ( {game.name}

{game.slug}

{game.dockerImage}

Port: {game.defaultPort}

))}
); }