"use client"; import { useState } from "react"; import { fetchTenants, fetchTenantDetail, updateSettings, performLifecycleAction, type TenantListItem, type TenantDetail, type LifecycleAction, } from "@/lib/api"; const ACTION_LABEL: Record = { suspend: "Suspendieren", reactivate: "Reaktivieren", schedule_deletion: "Löschung vormerken", cancel_deletion: "Löschung abbrechen", }; const ACTION_CONFIRM: Record = { suspend: "Mandant wirklich suspendieren? Benutzer können sich danach nicht mehr anmelden.", reactivate: "Mandant wirklich reaktivieren?", schedule_deletion: "Mandant wirklich zur Löschung vormerken? Nach der Karenzzeit wird er unwiderruflich gelöscht.", cancel_deletion: "Vorgemerkte Löschung wirklich abbrechen?", }; export default function Page() { const [superadminId, setSuperadminId] = useState(""); const [search, setSearch] = useState(""); const [status, setStatus] = useState(""); const [tenants, setTenants] = useState(null); const [detail, setDetail] = useState(null); const [error, setError] = useState(null); const [formError, setFormError] = useState(null); async function loadList() { setError(null); try { const items = await fetchTenants(superadminId.trim(), search.trim(), status); setTenants(items); } catch (e: any) { setError(e.message ?? "Unbekannter Fehler"); setTenants(null); } } async function openDetail(slug: string) { setError(null); try { const d = await fetchTenantDetail(superadminId.trim(), slug); setDetail(d); } catch (e: any) { setError(e.message ?? "Unbekannter Fehler"); } } async function onSubmitSettings(e: React.FormEvent) { e.preventDefault(); if (!detail) return; setFormError(null); const form = new FormData(e.currentTarget); const displayName = String(form.get("displayName") ?? "").trim(); if (!displayName) { setFormError("Anzeigename ist ein Pflichtfeld."); return; } try { await updateSettings( superadminId.trim(), detail.slug, displayName, String(form.get("colorScheme") ?? ""), String(form.get("timezone") ?? ""), String(form.get("language") ?? "") ); await openDetail(detail.slug); } catch (e: any) { setFormError(e.message ?? "Speichern fehlgeschlagen"); } } async function onLifecycleAction(action: LifecycleAction) { if (!detail) return; if (!window.confirm(ACTION_CONFIRM[action])) return; setError(null); try { await performLifecycleAction(superadminId.trim(), detail.slug, action); await openDetail(detail.slug); await loadList(); } catch (e: any) { setError(e.message ?? "Aktion fehlgeschlagen"); } } return (

Mandantenverwaltung

setSuperadminId(e.target.value)} placeholder="Superadmin-ID" style={{ padding: "0.5rem" }} /> setSearch(e.target.value)} placeholder="Suche (Slug/Name)" style={{ padding: "0.5rem" }} />
{error && (

Fehler: {error}

)} {tenants && ( {tenants.map((t) => ( ))} {tenants.length === 0 && ( )}
Slug Name Status
{t.slug} {t.name} {t.status}
Keine Mandanten gefunden.
)} {detail && (

{detail.name} ({detail.slug}) — Status: {detail.status}

{formError && (

{formError}

)}
{(Object.keys(ACTION_LABEL) as LifecycleAction[]).map((action) => ( ))}
)}
); }