97 lines
2.9 KiB
JavaScript
97 lines
2.9 KiB
JavaScript
import { api } from "./api.js";
|
|
import { handleAuthError, renderAllSuggestions, renderCounts, renderMySuggestions, renderPhasePill, renderPhaseTitles, renderResults, renderVotes, renderWelcome, setAuthUI, syncVoteScores } 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.prevPhase = state.phase;
|
|
state.phase = stateData.currentPhase;
|
|
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 === "Reveal" || 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();
|
|
}
|
|
}
|
|
|
|
export async function loadResults() {
|
|
if (state.phase !== "Results") 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();
|
|
}
|
|
} catch (err) {
|
|
if (handleAuthError(err, clearUserState)) return;
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
export function signatureSuggestions(list) {
|
|
return JSON.stringify(
|
|
list.map((s) => [
|
|
s.id,
|
|
s.name,
|
|
s.genre,
|
|
s.description,
|
|
s.screenshotUrl,
|
|
s.youtubeUrl,
|
|
s.gameUrl,
|
|
s.minPlayers,
|
|
s.maxPlayers,
|
|
]),
|
|
);
|
|
}
|
|
|
|
// expose for UI handlers that call back in
|
|
window.refreshPhaseData = refreshPhaseData;
|
|
window.loadSuggestData = loadSuggestData;
|
|
window.loadVoteData = loadVoteData;
|
|
window.handleAuthError = (err) => handleAuthError(err, clearUserState);
|