import { createFileRoute } from "@tanstack/react-router"; import { MapPin, Clock, Users, Trophy, Swords, Download } from "lucide-react"; import { cn } from "@/lib/utils"; import { Card, PageHeader, Section } from "@/components/crapp/ui-bits"; import { formatData } from "@/lib/crapp-data"; import { convocatiEvento, useEvento } from "@/lib/eventi"; import { useRosa } from "@/lib/rosa"; import { useCsi } from "@/lib/csi"; import { matchDaPartitaCsi, partiteGiocate } from "@/lib/csi-core"; import { Pagelle } from "@/components/crapp/Pagelle"; import { SondaggioCacche } from "@/components/crapp/SondaggioCacche"; import { ScoutEntry } from "@/components/crapp/ScoutEntry"; import { useScoutMatches, totaliPerGiocatore, totaliSquadra } from "@/lib/scout-store"; import { csvScoutMatch, scaricaCsv } from "@/lib/scout-export"; import { useGiocatoreCorrente } from "@/lib/user-store"; import { useIsAdmin } from "@/lib/ruoli"; import { VotazioneMvp } from "@/components/crapp/VotazioneMvp"; import { VotoSocial } from "@/components/crapp/VotoSocial"; import { TurnoPalloni } from "@/components/crapp/TurnoPalloni"; import { RosaPresenze } from "@/components/crapp/RosaPresenze"; import { usePresenzeEvento } from "@/lib/presenze"; export const Route = createFileRoute("/partita/$id")({ head: () => { const titolo = "Dettaglio partita"; return { meta: [ { title: `${titolo} — CrAPP` }, { name: "description", content: "Dettaglio partita, formazione e risultati del CRAP Volley.", }, { property: "og:title", content: `${titolo} — CrAPP` }, { property: "og:description", content: "Dettaglio partita, formazione e risultati del CRAP Volley.", }, { property: "og:type", content: "website" }, { name: "twitter:card", content: "summary" }, ], }; }, component: PartitaDetail, }); function PartitaDetail() { const { id } = Route.useParams(); const { evento } = useEvento(id); const io = useGiocatoreCorrente(); const admin = useIsAdmin(); const scoutMatches = useScoutMatches(); const { data: csi } = useCsi(); const { risposte } = usePresenzeEvento(id); const rosa = useRosa(); const presentiVeri = rosa.filter( (g) => risposte[g.id] === "presente" || risposte[g.id] === "ritardo", ).length; if (!evento) { return (

Partita non trovata

); } const convocati = convocatiEvento(evento, rosa); const scout = scoutMatches.find((m) => m.id === evento.id || m.data === evento.data) ?? null; const csiMatch = csi ? partiteGiocate(csi.partite).find((p) => p.data === evento.data) : undefined; const match = scout ? { id: scout.id, data: scout.data, avversario: scout.avversario, casa: scout.casa, setNostri: scout.setNostri, setLoro: scout.setLoro, parziali: scout.parziali, } : csiMatch ? matchDaPartitaCsi(csiMatch) : undefined; const totaliTeam = scout ? totaliSquadra([scout]) : null; const avversario = evento.titolo.includes(" vs ") ? (evento.titolo.split(" vs ").find((p) => !p.includes("CRAP")) ?? evento.titolo) : evento.titolo; const casa = evento.casa; const vinta = match && match.setNostri > match.setLoro; return ( <>
{casa ? : }

{casa ? "In casa" : "Fuori casa"} {evento.campionato ? " · Campionato" : " · Amichevole"}

{avversario}

{evento.ora} {evento.luogo}
{evento.note ? (

{evento.note}

) : null}
Conferme: {presentiVeri}/{convocati.length}
{match ? (
CRAP Volley {match.setNostri} - {match.setLoro} {avversario}
{match.parziali.map(([noi, loro], i) => (
{noi} Set {i + 1} {loro}
))}

MVP eletto dalla squadra

) : null} {match ? (
) : (

La partita non è ancora stata disputata. Torna qui dopo il fischio finale per vedere il risultato.

)}
{match ? (
) : null} {scout && totaliTeam ? (
{[ { l: "Punti", v: totaliTeam.punti }, { l: "Ace", v: totaliTeam.ace }, { l: "Muri", v: totaliTeam.muri }, { l: "Errori", v: totaliTeam.errori }, ].map((t) => (

{t.v}

{t.l}

))}

Dettaglio giocatori (uso interno allenatori)

{[...totaliPerGiocatore(scout.azioni).entries()].map(([gid, t]) => { const g = rosa.find((x) => x.id === gid); if (!g) return null; return (
#{g.numero} {g.nome} {t.punti}P · {t.ace}A · {t.muri}M · {t.errori}E
); })}
{admin ? ( ) : null}
) : null}
); }