fix: resolve React Hook dependency warnings in useEffect

Fixed all 5 ESLint warnings by wrapping functions with useCallback and adding proper dependencies:
- app/admin/tirages/page.tsx: checkExistingDraw, loadParticipants
- app/admin/utilisateurs/[id]/page.tsx: loadUserDetails
- app/historique/page.tsx: loadUserTickets, filterTickets
- app/mes-lots/page.tsx: loadTickets
- components/admin/UserManagement.tsx: loadUsers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
soufiane 2025-11-21 01:48:26 +01:00
parent 00776a1d74
commit aee6658cd7
5 changed files with 54 additions and 54 deletions

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { useState, useEffect } from 'react'; import { useState, useEffect, useCallback } from 'react';
import { Card } from '@/components/ui/Card'; import { Card } from '@/components/ui/Card';
import Button from '@/components/Button'; import Button from '@/components/Button';
import toast from 'react-hot-toast'; import toast from 'react-hot-toast';
@ -79,13 +79,7 @@ export default function TiragesPage() {
const [prizeValue, setPrizeValue] = useState('360'); const [prizeValue, setPrizeValue] = useState('360');
const [allowRedraw, setAllowRedraw] = useState(false); const [allowRedraw, setAllowRedraw] = useState(false);
useEffect(() => { const checkExistingDraw = useCallback(async () => {
checkExistingDraw();
// Charger automatiquement les participants au chargement de la page
loadParticipants();
}, []);
const checkExistingDraw = async () => {
try { try {
const token = localStorage.getItem('auth_token') || localStorage.getItem('token'); const token = localStorage.getItem('auth_token') || localStorage.getItem('token');
const response = await fetch(`${API_BASE_URL}/draw/check-existing`, { const response = await fetch(`${API_BASE_URL}/draw/check-existing`, {
@ -102,9 +96,9 @@ export default function TiragesPage() {
} catch (error) { } catch (error) {
console.error('Erreur:', error); console.error('Erreur:', error);
} }
}; }, []);
const loadParticipants = async () => { const loadParticipants = useCallback(async () => {
setLoading(true); setLoading(true);
try { try {
const token = localStorage.getItem('auth_token') || localStorage.getItem('token'); const token = localStorage.getItem('auth_token') || localStorage.getItem('token');
@ -128,7 +122,13 @@ export default function TiragesPage() {
} finally { } finally {
setLoading(false); setLoading(false);
} }
}; }, [minTickets, verifiedOnly]);
useEffect(() => {
checkExistingDraw();
// Charger automatiquement les participants au chargement de la page
loadParticipants();
}, [checkExistingDraw, loadParticipants]);
const conductDraw = async () => { const conductDraw = async () => {
if (participants.length === 0) { if (participants.length === 0) {

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { useState, useEffect } from 'react'; import { useState, useEffect, useCallback } from 'react';
import { useRouter, useParams } from 'next/navigation'; import { useRouter, useParams } from 'next/navigation';
import { adminService } from '@/services/admin.service'; import { adminService } from '@/services/admin.service';
import { User } from '@/types'; import { User } from '@/types';
@ -16,11 +16,7 @@ export default function UserDetailsPage() {
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
useEffect(() => { const loadUserDetails = useCallback(async () => {
loadUserDetails();
}, [userId]);
const loadUserDetails = async () => {
try { try {
setLoading(true); setLoading(true);
setError(null); setError(null);
@ -32,7 +28,11 @@ export default function UserDetailsPage() {
} finally { } finally {
setLoading(false); setLoading(false);
} }
}; }, [userId]);
useEffect(() => {
loadUserDetails();
}, [loadUserDetails]);
const getRoleBadgeColor = (role: string) => { const getRoleBadgeColor = (role: string) => {
switch (role) { switch (role) {

View File

@ -1,5 +1,5 @@
"use client"; "use client";
import { useEffect, useState } from "react"; import { useEffect, useState, useCallback } from "react";
import { useAuth } from "@/contexts/AuthContext"; import { useAuth } from "@/contexts/AuthContext";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/Card"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/Card";
@ -26,22 +26,7 @@ export default function HistoriquePage() {
rejected: 0, rejected: 0,
}); });
useEffect(() => { const loadUserTickets = useCallback(async () => {
if (!authLoading && !isAuthenticated) {
router.push(ROUTES.LOGIN);
return;
}
if (isAuthenticated) {
loadUserTickets();
}
}, [authLoading, isAuthenticated, router]);
useEffect(() => {
filterTickets();
}, [tickets, filter, searchQuery]);
const loadUserTickets = async () => {
try { try {
const response = await gameService.getMyTickets(1, 1000); const response = await gameService.getMyTickets(1, 1000);
const ticketsData = response?.data || []; const ticketsData = response?.data || [];
@ -59,9 +44,9 @@ export default function HistoriquePage() {
} finally { } finally {
setIsLoading(false); setIsLoading(false);
} }
}; }, []);
const filterTickets = () => { const filterTickets = useCallback(() => {
let result = [...tickets]; let result = [...tickets];
if (filter !== 'ALL') { if (filter !== 'ALL') {
@ -75,7 +60,22 @@ export default function HistoriquePage() {
} }
setFilteredTickets(result); setFilteredTickets(result);
}; }, [tickets, filter, searchQuery]);
useEffect(() => {
if (!authLoading && !isAuthenticated) {
router.push(ROUTES.LOGIN);
return;
}
if (isAuthenticated) {
loadUserTickets();
}
}, [authLoading, isAuthenticated, router, loadUserTickets]);
useEffect(() => {
filterTickets();
}, [filterTickets]);
if (authLoading || isLoading) { if (authLoading || isLoading) {
return ( return (

View File

@ -1,5 +1,5 @@
"use client"; "use client";
import { useState, useEffect } from "react"; import { useState, useEffect, useCallback } from "react";
import { useAuth } from "@/contexts/AuthContext"; import { useAuth } from "@/contexts/AuthContext";
import { useGame } from "@/hooks/useGame"; import { useGame } from "@/hooks/useGame";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/Card"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/Card";
@ -29,13 +29,7 @@ export default function HistoriquePage() {
const [totalPages, setTotalPages] = useState(1); const [totalPages, setTotalPages] = useState(1);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
useEffect(() => { const loadTickets = useCallback(async () => {
if (isAuthenticated && user?.role?.toLowerCase() === "client") {
loadTickets();
}
}, [isAuthenticated, user, currentPage]);
const loadTickets = async () => {
try { try {
setError(null); setError(null);
console.log('🎫 Chargement des tickets, page:', currentPage); console.log('🎫 Chargement des tickets, page:', currentPage);
@ -55,7 +49,13 @@ export default function HistoriquePage() {
setError('Erreur lors du chargement de vos tickets.'); setError('Erreur lors du chargement de vos tickets.');
setTickets([]); setTickets([]);
} }
}; }, [getMyTickets, currentPage]);
useEffect(() => {
if (isAuthenticated && user?.role?.toLowerCase() === "client") {
loadTickets();
}
}, [isAuthenticated, user, loadTickets]);
if (!isAuthenticated || user?.role?.toLowerCase() !== "client") { if (!isAuthenticated || user?.role?.toLowerCase() !== "client") {
return ( return (

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { useState, useEffect } from 'react'; import { useState, useEffect, useCallback } from 'react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { adminService } from '@/services/admin.service'; import { adminService } from '@/services/admin.service';
import { User, CreateEmployeeData, UpdateUserData, PaginatedResponse } from '@/types'; import { User, CreateEmployeeData, UpdateUserData, PaginatedResponse } from '@/types';
@ -29,11 +29,7 @@ export default function UserManagement() {
const [userFormData, setUserFormData] = useState<UpdateUserData>({}); const [userFormData, setUserFormData] = useState<UpdateUserData>({});
useEffect(() => { const loadUsers = useCallback(async () => {
loadUsers();
}, [page, filterRole]);
const loadUsers = async () => {
try { try {
setLoading(true); setLoading(true);
setError(null); setError(null);
@ -50,7 +46,11 @@ export default function UserManagement() {
} finally { } finally {
setLoading(false); setLoading(false);
} }
}; }, [page, filterRole]);
useEffect(() => {
loadUsers();
}, [loadUsers]);
const handleCreateEmployee = async (e: React.FormEvent) => { const handleCreateEmployee = async (e: React.FormEvent) => {
e.preventDefault(); e.preventDefault();