import { adminApi } from "./api.js"; import { t } from "./i18n.js"; import { state } from "./state.js"; import { $, toast } from "./dom.js"; import { openConfirmModal, openResultsRelockModal, renderPhasePill, } from "./ui.js"; async function adminAction(fn, successMessage, runSerializedRefresh) { try { await fn(); toast(successMessage); await runSerializedRefresh(); } catch (err) { toast(err.message, true); } } function setupAdminPanelToggle() { const adminToggle = $("admin-toggle"); const adminCard = $("admin-card"); const adminClose = $("admin-close"); if (!adminToggle || !adminCard || !adminClose) return; const togglePanel = (show) => adminCard.classList.toggle("hidden", !show); adminToggle.addEventListener("click", () => togglePanel(adminCard.classList.contains("hidden")), ); adminClose.addEventListener("click", () => togglePanel(false)); } function setupResetButtons(runSerializedRefresh) { $("reset").addEventListener("click", () => adminAction(adminApi.reset, t("admin.resetDone"), runSerializedRefresh), ); $("factory-reset").addEventListener("click", () => adminAction( adminApi.factoryReset, t("admin.factoryResetDone"), runSerializedRefresh, ), ); } function setupResultsToggle(runSerializedRefresh) { const resultsToggle = $("results-open"); if (!resultsToggle) return; resultsToggle.addEventListener("change", async (e) => { const desired = !!e.target.checked; try { const resp = await adminApi.setResultsOpen(desired); const wasResultsOpen = state.resultsOpen; const wasPhase = state.phase; state.resultsOpen = resp.resultsOpen; if (wasResultsOpen && !resp.resultsOpen && wasPhase === "Results") { openResultsRelockModal(); } renderPhasePill(); toast(t("admin.resultsUpdated")); await runSerializedRefresh(); } catch (err) { e.target.checked = !desired; toast(err.message, true); } }); } function setupLinkApply(runSerializedRefresh) { const linkApply = $("link-apply"); if (!linkApply) return; linkApply.addEventListener("click", async () => { const source = Number($("link-source")?.value); const target = Number($("link-target")?.value); if (!source || !target || source === target) { return toast(t("admin.linkValidation"), true); } try { await adminApi.linkSuggestions(source, target); toast(t("admin.linkDone")); await runSerializedRefresh(); } catch (err) { toast(err.message, true); } }); } function setupPlayerTableActions(runSerializedRefresh) { const playerTable = $("admin-player-table"); if (!playerTable) return; playerTable.addEventListener("click", async (e) => { const grantBtn = e.target.closest("[data-grant-joker]"); const deleteBtn = e.target.closest("[data-delete-player]"); if (grantBtn) { const playerId = grantBtn.dataset.grantJoker; try { await adminApi.grantJoker(playerId); toast(t("admin.jokerGranted")); await runSerializedRefresh(); } catch (err) { toast(err.message, true); } } else if (deleteBtn) { const playerId = deleteBtn.dataset.deletePlayer; const name = deleteBtn.dataset.name || ""; openConfirmModal({ title: t("admin.deleteTitle"), body: t("admin.deleteBody", { name }), confirmLabel: t("admin.deleteConfirm"), onConfirm: async (close) => { try { await adminApi.deletePlayer(playerId); toast(t("admin.deleteDone")); close(); await runSerializedRefresh(); } catch (err) { toast(err.message, true); } }, }); } }); } export function setupAdminHandlers({ runSerializedRefresh }) { setupResetButtons(runSerializedRefresh); setupAdminPanelToggle(); setupResultsToggle(runSerializedRefresh); setupLinkApply(runSerializedRefresh); setupPlayerTableActions(runSerializedRefresh); }