Modularize frontend app script
This commit is contained in:
96
wwwroot/js/data.js
Normal file
96
wwwroot/js/data.js
Normal file
@@ -0,0 +1,96 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user