2026-02-10 00:42:48 +01:00
|
|
|
export function createInitialState() {
|
|
|
|
|
return {
|
|
|
|
|
order: true,
|
|
|
|
|
visuForm: false,
|
|
|
|
|
visuStriscia: true,
|
|
|
|
|
modalitaPartita: "3/5",
|
|
|
|
|
sp: {
|
2026-05-12 13:49:47 +02:00
|
|
|
striscia: [{ serv: 'home', r: [] }],
|
2026-02-10 00:42:48 +01:00
|
|
|
servHome: true,
|
|
|
|
|
punt: { home: 0, guest: 0 },
|
|
|
|
|
set: { home: 0, guest: 0 },
|
|
|
|
|
nomi: { home: "Antoniana", guest: "Guest" },
|
|
|
|
|
form: {
|
|
|
|
|
home: ["1", "2", "3", "4", "5", "6"],
|
|
|
|
|
guest: ["1", "2", "3", "4", "5", "6"],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function checkVittoria(state) {
|
|
|
|
|
const puntHome = state.sp.punt.home
|
|
|
|
|
const puntGuest = state.sp.punt.guest
|
|
|
|
|
const setHome = state.sp.set.home
|
|
|
|
|
const setGuest = state.sp.set.guest
|
|
|
|
|
const totSet = setHome + setGuest
|
|
|
|
|
|
2026-05-12 13:49:47 +02:00
|
|
|
const isSetDecisivo = state.modalitaPartita === "2/3" ? totSet >= 2 : totSet >= 4
|
2026-02-10 00:42:48 +01:00
|
|
|
const punteggioVittoria = isSetDecisivo ? 15 : 25
|
|
|
|
|
|
2026-05-12 13:49:47 +02:00
|
|
|
if (puntHome >= punteggioVittoria && puntHome - puntGuest >= 2) return true
|
|
|
|
|
if (puntGuest >= punteggioVittoria && puntGuest - puntHome >= 2) return true
|
2026-02-10 00:42:48 +01:00
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function applyAction(state, action) {
|
2026-05-12 12:22:26 +02:00
|
|
|
const s = structuredClone(state)
|
2026-02-10 00:42:48 +01:00
|
|
|
|
|
|
|
|
switch (action.type) {
|
|
|
|
|
case "incPunt": {
|
|
|
|
|
const team = action.team
|
|
|
|
|
if (checkVittoria(s)) break
|
|
|
|
|
|
2026-05-12 12:22:26 +02:00
|
|
|
const cambioPalla = (team === "home") !== s.sp.servHome
|
2026-02-10 00:42:48 +01:00
|
|
|
s.sp.punt[team]++
|
2026-05-12 13:49:47 +02:00
|
|
|
s.sp.striscia.at(-1).r.push(team)
|
2026-02-10 00:42:48 +01:00
|
|
|
|
|
|
|
|
if (cambioPalla) {
|
|
|
|
|
s.sp.form[team].push(s.sp.form[team].shift())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s.sp.servHome = team === "home"
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "decPunt": {
|
2026-05-12 13:49:47 +02:00
|
|
|
const currentSet = s.sp.striscia.at(-1)
|
|
|
|
|
if (currentSet.r.length === 0) break
|
|
|
|
|
|
|
|
|
|
const lastScorer = currentSet.r[currentSet.r.length - 1]
|
|
|
|
|
const prevServer = currentSet.r.length >= 2
|
|
|
|
|
? currentSet.r[currentSet.r.length - 2]
|
|
|
|
|
: currentSet.serv
|
|
|
|
|
|
|
|
|
|
const wasCambioPalla = lastScorer !== prevServer
|
|
|
|
|
|
|
|
|
|
currentSet.r.pop()
|
|
|
|
|
s.sp.punt[lastScorer]--
|
|
|
|
|
s.sp.servHome = prevServer === 'home'
|
|
|
|
|
|
|
|
|
|
if (wasCambioPalla) {
|
|
|
|
|
s.sp.form[lastScorer].unshift(s.sp.form[lastScorer].pop())
|
2026-02-10 00:42:48 +01:00
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "incSet": {
|
|
|
|
|
const team = action.team
|
|
|
|
|
if (s.sp.set[team] === 2) {
|
|
|
|
|
s.sp.set[team] = 0
|
|
|
|
|
} else {
|
|
|
|
|
s.sp.set[team]++
|
|
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-12 13:18:18 +02:00
|
|
|
case "nuovoSet": {
|
|
|
|
|
const team = action.team
|
|
|
|
|
if (team !== 'home' && team !== 'guest') break
|
|
|
|
|
s.sp.set[team]++
|
|
|
|
|
s.sp.punt.home = 0
|
|
|
|
|
s.sp.punt.guest = 0
|
2026-05-12 13:49:47 +02:00
|
|
|
s.sp.servHome = team === 'home'
|
|
|
|
|
s.sp.striscia.push({ serv: team, r: [] })
|
2026-05-12 13:18:18 +02:00
|
|
|
s.sp.form = {
|
|
|
|
|
home: ["1", "2", "3", "4", "5", "6"],
|
|
|
|
|
guest: ["1", "2", "3", "4", "5", "6"],
|
|
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-10 00:42:48 +01:00
|
|
|
case "cambiaPalla": {
|
|
|
|
|
if (s.sp.punt.home === 0 && s.sp.punt.guest === 0) {
|
|
|
|
|
s.sp.servHome = !s.sp.servHome
|
2026-05-12 13:49:47 +02:00
|
|
|
s.sp.striscia.at(-1).serv = s.sp.servHome ? 'home' : 'guest'
|
2026-02-10 00:42:48 +01:00
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "resetta": {
|
|
|
|
|
s.visuForm = false
|
|
|
|
|
s.sp.punt.home = 0
|
|
|
|
|
s.sp.punt.guest = 0
|
2026-02-12 15:13:04 +01:00
|
|
|
s.sp.set.home = 0
|
|
|
|
|
s.sp.set.guest = 0
|
2026-02-10 00:42:48 +01:00
|
|
|
s.sp.form = {
|
|
|
|
|
home: ["1", "2", "3", "4", "5", "6"],
|
|
|
|
|
guest: ["1", "2", "3", "4", "5", "6"],
|
|
|
|
|
}
|
2026-05-12 13:49:47 +02:00
|
|
|
s.sp.striscia = [{ serv: s.sp.servHome ? 'home' : 'guest', r: [] }]
|
2026-02-10 00:42:48 +01:00
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "toggleFormazione": {
|
|
|
|
|
s.visuForm = !s.visuForm
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "toggleStriscia": {
|
|
|
|
|
s.visuStriscia = !s.visuStriscia
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "toggleOrder": {
|
|
|
|
|
s.order = !s.order
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "setNomi": {
|
|
|
|
|
if (action.home !== undefined) s.sp.nomi.home = action.home
|
|
|
|
|
if (action.guest !== undefined) s.sp.nomi.guest = action.guest
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "setModalita": {
|
|
|
|
|
s.modalitaPartita = action.modalita
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "setFormazione": {
|
|
|
|
|
if (action.team && action.form) {
|
|
|
|
|
s.sp.form[action.team] = [...action.form]
|
|
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "confermaCambi": {
|
|
|
|
|
const team = action.team
|
|
|
|
|
const cambi = action.cambi || []
|
|
|
|
|
const form = s.sp.form[team].map((val) => String(val).trim())
|
|
|
|
|
const formAggiornata = [...form]
|
|
|
|
|
|
|
|
|
|
let valid = true
|
|
|
|
|
for (const cambio of cambi) {
|
|
|
|
|
const cin = (cambio.in || "").trim()
|
|
|
|
|
const cout = (cambio.out || "").trim()
|
|
|
|
|
if (!cin || !cout) continue
|
|
|
|
|
if (!/^\d+$/.test(cin) || !/^\d+$/.test(cout)) { valid = false; break }
|
|
|
|
|
if (cin === cout) { valid = false; break }
|
|
|
|
|
if (formAggiornata.includes(cin)) { valid = false; break }
|
|
|
|
|
if (!formAggiornata.includes(cout)) { valid = false; break }
|
|
|
|
|
|
|
|
|
|
const idx = formAggiornata.findIndex((val) => String(val).trim() === cout)
|
|
|
|
|
if (idx !== -1) {
|
|
|
|
|
formAggiornata.splice(idx, 1, cin)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (valid) {
|
|
|
|
|
s.sp.form[team] = formAggiornata
|
|
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return s
|
|
|
|
|
}
|