import { api } from "./api.js"; import { t } from "./i18n.js"; import { state } from "./state.js"; import { $, toast } from "./dom.js"; import { openConfirmModal, renderPhasePill, renderVotes } from "./ui.js"; function bindPhaseAdvanceButtons(runSerializedRefresh) { const makeForward = (id, before) => { const btn = $(id); if (!btn) return; btn.addEventListener("click", async () => { try { if (before) { const proceed = await before(); if (!proceed) return; } const resp = await api.nextPhase(); state.prevPhase = state.phase; state.phase = resp.currentPhase; state.resultsOpen = resp.resultsOpen ?? state.resultsOpen; state.votesRendered = false; renderPhasePill(); await runSerializedRefresh(); } catch (err) { toast(err.message, true); } }); }; const makeBack = (id) => { const btn = $(id); if (!btn) return; btn.addEventListener("click", async () => { try { const resp = await api.prevPhase(); state.prevPhase = state.phase; state.phase = resp.currentPhase; state.resultsOpen = resp.resultsOpen ?? state.resultsOpen; state.votesRendered = false; renderPhasePill(); await runSerializedRefresh(); } catch (err) { toast(err.message, true); } }); }; makeForward("nav-suggest-next", async () => { return await new Promise((resolve) => { openConfirmModal({ title: t("nav.freezeModalTitle"), body: t("nav.freezeModalBody"), confirmLabel: t("nav.next"), onConfirm: (close) => { close(); resolve(true); }, }); }); }); makeBack("nav-vote-prev"); } function bindVoteFinalizeButton() { const finalizeBtn = $("finalize-votes"); if (!finalizeBtn) return; const finalizeVotes = async (desired) => { await api.finalizeVotes(desired); state.votesFinal = desired; renderPhasePill(); renderVotes(); toast(desired ? t("vote.finalize") : t("vote.unfinalize")); }; const missingVotes = () => { const votedIds = new Set( (state.myVotes ?? []).map((v) => v.suggestionId), ); return (state.allSuggestions ?? []).filter((s) => !votedIds.has(s.id)); }; finalizeBtn.addEventListener("click", async () => { try { const desired = !state.votesFinal; if (desired) { const missing = missingVotes(); if (missing.length > 0) { openConfirmModal({ title: t("vote.finalizeMissingTitle"), body: t("vote.finalizeMissingBody", { count: missing.length, }), confirmLabel: t("vote.finalizeMissingConfirm"), onConfirm: async (close) => { await finalizeVotes(desired); close(); }, }); return; } } await finalizeVotes(desired); } catch (err) { toast(err.message, true); } }); } export function setupVoteNavigationHandlers({ runSerializedRefresh }) { bindPhaseAdvanceButtons(runSerializedRefresh); bindVoteFinalizeButton(); }