Evita di calcolare le statistiche di tutta la rosa dove serve solo l'anagrafica

LinkProfilo (header di ogni pagina) e il Calendario (compleanni del mese) usavano
useIo/useRosa, che calcola MVP, pagelle, cacche, palloni e infortuni per l'intera
squadra tramite 6 hook e un useMemo pesante - anche se a entrambi serviva solo
id/nome/nascita/iniziali. Il Calendario in particolare pagava questo costo ad ogni
apertura solo per i compleanni del mese.

- crapp-data.ts: esporta inizialiDa, già usata internamente per il fallback avatar.
- ui-bits.tsx: LinkProfilo usa useGiocatoreBase (sola anagrafica) invece di useIo.
- rosa.ts: nuovo hook useAnagraficaRosa (id, nome, nascita) senza gli altri 5 hook
  statistici ne' il useMemo su tutta la rosa.
- eventi.ts: compleanniEventi accetta solo i tre campi che usa, non l'intero
  Giocatore.
- calendario.tsx: usa useAnagraficaRosa al posto di useRosa.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 09:47:31 +02:00
co-authored by Claude Sonnet 5
parent 08b00627e5
commit 82b6c6b333
6 changed files with 81 additions and 11 deletions
+2 -1
View File
@@ -73,7 +73,8 @@ const rosaCSI: Rosa[] = [
{ nome: "Giada Valbonesi", nascita: "1994-05-20", ruolo: "Opposto", numero: 10 },
];
function inizialiDa(nome: string) {
/** Iniziali da un nome completo (max 2 lettere), es. per il fallback di `Avatar`. */
export function inizialiDa(nome: string) {
return nome
.split(" ")
.map((p) => p[0] ?? "")
+12 -2
View File
@@ -162,8 +162,18 @@ export function useEliminaEvento() {
});
}
/** Compleanni della rosa, come eventi di calendario dell'anno indicato. */
export function compleanniEventi(rosa: Giocatore[], anno = new Date().getFullYear()): Evento[] {
/**
* Compleanni della rosa, come eventi di calendario dell'anno indicato.
*
* Prende solo i tre campi che usa (non l'intero `Giocatore`): il Calendario li
* legge da un'anagrafica leggera per non tirarsi dietro tutte le statistiche
* (MVP, pagelle, cacche, palloni, infortuni) di `useRosa` solo per le date di
* nascita.
*/
export function compleanniEventi(
rosa: Array<Pick<Giocatore, "id" | "nome" | "nascita">>,
anno = new Date().getFullYear(),
): Evento[] {
return rosa
.filter((g) => g.nascita)
.map((g) => {
+17
View File
@@ -24,6 +24,23 @@ function iniziali(nome: string, cognome: string): string {
return `${nome[0] ?? ""}${cognome[0] ?? ""}`.toUpperCase();
}
/**
* Solo anagrafica (id, nome, data di nascita) dei giocatori attivi — es. per i
* compleanni nel Calendario. A differenza di `useRosa` non legge MVP, pagelle,
* cacche, palloni né infortuni: evita di montare quei cinque hook e il relativo
* `useMemo` solo per una data di nascita.
*/
export function useAnagraficaRosa(): Array<Pick<Giocatore, "id" | "nome" | "nascita">> {
const { righe: squadra } = useGiocatoriSquadra();
return useMemo(
() =>
squadra
.filter((g) => g.attivo)
.map((g) => ({ id: g.id, nome: nomeCompleto(g), nascita: nascitaPerId[g.id] ?? "" })),
[squadra],
);
}
/**
* Rosa completa con tutte le statistiche personali (presenze, MVP, media voto,
* palloni, infortuni, ritardi, cacche). Legge l'anagrafica da `giocatori_squadra`