2026-08-06 08:36:47 +02:00
|
|
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
|
|
import { supabase } from "@/integrations/supabase/client";
|
|
|
|
|
import { completaTurni } from "./palloni-core";
|
|
|
|
|
import { useEventi } from "./eventi";
|
2026-09-03 10:16:52 +02:00
|
|
|
import { nomeCompleto, useGiocatoriSquadra } from "./giocatori-squadra";
|
2026-08-06 08:36:47 +02:00
|
|
|
|
|
|
|
|
export const TURNI_KEY = ["turni-palloni"] as const;
|
|
|
|
|
|
|
|
|
|
type RigaTurno = {
|
|
|
|
|
evento_id: string;
|
|
|
|
|
giocatore_id: string;
|
|
|
|
|
aggiornato_da: string | null;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
async function fetchTurni(): Promise<Record<string, string>> {
|
|
|
|
|
const { data, error } = await supabase
|
|
|
|
|
.from("turni_palloni")
|
|
|
|
|
.select("evento_id, giocatore_id, aggiornato_da");
|
|
|
|
|
if (error) throw error;
|
|
|
|
|
const mappa: Record<string, string> = {};
|
|
|
|
|
for (const riga of (data ?? []) as RigaTurno[]) mappa[riga.evento_id] = riga.giocatore_id;
|
|
|
|
|
return mappa;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Turni salvati + proposta automatica a rotazione per gli eventi non ancora assegnati. */
|
|
|
|
|
export function useTurniPalloni() {
|
|
|
|
|
// Cambia raramente: una lettura per sessione è sufficiente.
|
|
|
|
|
const query = useQuery({ queryKey: TURNI_KEY, queryFn: fetchTurni, staleTime: 30 * 60_000 });
|
|
|
|
|
const { eventi } = useEventi();
|
2026-09-03 10:16:52 +02:00
|
|
|
const { righe: squadra } = useGiocatoriSquadra();
|
2026-08-06 08:36:47 +02:00
|
|
|
const salvati = query.data ?? {};
|
2026-09-03 10:16:52 +02:00
|
|
|
const rosa = squadra.filter((g) => g.attivo).map((g) => ({ id: g.id, nome: nomeCompleto(g) }));
|
|
|
|
|
return { ...query, salvati, turni: completaTurni(salvati, eventi, rosa) };
|
2026-08-06 08:36:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useAssegnaTurno() {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: async (input: { eventoId: string; giocatoreId: string; da: string | null }) => {
|
|
|
|
|
const { error } = await supabase.from("turni_palloni").upsert(
|
|
|
|
|
{
|
|
|
|
|
evento_id: input.eventoId,
|
|
|
|
|
giocatore_id: input.giocatoreId,
|
|
|
|
|
aggiornato_da: input.da,
|
|
|
|
|
aggiornato_il: new Date().toISOString(),
|
|
|
|
|
},
|
|
|
|
|
{ onConflict: "evento_id" },
|
|
|
|
|
);
|
|
|
|
|
if (error) throw error;
|
|
|
|
|
return input;
|
|
|
|
|
},
|
|
|
|
|
// Scrittura unica + aggiornamento cache locale, senza rilettura.
|
|
|
|
|
onSuccess: (input) => {
|
|
|
|
|
queryClient.setQueryData<Record<string, string>>(TURNI_KEY, (prec) => ({
|
|
|
|
|
...(prec ?? {}),
|
|
|
|
|
[input.eventoId]: input.giocatoreId,
|
|
|
|
|
}));
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|