import { defineStore } from 'pinia'; import { computed, ref } from 'vue'; import { adjustScoreboardScore, defaultScoreboard, normalizeScoreboard, resetScoreboardScores, setScoreboardScore, swapScoreboardPlayers, type Scoreboard, type ScoreboardSide, } from '../../shared/domain/scoreboard'; import { readStorageSnapshot, syncScoreboardState } from '../services/replicant-state-service'; const STORAGE_KEY = 'scoreko-dev.scoreboard'; export const useScoreboardStore = defineStore('scoreboard', () => { const scoreboard = ref({ ...defaultScoreboard }); const storageSnapshot = readStorageSnapshot(STORAGE_KEY, normalizeScoreboard); if (storageSnapshot) { scoreboard.value = storageSnapshot; } syncScoreboardState(scoreboard, STORAGE_KEY); const setScoreboard = (value: Scoreboard): void => { scoreboard.value = normalizeScoreboard(value); }; const setGame = (value: string): void => { scoreboard.value = { ...scoreboard.value, game: value }; }; const setRound = (value: string): void => { scoreboard.value = { ...scoreboard.value, round: value }; }; const setScore = (side: ScoreboardSide, value: number): void => { scoreboard.value = setScoreboardScore(scoreboard.value, side, value); }; const adjustScore = (side: ScoreboardSide, delta: number): void => { scoreboard.value = adjustScoreboardScore(scoreboard.value, side, delta); }; const setSidePlayerId = (side: ScoreboardSide, value: string): void => { scoreboard.value = { ...scoreboard.value, [side === 'left' ? 'leftPlayerId' : 'rightPlayerId']: value, }; }; const setSideNameOverride = (side: ScoreboardSide, value: string): void => { scoreboard.value = { ...scoreboard.value, [side === 'left' ? 'leftNameOverride' : 'rightNameOverride']: value, }; }; const setSideTeamOverride = (side: ScoreboardSide, value: string): void => { scoreboard.value = { ...scoreboard.value, [side === 'left' ? 'leftTeamOverride' : 'rightTeamOverride']: value, }; }; const setSideCountryOverride = (side: ScoreboardSide, value: string): void => { scoreboard.value = { ...scoreboard.value, [side === 'left' ? 'leftCountryOverride' : 'rightCountryOverride']: value, }; }; const setSideCharacter = (side: ScoreboardSide, value: string): void => { scoreboard.value = { ...scoreboard.value, [side === 'left' ? 'leftCharacter' : 'rightCharacter']: value, }; }; const swapPlayers = (): void => { scoreboard.value = swapScoreboardPlayers(scoreboard.value); }; const resetScores = (): void => { scoreboard.value = resetScoreboardScores(scoreboard.value); }; const leftScore = computed({ get: () => scoreboard.value.leftScore, set: (value: number) => { setScore('left', value); }, }); const rightScore = computed({ get: () => scoreboard.value.rightScore, set: (value: number) => { setScore('right', value); }, }); return { scoreboard, leftScore, rightScore, setScoreboard, setGame, setRound, setScore, adjustScore, setSidePlayerId, setSideNameOverride, setSideTeamOverride, setSideCountryOverride, setSideCharacter, swapPlayers, resetScores, }; });