2026-02-13 15:52:13 +07:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import type { NormalServer, UpdateServerRequest } from "@minikura/api";
|
|
|
|
|
import { ArrowLeft } from "lucide-react";
|
|
|
|
|
import { useParams, useRouter } from "next/navigation";
|
|
|
|
|
import { useEffect, useState } from "react";
|
2026-08-13 01:58:15 +07:00
|
|
|
import { ServerForm, type ServerFormData } from "@/components/server-form";
|
|
|
|
|
import { PageHeader, PageShell, StatePanel } from "@/components/page-layout";
|
|
|
|
|
import { SectionCard } from "@/components/section-card";
|
2026-02-13 15:52:13 +07:00
|
|
|
import { Button } from "@/components/ui/button";
|
2026-02-17 18:12:02 +07:00
|
|
|
import { api } from "@/lib/api-client";
|
2026-02-13 15:52:13 +07:00
|
|
|
import { getReverseProxyApi } from "@/lib/api-helpers";
|
2026-08-13 01:58:15 +07:00
|
|
|
import { toCommonServerRequestFields, toInitialServerFormData } from "@/lib/server-form/mappings";
|
2026-02-13 15:52:13 +07:00
|
|
|
|
|
|
|
|
export default function EditServerPage() {
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
const params = useParams();
|
|
|
|
|
const serverId = params.id as string;
|
|
|
|
|
|
|
|
|
|
const [loading, setLoading] = useState(true);
|
|
|
|
|
const [serverData, setServerData] = useState<NormalServer | null>(null);
|
|
|
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const fetchServer = async () => {
|
|
|
|
|
try {
|
|
|
|
|
setLoading(true);
|
|
|
|
|
|
|
|
|
|
const normalResponse = await api.api.servers.get();
|
|
|
|
|
if (normalResponse.data) {
|
|
|
|
|
const servers = normalResponse.data as unknown as NormalServer[];
|
|
|
|
|
const server = servers.find((s) => s.id === serverId);
|
|
|
|
|
if (server) {
|
|
|
|
|
setServerData(server);
|
|
|
|
|
setLoading(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const proxyResponse = await getReverseProxyApi().get();
|
|
|
|
|
if (proxyResponse.data) {
|
|
|
|
|
const proxies = proxyResponse.data as unknown as NormalServer[];
|
|
|
|
|
const proxy = proxies.find((p) => p.id === serverId);
|
|
|
|
|
if (proxy) {
|
|
|
|
|
setServerData(proxy);
|
|
|
|
|
setLoading(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setError("Server not found");
|
|
|
|
|
setLoading(false);
|
2026-02-17 18:12:02 +07:00
|
|
|
} catch (_err) {
|
2026-02-13 15:52:13 +07:00
|
|
|
setError("Failed to load server data");
|
|
|
|
|
setLoading(false);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (serverId) {
|
|
|
|
|
fetchServer();
|
|
|
|
|
}
|
|
|
|
|
}, [serverId]);
|
|
|
|
|
|
|
|
|
|
const handleSubmit = async (data: ServerFormData) => {
|
|
|
|
|
if (!serverData) return;
|
|
|
|
|
|
2026-08-13 01:58:15 +07:00
|
|
|
const payload: UpdateServerRequest = toCommonServerRequestFields(data);
|
2026-02-13 15:52:13 +07:00
|
|
|
|
|
|
|
|
const response = await api.api.servers({ id: serverId }).patch(payload);
|
|
|
|
|
|
|
|
|
|
if (response.error) {
|
|
|
|
|
const errorMsg =
|
|
|
|
|
typeof response.error === "object" &&
|
|
|
|
|
response.error &&
|
|
|
|
|
"value" in response.error &&
|
|
|
|
|
typeof response.error.value === "object" &&
|
|
|
|
|
response.error.value &&
|
|
|
|
|
"message" in response.error.value
|
|
|
|
|
? String(response.error.value.message)
|
|
|
|
|
: "Failed to update server";
|
|
|
|
|
throw new Error(errorMsg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
router.push("/dashboard/servers");
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (loading) {
|
2026-08-13 01:58:15 +07:00
|
|
|
return <StatePanel loading title="Loading server data..." className="min-h-[50vh]" />;
|
2026-02-13 15:52:13 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (error || !serverData) {
|
|
|
|
|
return (
|
2026-08-13 01:58:15 +07:00
|
|
|
<StatePanel
|
|
|
|
|
title={error || "Server not found"}
|
|
|
|
|
tone="error"
|
|
|
|
|
className="min-h-[50vh]"
|
|
|
|
|
action={
|
2026-02-13 15:52:13 +07:00
|
|
|
<Button
|
|
|
|
|
variant="outline"
|
|
|
|
|
onClick={() => router.push("/dashboard/servers")}
|
|
|
|
|
>
|
2026-08-13 01:58:15 +07:00
|
|
|
<ArrowLeft className="size-4" />
|
2026-02-13 15:52:13 +07:00
|
|
|
Back to Servers
|
|
|
|
|
</Button>
|
2026-08-13 01:58:15 +07:00
|
|
|
}
|
|
|
|
|
/>
|
2026-02-13 15:52:13 +07:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-13 01:58:15 +07:00
|
|
|
const initialData = toInitialServerFormData(serverData);
|
2026-02-13 15:52:13 +07:00
|
|
|
|
|
|
|
|
return (
|
2026-08-13 01:58:15 +07:00
|
|
|
<PageShell>
|
|
|
|
|
<PageHeader
|
|
|
|
|
eyebrow="Compute / Configure"
|
|
|
|
|
title={<>Edit {serverData.id}</>}
|
|
|
|
|
description="Update the workload specification and deployment behavior."
|
|
|
|
|
leading={
|
|
|
|
|
<Button variant="ghost" size="icon" onClick={() => router.push("/dashboard/servers")}>
|
|
|
|
|
<ArrowLeft className="size-5" />
|
|
|
|
|
</Button>
|
|
|
|
|
}
|
|
|
|
|
className="flex-row items-center justify-start"
|
|
|
|
|
/>
|
2026-02-13 15:52:13 +07:00
|
|
|
|
2026-08-13 01:58:15 +07:00
|
|
|
<SectionCard
|
|
|
|
|
title="Server Configuration"
|
|
|
|
|
description="Modify settings for your Minecraft server"
|
|
|
|
|
>
|
2026-02-13 15:52:13 +07:00
|
|
|
<ServerForm
|
|
|
|
|
initialData={initialData}
|
|
|
|
|
onSubmit={handleSubmit}
|
|
|
|
|
onCancel={() => router.push("/dashboard/servers")}
|
|
|
|
|
submitLabel="Save Changes"
|
|
|
|
|
/>
|
2026-08-13 01:58:15 +07:00
|
|
|
</SectionCard>
|
|
|
|
|
</PageShell>
|
2026-02-13 15:52:13 +07:00
|
|
|
);
|
|
|
|
|
}
|