import { createFileRoute, Link } from "@tanstack/react-router"; import { ChevronRight, RefreshCw } from "lucide-react"; import { cn } from "@/lib/utils"; import { formatData } from "@/lib/crapp-data"; import { PageHeader } from "@/components/crapp/ui-bits"; import { BarraSottosezioni } from "@/components/crapp/BarraSottosezioni"; import { useScoutMatches } from "@/lib/scout-store"; import { useCsi } from "@/lib/csi"; import { isNostraSquadra, matchDaPartitaCsi, partiteGiocate } from "@/lib/csi-core"; import { useVotiMvp, vincitoriMvp } from "@/lib/mvp-voti"; import { useEventi } from "@/lib/eventi"; export const Route = createFileRoute("/classifica")({ head: () => ({ meta: [ { title: "Classifica campionato — CrAPP" }, { name: "description", content: "Classifica e risultati del girone CSI seguiti in tempo reale dal CRAP Volley.", }, { property: "og:title", content: "Classifica campionato — CrAPP" }, { property: "og:description", content: "Posizioni, set e risultati aggiornati del girone." }, ], }), component: Classifica, }); function formatAggiornamento(iso: string) { const d = new Date(iso); const oggi = new Date().toDateString() === d.toDateString(); const ora = d.toLocaleTimeString("it-IT", { hour: "2-digit", minute: "2-digit" }); return oggi ? `oggi alle ${ora}` : `il ${d.toLocaleDateString("it-IT")} alle ${ora}`; } function Classifica() { const scoutMatches = useScoutMatches(); const { data: csi } = useCsi(); const votiMvp = useVotiMvp(); const mvpPerMatch = vincitoriMvp(votiMvp.data ?? []); const { eventi } = useEventi(); const classifica = csi?.classifica ?? []; const csiGiocate = csi ? partiteGiocate(csi.partite) : []; const eventoIdPerData = new Map( eventi.filter((e) => e.tipo === "partita").map((e) => [e.data, e.id]), ); const tuttiMatch = csiGiocate.length ? csiGiocate.map((p) => ({ ...matchDaPartitaCsi(p), mvp: mvpPerMatch[p.id] ?? "", scout: false, })) : scoutMatches.map((m) => ({ id: m.id, data: m.data, avversario: m.avversario, casa: m.casa, setNostri: m.setNostri, setLoro: m.setLoro, parziali: m.parziali, mvp: mvpPerMatch[m.id] ?? "", scout: true, })); return ( <>
{csi ? `Dati CSI aggiornati ${formatAggiornamento(csi.aggiornato)}` : "Dati CSI in arrivo"}
# Squadra G Set Pt
{classifica.length === 0 ? (

Classifica non ancora disponibile.

) : ( classifica.map((r) => { const noi = isNostraSquadra(r.squadra) || r.squadra === "CRAP Volley"; return (
{r.pos} {r.squadra} {r.giocate} {r.setFatti}:{r.setSubiti} {r.punti}
); }) )}
), }, { id: "storico", label: "Storico partite", contenuto: tuttiMatch.length === 0 ? (

Nessuna partita disponibile.

) : (
{tuttiMatch.map((m) => { const vinta = m.setNostri > m.setLoro; const eventoId = eventoIdPerData.get(m.data); const contenuto = ( <>

{m.casa ? "CRAP Volley" : m.avversario} vs{" "} {m.casa ? m.avversario : "CRAP Volley"}

{formatData(m.data)} · MVP {m.mvp || "da votare"} {m.scout ? " · scoutata" : ""}

{m.setNostri}-{m.setLoro}
{m.parziali.map((p, i) => ( p[1] ? "bg-secondary" : "bg-muted text-muted-foreground", )} > {p[0]}-{p[1]} ))} {eventoId && !m.mvp ? ( Vota MVP ) : null}
); return eventoId ? ( {contenuto} ) : (
{contenuto}
); })}
), }, ]} /> ); }