Chiude il sondaggio cacche al fischio d'inizio, non solo il giorno dopo

sondaggioAperto() restava aperto per sempre una volta passate le 8:00 del
giorno della partita, anche nei giorni successivi. Ora chiude esattamente
all'ora di inizio (partita alle 21:00 → aperto fino alle 20:59, poi chiuso
anche nei giorni seguenti), richiedendo anche l'ora dell'evento oltre alla
data.

Aggiunta sondaggioTerminato() per distinguere nel messaggio "non ancora
aperto" da "già chiuso": altrimenti dopo la partita l'utente avrebbe
continuato a leggere "apre alle 8:00".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 16:59:50 +02:00
co-authored by Claude Sonnet 5
parent 9cc63b7854
commit b4878b7795
5 changed files with 113 additions and 17 deletions
+13 -3
View File
@@ -7,7 +7,13 @@ import { nomeCompleto, useGiocatoriSquadra } from "@/lib/giocatori-squadra";
import { useGiocatoreCorrente } from "@/lib/user-store";
import { intestazioniAutenticate } from "@/lib/auth";
import { useIsAdmin } from "@/lib/ruoli";
import { mediaPartita, sondaggioAperto, useCacche, useSalvaCacche } from "@/lib/cacche";
import {
mediaPartita,
sondaggioAperto,
sondaggioTerminato,
useCacche,
useSalvaCacche,
} from "@/lib/cacche";
const opzioni = [0, 1, 2, 3, 4, 5];
@@ -15,9 +21,11 @@ const opzioni = [0, 1, 2, 3, 4, 5];
export function SondaggioCacche({
eventoId,
dataEvento,
oraEvento,
}: {
eventoId: string;
dataEvento: string;
oraEvento: string;
}) {
const io = useGiocatoreCorrente();
const { righe } = useCacche();
@@ -69,14 +77,16 @@ export function SondaggioCacche({
}
}
if (!sondaggioAperto(dataEvento)) {
if (!sondaggioAperto(dataEvento, oraEvento)) {
return (
<Card>
<p className="text-xs font-bold uppercase tracking-wide text-muted-foreground">
💩 Sondaggio pre-partita
</p>
<p className="mt-1 text-xs text-muted-foreground">
Apre alle 8:00 del giorno della partita: riceverai una notifica.
{sondaggioTerminato(dataEvento, oraEvento)
? "Sondaggio chiuso: era aperto fino al fischio d'inizio."
: "Apre alle 8:00 del giorno della partita: riceverai una notifica."}
</p>
</Card>
);
+33 -4
View File
@@ -5,11 +5,40 @@ import { oggiISO } from "./palloni-core";
/** Ora di apertura del sondaggio, il giorno stesso della partita. */
export const ORA_APERTURA_SONDAGGIO = 8;
/** Il sondaggio apre alle 8:00 del giorno della partita e da lì resta aperto. */
export function sondaggioAperto(dataEvento: string, adesso = new Date()): boolean {
/** Istante del fischio d'inizio: `oraEvento` mancante equivale a fine giornata (non chiude mai prima). */
function inizioPartita(dataEvento: string, oraEvento: string): number {
return new Date(`${dataEvento}T${oraEvento || "23:59"}:00`).getTime();
}
/** Il sondaggio apre alle 8:00 del giorno della partita e chiude al fischio d'inizio. */
export function sondaggioAperto(
dataEvento: string,
oraEvento: string,
adesso = new Date(),
): boolean {
if (dataEvento !== oggiISO(adesso)) return false;
const apertura = new Date(`${dataEvento}T00:00:00`);
apertura.setHours(ORA_APERTURA_SONDAGGIO, 0, 0, 0);
return (
adesso.getTime() >= apertura.getTime() &&
adesso.getTime() < inizioPartita(dataEvento, oraEvento)
);
}
/**
* True se il fischio d'inizio è già passato (oggi o in un giorno precedente): serve a
* distinguere, nel messaggio mostrato quando il sondaggio è chiuso, "non ancora aperto"
* da "già chiuso" — altrimenti dopo la partita si continuerebbe a dire "apre alle 8:00".
*/
export function sondaggioTerminato(
dataEvento: string,
oraEvento: string,
adesso = new Date(),
): boolean {
const oggi = oggiISO(adesso);
if (dataEvento !== oggi) return dataEvento < oggi;
return adesso.getHours() >= ORA_APERTURA_SONDAGGIO;
if (dataEvento < oggi) return true;
if (dataEvento > oggi) return false;
return adesso.getTime() >= inizioPartita(dataEvento, oraEvento);
}
/** Sondaggio goliardico pre-partita: quante cacche prima del match di campionato. */
+1 -1
View File
@@ -197,7 +197,7 @@ function PartitaDetail() {
</Section>
<Section titolo="Sondaggio pre-partita">
<SondaggioCacche eventoId={evento.id} dataEvento={evento.data} />
<SondaggioCacche eventoId={evento.id} dataEvento={evento.data} oraEvento={evento.ora} />
</Section>
{match ? (