Files
Minikura/apps/web/app/dashboard/servers/edit/[id]/page.tsx
T

140 lines
4.1 KiB
TypeScript
Raw Normal View History

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
);
}