"use client"; import { useState, useEffect, useCallback } from "react"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Download, RefreshCw, AlertTriangle, CheckCircle2, Server } from "lucide-react"; import { toast } from "sonner"; const SERVER_TYPES = ["vanilla", "paper", "fabric"] as const; type ServerType = (typeof SERVER_TYPES)[number]; interface Settings { serverType?: string; serverVersion?: string; serverJar?: string; } export default function UpdatesPage() { const [settings, setSettings] = useState(null); const [selectedType, setSelectedType] = useState("paper"); const [versions, setVersions] = useState([]); const [selectedVersion, setSelectedVersion] = useState(""); const [loadingSettings, setLoadingSettings] = useState(true); const [loadingVersions, setLoadingVersions] = useState(false); const [saving, setSaving] = useState(false); const fetchSettings = useCallback(async () => { try { const res = await fetch("/api/server/settings"); if (res.ok) { const data = await res.json(); if (data.settings) { setSettings(data.settings); setSelectedType((data.settings.serverType as ServerType) ?? "paper"); setSelectedVersion(data.settings.serverVersion ?? ""); } } } finally { setLoadingSettings(false); } }, []); const fetchVersions = useCallback(async (type: string) => { setLoadingVersions(true); setVersions([]); try { const res = await fetch(`/api/server/versions?type=${type}`); if (res.ok) { const data = await res.json(); setVersions(data.versions ?? []); } else { toast.error("Failed to fetch versions"); } } catch { toast.error("Network error fetching versions"); } finally { setLoadingVersions(false); } }, []); useEffect(() => { fetchSettings(); }, [fetchSettings]); useEffect(() => { fetchVersions(selectedType); }, [selectedType, fetchVersions]); const isUpToDate = settings?.serverVersion === selectedVersion && settings?.serverType === selectedType; async function handleApply() { if (!selectedVersion) { toast.error("Please select a version"); return; } setSaving(true); try { const res = await fetch("/api/server/settings", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ serverType: selectedType, serverVersion: selectedVersion }), }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.error ?? "Failed to apply"); } setSettings((prev) => ({ ...prev, serverType: selectedType, serverVersion: selectedVersion })); toast.success(`Server version set to ${selectedType} ${selectedVersion}`); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed to apply version"); } finally { setSaving(false); } } const currentVersion = settings?.serverVersion ? `${settings.serverType ?? "unknown"} ${settings.serverVersion}` : "Not configured"; return (

Server Updates

Manage your Minecraft server version

{/* Current version */} Current Version {loadingSettings ? ( ) : (
{currentVersion} {settings?.serverVersion && ( {isUpToDate ? "Up to date" : "Update available"} )}
)}
{/* Version picker */} Select Version Choose a server type and version to apply
{selectedVersion && settings?.serverVersion && selectedVersion !== settings.serverVersion && (

Changing from {settings.serverVersion} to{" "} {selectedVersion} requires a server restart. Make sure to create a backup first.

)} {isUpToDate && selectedVersion && (

This version is already configured.

)}
); }