Refactor event registration logic in EventsPageSection: Introduce useRef to track initial data usage, preventing unnecessary API calls when user session changes. Update loading and error handling to enhance user experience during event registration.

This commit is contained in:
Julien Froidefond
2025-12-09 22:18:31 +01:00
parent b643e283fa
commit fb5c8c1466

View File

@@ -1,6 +1,6 @@
"use client"; "use client";
import { useState, useEffect, useMemo } from "react"; import { useState, useEffect, useMemo, useRef } from "react";
import { useSession } from "next-auth/react"; import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
@@ -84,13 +84,16 @@ export default function EventsPageSection({
const [loading, setLoading] = useState<Record<string, boolean>>({}); const [loading, setLoading] = useState<Record<string, boolean>>({});
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
const [currentMonth, setCurrentMonth] = useState(new Date()); const [currentMonth, setCurrentMonth] = useState(new Date());
// Déterminer si on a des données initiales valides // Déterminer si on a des données initiales valides
const hasInitialData = useMemo( const hasInitialData = useMemo(
() => Object.keys(initialRegistrations).length > 0, () => Object.keys(initialRegistrations).length > 0,
[initialRegistrations] [initialRegistrations]
); );
// Ref pour tracker si on a déjà utilisé les données initiales
const hasUsedInitialData = useRef(hasInitialData);
// Séparer et trier les événements (du plus récent au plus ancien) // Séparer et trier les événements (du plus récent au plus ancien)
const upcomingEvents = events const upcomingEvents = events
.filter((e) => e.status === "UPCOMING" || e.status === "LIVE") .filter((e) => e.status === "UPCOMING" || e.status === "LIVE")
@@ -115,21 +118,27 @@ export default function EventsPageSection({
eventsByDate[dateKey].push(event); eventsByDate[dateKey].push(event);
}); });
// Synchroniser les inscriptions si la session change côté client // Mettre à jour le ref quand on a des données initiales
// Ne charger que si on n'a pas de données initiales (cas où l'utilisateur se connecte après le chargement)
useEffect(() => { useEffect(() => {
// Si on a déjà des données initiales, ne jamais les écraser
if (hasInitialData) { if (hasInitialData) {
hasUsedInitialData.current = true;
}
}, [hasInitialData]);
// Ne charger depuis l'API que si on n'a pas de données initiales
// (cas où l'utilisateur se connecte après le chargement de la page)
useEffect(() => {
// Si on a déjà des données initiales, ne jamais charger depuis l'API
if (hasUsedInitialData.current) {
return; return;
} }
// Si pas de session, réinitialiser seulement si on n'avait pas de données initiales // Si pas de session, ne rien faire (on garde les données vides)
if (!session?.user?.id) { if (!session?.user?.id) {
setRegistrations({});
return; return;
} }
// Charger les inscriptions seulement si on n'a pas de données initiales // Charger les inscriptions depuis l'API seulement si on n'a pas de données initiales
const checkRegistrations = async () => { const checkRegistrations = async () => {
const upcomingOnlyEvents = events.filter((e) => e.status === "UPCOMING"); const upcomingOnlyEvents = events.filter((e) => e.status === "UPCOMING");
const registrationChecks = upcomingOnlyEvents.map(async (event) => { const registrationChecks = upcomingOnlyEvents.map(async (event) => {
@@ -152,7 +161,7 @@ export default function EventsPageSection({
}; };
checkRegistrations(); checkRegistrations();
}, [session?.user?.id, events, hasInitialData]); }, [session?.user?.id, events]);
// Fonctions pour le calendrier // Fonctions pour le calendrier
const getDaysInMonth = (date: Date) => { const getDaysInMonth = (date: Date) => {