"use client"; import { FormEvent, useCallback, useEffect, useState } from "react"; import { api, ApiError, type ServiceEntry, type ServiceStatus } from "@/lib/api"; import { AdminPageHeader, Banner, Button, EmptyState, Modal, SelectField, StatusBadge, TextField, } from "@/components/admin/controls"; const STATUS_OPTIONS: { value: ServiceStatus; label: string }[] = [ { value: "active", label: "فعال" }, { value: "inactive", label: "غیرفعال" }, { value: "maintenance", label: "در حال تعمیر" }, ]; export default function AdminServicesPage() { const [services, setServices] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [open, setOpen] = useState(false); const [busyId, setBusyId] = useState(null); const load = useCallback(async () => { setLoading(true); setError(""); try { const page = await api.services.list(1, 100); setServices(page.items); } catch (e) { setError(e instanceof ApiError ? e.message : "خطا در بارگذاری سرویس‌ها"); } finally { setLoading(false); } }, []); useEffect(() => { void load(); }, [load]); const changeStatus = async (svc: ServiceEntry, status: ServiceStatus) => { if (status === svc.status) return; setBusyId(svc.id); setError(""); try { await api.services.updateStatus(svc.id, status); await load(); } catch (e) { setError(e instanceof ApiError ? e.message : "تغییر وضعیت ناموفق بود"); } finally { setBusyId(null); } }; return (
setOpen(true)}>ثبت سرویس} /> {error && {error}}
{loading ? ( ) : services.length === 0 ? ( ) : (
{services.map((s) => ( ))}
نام کلید آدرس وضعیت تغییر وضعیت
{s.name} {s.service_key} {s.base_url || "—"}
)}
setOpen(false)} onCreated={() => { setOpen(false); void load(); }} />
); } function CreateServiceModal({ open, onClose, onCreated, }: { open: boolean; onClose: () => void; onCreated: () => void; }) { const [serviceKey, setServiceKey] = useState(""); const [name, setName] = useState(""); const [baseUrl, setBaseUrl] = useState(""); const [healthUrl, setHealthUrl] = useState(""); const [status, setStatus] = useState("active"); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setError(""); setSaving(true); try { await api.services.create({ service_key: serviceKey.trim(), name: name.trim(), base_url: baseUrl.trim() || null, health_check_url: healthUrl.trim() || null, status, }); setServiceKey(""); setName(""); setBaseUrl(""); setHealthUrl(""); onCreated(); } catch (err) { setError(err instanceof ApiError ? err.message : "ثبت سرویس ناموفق بود"); } finally { setSaving(false); } }; return (
setStatus(v as ServiceStatus)} options={STATUS_OPTIONS} disabled={saving} /> {error && {error}}
); }