"use client"; import { useState } from "react"; import { fetchLinks, FALLBACK_LINKS, type SiteLinks } from "@/lib/links"; import { API_URL } from "@/lib/site"; type Field = { key: keyof SiteLinks; label: string; type: "text" | "bool" }; const FIELDS: Field[] = [ { key: "bazaarUrl", label: "لینک کافه‌بازار", type: "text" }, { key: "bazaarEnabled", label: "نمایش دکمهٔ کافه‌بازار", type: "bool" }, { key: "myketUrl", label: "لینک مایکت", type: "text" }, { key: "myketEnabled", label: "نمایش دکمهٔ مایکت", type: "bool" }, { key: "directApkUrl", label: "لینک دانلود مستقیم APK", type: "text" }, { key: "directApkEnabled", label: "نمایش دانلود مستقیم", type: "bool" }, { key: "webPlayUrl", label: "آدرس بازی (وب)", type: "text" }, { key: "iosPwaEnabled", label: "نمایش نصب iOS/PWA", type: "bool" }, { key: "instagram", label: "اینستاگرام", type: "text" }, { key: "telegram", label: "تلگرام", type: "text" }, { key: "supportEmail", label: "ایمیل پشتیبانی", type: "text" }, { key: "supportPhone", label: "تلفن پشتیبانی", type: "text" }, { key: "appVersion", label: "نسخهٔ اپ", type: "text" }, ]; export default function AdminPage() { const [token, setToken] = useState(""); const [authed, setAuthed] = useState(false); const [links, setLinks] = useState(FALLBACK_LINKS); const [msg, setMsg] = useState(null); const [busy, setBusy] = useState(false); async function login() { setBusy(true); setMsg(null); const l = await fetchLinks(); setLinks(l); setAuthed(true); setBusy(false); } async function save() { setBusy(true); setMsg(null); try { const res = await fetch(`${API_URL}/api/admin/site/links`, { method: "POST", headers: { "Content-Type": "application/json", "X-Admin-Token": token }, body: JSON.stringify(links), }); if (res.status === 401) { setMsg("توکن نامعتبر است."); } else if (!res.ok) { setMsg("خطا در ذخیره."); } else { setLinks(await res.json()); setMsg("ذخیره شد ✓"); } } catch { setMsg("سرور در دسترس نیست."); } setBusy(false); } function set(k: K, v: SiteLinks[K]) { setLinks((p) => ({ ...p, [k]: v })); } if (!authed) { return (

ورود مدیریت

توکن مدیریت را وارد کن.

setToken(e.target.value)} placeholder="ADMIN_TOKEN" className="mt-5 w-full rounded-xl bg-navy-800 px-4 py-3 text-cream outline-none ring-1 ring-gold/20 focus:ring-gold/50" />

توکن همان مقدار ADMIN_TOKEN در فایل محیطی سرور است. ذخیره هنگام «ثبت» اعتبارسنجی می‌شود.

); } return (

مدیریت لینک‌ها

لینک‌های کافه‌بازار، مایکت، شبکه‌های اجتماعی و پشتیبانی را اینجا تنظیم کن.

{FIELDS.map((f) => f.type === "bool" ? ( ) : (
set(f.key, e.target.value as never)} className="w-full rounded-xl bg-navy-800 px-4 py-2.5 text-cream outline-none ring-1 ring-gold/15 focus:ring-gold/50" />
) )}
{msg && {msg}}
); }