Files
GameList/wwwroot/js/data.js

107 lines
3.3 KiB
JavaScript

import { api, adminApi } from "./api.js";
import { handleAuthError, renderAllSuggestions, renderCounts, renderMySuggestions, renderPhasePill, renderPhaseTitles, renderResults, renderVotes, renderWelcome, setAuthUI, syncVoteScores, updatePhaseNav } from "./ui.js";
import { state, clearUserState } from "./state.js";
export async function loadState() {
const [me, stateData] = await Promise.all([api.me(), api.state()]);
state.isAuthenticated = true;
state.me = me;
state.hasJoker = me.hasJoker ?? false;
state.prevPhase = state.phase;
state.phase = stateData.currentPhase;
state.resultsOpen = stateData.resultsOpen;
state.votesFinal = stateData.votesFinal ?? me?.votesFinal ?? false;
state.counts = stateData;
if (state.prevPhase !== state.phase && state.phase === "Vote") {
state.votesRendered = false;
}
setAuthUI(true);
renderWelcome();
renderPhasePill();
renderCounts();
}
export async function loadSuggestData() {
if (state.phase !== "Suggest") return;
state.mySuggestions = await api.mySuggestions();
renderMySuggestions();
}
export async function loadRevealData() {
if (state.phase === "Vote" || state.phase === "Results") {
const latest = await api.allSuggestions();
const latestSig = signatureSuggestions(latest);
const changed = latestSig !== state.allSuggestionsSig;
state.allSuggestions = latest;
state.allSuggestionsSig = latestSig;
renderAllSuggestions();
renderPhaseTitles();
if (state.phase === "Vote" && changed) {
state.votesRendered = false;
}
}
}
export async function loadVoteData() {
if (state.phase !== "Vote") return;
const votes = await api.myVotes();
state.myVotes = votes;
if (!state.votesRendered) {
renderVotes();
state.votesRendered = true;
} else {
syncVoteScores();
}
updatePhaseNav();
}
export async function loadResults() {
if (state.phase !== "Results" || !state.resultsOpen) return;
state.results = await api.results();
renderResults();
}
export async function refreshPhaseData() {
try {
await loadState();
await Promise.all([loadSuggestData(), loadRevealData(), loadResults()]);
if (state.phase === "Vote") {
if (!state.votesRendered) await loadVoteData();
} else {
state.votesRendered = false;
await loadVoteData();
}
if (state.me?.isAdmin) {
state.adminVoteStatus = await adminApi.voteStatus();
}
updatePhaseNav();
} catch (err) {
if (handleAuthError(err, clearUserState)) return;
throw err;
}
}
export function signatureSuggestions(list) {
return JSON.stringify(
list.map((s) => [
s.id,
s.playerId,
s.name,
s.genre,
s.description,
s.screenshotUrl,
s.youtubeUrl,
s.gameUrl,
s.minPlayers,
s.maxPlayers,
s.parentSuggestionId,
]),
);
}
// expose for UI handlers that call back in
window.refreshPhaseData = refreshPhaseData;
window.loadSuggestData = loadSuggestData;
window.loadVoteData = loadVoteData;
window.handleAuthError = (err) => handleAuthError(err, clearUserState);