Skip to content

Commit 0756d85

Browse files
Fix: Implement loading strategy for hooks
Modify hooks to prevent premature Firestore requests before authentication. Add loading states and ensure hooks run only after authentication.
1 parent adf6453 commit 0756d85

3 files changed

Lines changed: 44 additions & 34 deletions

File tree

src/contexts/AuthContext.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,27 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => {
2424
const [loading, setLoading] = useState(true);
2525

2626
useEffect(() => {
27-
// Vérifier le cache localStorage d'abord
27+
console.log('🔐 AuthProvider - Initialisation');
28+
29+
// Vérifier le cache localStorage pour un chargement quasi-instantané
2830
const cachedUser = localStorage.getItem('auth_user');
2931
if (cachedUser) {
30-
console.log('🔥 Cache utilisateur trouvé, chargement instantané');
31-
setLoading(false);
32+
console.log('🔐 Cache utilisateur trouvé, chargement ultra-rapide');
33+
// Gardons loading=true pour attendre la confirmation Firebase
3234
}
3335

3436
const unsubscribe = onAuthStateChanged(auth, (user) => {
35-
console.log('🔥 Auth state changed:', user ? 'Connected' : 'Disconnected');
37+
console.log('🔐 Firebase Auth state changed:', user ? 'CONNECTÉ' : 'DÉCONNECTÉ');
3638
setUser(user);
37-
setLoading(false);
39+
setLoading(false); // AUTH COMPLÈTE ICI
3840

3941
// Cache simple
4042
if (user) {
4143
localStorage.setItem('auth_user', 'true');
44+
console.log('🔐 Utilisateur authentifié:', user.uid);
4245
} else {
4346
localStorage.removeItem('auth_user');
47+
console.log('🔐 Utilisateur déconnecté');
4448
}
4549
});
4650

src/hooks/useAffiliates.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,67 +18,69 @@ import { Affiliate } from '@/types';
1818
export const useAffiliates = (campaignId?: string) => {
1919
const [affiliates, setAffiliates] = useState<Affiliate[]>([]);
2020
const [loading, setLoading] = useState(true);
21-
const { user } = useAuth();
21+
const { user, loading: authLoading } = useAuth();
2222

2323
useEffect(() => {
24-
console.log('🔄 useAffiliates effect triggered');
25-
console.log('👤 User:', user?.uid);
26-
console.log('📋 CampaignId:', campaignId);
24+
console.log('👥 useAffiliates - Effect triggered');
25+
console.log('👥 authLoading:', authLoading, 'user:', !!user, 'campaignId:', campaignId);
26+
27+
// PROTECTION STRICTE : Aucune requête avant auth complète
28+
if (authLoading) {
29+
console.log('👥 Auth encore en cours, pas de requête Firebase');
30+
return;
31+
}
2732

2833
if (!user) {
29-
console.log('❌ No user, clearing affiliates');
34+
console.log('👥 Pas d\'utilisateur, nettoyage des affiliés');
3035
setAffiliates([]);
3136
setLoading(false);
3237
return;
3338
}
3439

40+
console.log('👥 Auth OK, démarrage requête Firestore pour user:', user.uid);
41+
3542
const affiliatesRef = collection(db, 'affiliates');
3643
let q;
3744

3845
if (campaignId) {
39-
console.log('🎯 Querying affiliates for specific campaign:', campaignId);
46+
console.log('👥 Requête pour campagne spécifique:', campaignId);
4047
q = query(
4148
affiliatesRef,
4249
where('campaignId', '==', campaignId),
4350
where('userId', '==', user.uid),
4451
orderBy('createdAt', 'desc')
4552
);
4653
} else {
47-
console.log('🎯 Querying all affiliates for user:', user.uid);
54+
console.log('👥 Requête tous affiliés pour user:', user.uid);
4855
q = query(
4956
affiliatesRef,
5057
where('userId', '==', user.uid),
5158
orderBy('createdAt', 'desc')
5259
);
5360
}
5461

55-
console.log('🔗 Setting up Firestore listener...');
5662
const unsubscribe = onSnapshot(q, (snapshot) => {
57-
console.log('📊 Firestore snapshot received');
58-
console.log('📄 Documents count:', snapshot.docs.length);
63+
console.log('👥 Firestore snapshot reçu, docs:', snapshot.docs.length);
5964

6065
const affiliatesData = snapshot.docs.map(doc => {
6166
const data = doc.data();
62-
console.log('📋 Affiliate doc:', { id: doc.id, data });
6367
return {
6468
id: doc.id,
6569
...data,
6670
createdAt: data.createdAt?.toDate(),
6771
};
6872
}) as Affiliate[];
6973

70-
console.log('✅ Processed affiliates:', affiliatesData);
74+
console.log('👥 Affiliés chargés:', affiliatesData.length);
7175
setAffiliates(affiliatesData);
7276
setLoading(false);
7377
}, (error) => {
74-
console.error('❌ Firestore listener error:', error);
75-
console.error('❌ Error code:', error.code);
76-
console.error('❌ Error message:', error.message);
78+
console.error('👥 Erreur Firestore:', error);
7779
setLoading(false);
7880
});
7981

8082
return unsubscribe;
81-
}, [user, campaignId]);
83+
}, [user, authLoading, campaignId]); // Dépendance sur authLoading aussi
8284

8385
const generateTrackingCode = () => {
8486
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);

src/hooks/useCampaigns.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import { useEffect, useState } from 'react';
32
import {
43
collection,
@@ -18,33 +17,38 @@ import { Campaign } from '@/types';
1817
export const useCampaigns = () => {
1918
const [campaigns, setCampaigns] = useState<Campaign[]>([]);
2019
const [loading, setLoading] = useState(true);
21-
const { user } = useAuth();
20+
const { user, loading: authLoading } = useAuth();
2221

2322
useEffect(() => {
24-
console.log('useCampaigns effect triggered, user:', user?.uid);
23+
console.log('🎯 useCampaigns - Effect triggered');
24+
console.log('🎯 authLoading:', authLoading, 'user:', !!user);
25+
26+
// PROTECTION STRICTE : Aucune requête avant auth complète
27+
if (authLoading) {
28+
console.log('🎯 Auth encore en cours, pas de requête Firebase');
29+
return;
30+
}
2531

2632
if (!user) {
27-
console.log('No user, clearing campaigns');
33+
console.log('🎯 Pas d\'utilisateur, nettoyage des campagnes');
2834
setCampaigns([]);
2935
setLoading(false);
3036
return;
3137
}
3238

39+
console.log('🎯 Auth OK, démarrage requête Firestore pour user:', user.uid);
40+
3341
const campaignsRef = collection(db, 'campaigns');
34-
// Requête temporaire sans orderBy pour éviter l'erreur d'index
3542
const q = query(
3643
campaignsRef,
3744
where('userId', '==', user.uid)
3845
);
3946

40-
console.log('Setting up Firestore listener for user:', user.uid);
41-
4247
const unsubscribe = onSnapshot(q, (snapshot) => {
43-
console.log('Firestore snapshot received, docs count:', snapshot.docs.length);
48+
console.log('🎯 Firestore snapshot reçu, docs:', snapshot.docs.length);
4449

4550
const campaignsData = snapshot.docs.map(doc => {
4651
const data = doc.data();
47-
console.log('Campaign doc data:', data);
4852
return {
4953
id: doc.id,
5054
...data,
@@ -53,22 +57,22 @@ export const useCampaigns = () => {
5357
};
5458
}) as Campaign[];
5559

56-
// Tri côté client en attendant l'index Firestore
60+
// Tri côté client
5761
campaignsData.sort((a, b) => {
5862
if (!a.createdAt || !b.createdAt) return 0;
5963
return b.createdAt.getTime() - a.createdAt.getTime();
6064
});
6165

62-
console.log('Processed campaigns data:', campaignsData);
66+
console.log('🎯 Campagnes chargées:', campaignsData.length);
6367
setCampaigns(campaignsData);
6468
setLoading(false);
6569
}, (error) => {
66-
console.error('Firestore listener error:', error);
70+
console.error('🎯 Erreur Firestore:', error);
6771
setLoading(false);
6872
});
6973

7074
return unsubscribe;
71-
}, [user]);
75+
}, [user, authLoading]); // Dépendance sur authLoading aussi
7276

7377
const createCampaign = async (campaignData: Omit<Campaign, 'id' | 'createdAt' | 'updatedAt' | 'userId'>) => {
7478
if (!user) throw new Error('User not authenticated');

0 commit comments

Comments
 (0)