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:
@@ -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) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user