import { createFileRoute, Link } from "@tanstack/react-router"; import { Flame, ChevronRight } from "lucide-react"; import { EventoCard, linkPerEvento } from "@/components/crapp/EventoCard"; import { PromemoriaPalloni } from "@/components/crapp/PromemoriaPalloni"; import { ScoutEntry } from "@/components/crapp/ScoutEntry"; import { Section, StatTile, TeamLogo } from "@/components/crapp/ui-bits"; import { CompletaProfilo } from "@/components/crapp/ProfiloAmministrativo"; import { Reveal } from "@/components/motion/Reveal"; import { Barra } from "@/components/motion/Barra"; import { Numero } from "@/components/motion/Numero"; import { microcopyObiettivo, progressoObiettivo } from "@/lib/obiettivi"; import { useEventi, type Evento } from "@/lib/eventi"; import { useIo, useObiettivi } from "@/lib/rosa"; import { useCsi } from "@/lib/csi"; import { isNostraSquadra, matchDaPartitaCsi, partiteGiocate } from "@/lib/csi-core"; import { useScoutMatches } from "@/lib/scout-store"; import { useVotiMvp, vincitoriMvp } from "@/lib/mvp-voti"; export const Route = createFileRoute("/")({ head: () => ({ meta: [ { title: "CrAPP — L'app del CRAP Volley" }, { name: "description", content: "Convocazioni, presenze, statistiche e classifica del CRAP Volley in un'unica app mobile.", }, { property: "og:title", content: "CrAPP — L'app del CRAP Volley" }, { property: "og:description", content: "Convocazioni, presenze, statistiche e classifica del CRAP Volley in un'unica app mobile.", }, ], }), component: Index, }); function Index() { const giocatore = useIo(); const { eventi } = useEventi(); const oggi = new Date().toISOString().slice(0, 10); const prossimi: Evento[] = eventi.filter((e) => e.data >= oggi).slice(0, 3); const prossimo = prossimi[0] ?? null; const linkProssimo = prossimo ? linkPerEvento(prossimo) : null; const { data: csi } = useCsi(); const noi = csi?.classifica.find((r) => isNostraSquadra(r.squadra)); const scoutMatches = useScoutMatches(); const votiMvp = useVotiMvp(); const mvpPerMatch = vincitoriMvp(votiMvp.data ?? []); const csiGiocate = csi ? partiteGiocate(csi.partite) : []; const ultima = csiGiocate[0] ? { ...matchDaPartitaCsi(csiGiocate[0]), mvp: mvpPerMatch[csiGiocate[0].id] ?? "" } : scoutMatches[0] ? { ...scoutMatches[0], mvp: mvpPerMatch[scoutMatches[0].id] ?? "" } : null; const obiettivi = useObiettivi(); const obiettivo = obiettivi.find((o) => progressoObiettivo(o) < 100) ?? obiettivi[0] ?? null; const eventoUltima = ultima ? (eventi.find((e) => e.tipo === "partita" && e.data === ultima.data) ?? null) : null; if (!giocatore) return null; return ( <>

Ciao {giocatore.nome.split(" ")[0]}

CrAPP

{noi ? `${noi.pos}º` : "—"}

In classifica

{noi ? `${noi.vinte}-${noi.perse}` : "—"}

Bilancio

{giocatore.streak}

Streak

Calendario } > {prossimo ? ( ) : (

Nessun impegno in programma.

)}
{prossimi.slice(1).map((e) => { const link = linkPerEvento(e); return ; })}
Storico } > {ultima ? ( (() => { const corpo = ( <>

CRAP Volley vs {ultima.avversario}

{ultima.casa ? "In casa" : "Trasferta"} {ultima.mvp ? ` · MVP ${ultima.mvp}` : " · MVP da votare"}

{ultima.setNostri}-{ultima.setLoro}

{ultima.parziali.map((p, i) => ( {p[0]}-{p[1]} ))}
); return eventoUltima ? ( {corpo} ) : (
{corpo}
); })() ) : (

Nessun risultato disponibile.

)}
Tutti } > {obiettivo ? (
{obiettivo.emoji} {obiettivo.titolo}

Siamo al —{" "} {obiettivo.valore}/{obiettivo.target} {obiettivo.unita}.

{microcopyObiettivo(obiettivo)}

{obiettivo.impatto}

) : null}
); }