Skip to content

Commit d3c117b

Browse files
Fix campaign deletion issue
1 parent 4f9efa8 commit d3c117b

2 files changed

Lines changed: 81 additions & 68 deletions

File tree

src/components/CampaignDeletionUtility.tsx

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
21
import { useState } from 'react';
32
import { Button } from '@/components/ui/button';
43
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
54
import { useCampaigns } from '@/hooks/useCampaigns';
65
import { useAuth } from '@/hooks/useAuth';
76
import { useToast } from '@/hooks/use-toast';
87
import { Trash2, AlertTriangle } from 'lucide-react';
9-
import { collection, query, where, getDocs, doc, deleteDoc } from 'firebase/firestore';
10-
import { db } from '@/lib/firebase';
8+
import { supabase } from '@/integrations/supabase/client';
119

1210
export const CampaignDeletionUtility = () => {
1311
const [loading, setLoading] = useState(false);
@@ -20,30 +18,29 @@ export const CampaignDeletionUtility = () => {
2018

2119
setLoading(true);
2220
try {
23-
console.log('🔍 Recherche des campagnes brouillon pour:', user.uid);
21+
console.log('🔍 SUPABASE: Recherche des campagnes brouillon pour:', user.uid);
2422

25-
const campaignsQuery = query(
26-
collection(db, 'campaigns'),
27-
where('userId', '==', user.uid),
28-
where('isDraft', '==', true)
29-
);
23+
const { data: drafts, error } = await supabase
24+
.from('campaigns')
25+
.select('*')
26+
.eq('user_id', user.uid)
27+
.eq('is_draft', true)
28+
.order('created_at', { ascending: false });
3029

31-
const campaignsSnapshot = await getDocs(campaignsQuery);
32-
const drafts = campaignsSnapshot.docs.map(doc => ({
33-
id: doc.id,
34-
...doc.data(),
35-
createdAt: doc.data().createdAt?.toDate() || new Date(),
36-
}));
30+
if (error) {
31+
console.error('❌ SUPABASE: Erreur chargement brouillons:', error);
32+
throw error;
33+
}
3734

38-
console.log('📋 Campagnes brouillon trouvées:', drafts.length);
39-
setDraftCampaigns(drafts);
35+
console.log('📋 SUPABASE: Campagnes brouillon trouvées:', drafts?.length || 0);
36+
setDraftCampaigns(drafts || []);
4037

4138
toast({
4239
title: "Campagnes trouvées",
43-
description: `${drafts.length} campagnes en brouillon trouvées`,
40+
description: `${drafts?.length || 0} campagnes en brouillon trouvées`,
4441
});
4542
} catch (error) {
46-
console.error('❌ Erreur chargement brouillons:', error);
43+
console.error('❌ SUPABASE: Erreur chargement brouillons:', error);
4744
toast({
4845
title: "Erreur",
4946
description: "Impossible de charger les campagnes brouillon",
@@ -56,10 +53,18 @@ export const CampaignDeletionUtility = () => {
5653

5754
const deleteDraftCampaign = async (campaignId: string, campaignName: string) => {
5855
try {
59-
console.log('🗑️ Suppression de la campagne brouillon:', campaignId);
56+
console.log('🗑️ SUPABASE: Suppression de la campagne brouillon:', campaignId);
57+
58+
const { error } = await supabase
59+
.from('campaigns')
60+
.delete()
61+
.eq('id', campaignId)
62+
.eq('user_id', user?.uid); // Sécurité supplémentaire
6063

61-
const campaignRef = doc(db, 'campaigns', campaignId);
62-
await deleteDoc(campaignRef);
64+
if (error) {
65+
console.error('❌ SUPABASE: Erreur suppression:', error);
66+
throw error;
67+
}
6368

6469
// Mettre à jour la liste
6570
setDraftCampaigns(prev => prev.filter(c => c.id !== campaignId));
@@ -69,7 +74,7 @@ export const CampaignDeletionUtility = () => {
6974
description: `"${campaignName}" a été supprimée avec succès`,
7075
});
7176
} catch (error) {
72-
console.error('❌ Erreur suppression:', error);
77+
console.error('❌ SUPABASE: Erreur suppression:', error);
7378
toast({
7479
title: "Erreur",
7580
description: "Impossible de supprimer cette campagne",
@@ -83,13 +88,18 @@ export const CampaignDeletionUtility = () => {
8388

8489
setLoading(true);
8590
try {
86-
console.log('🗑️ Suppression de toutes les campagnes brouillon...');
91+
console.log('🗑️ SUPABASE: Suppression de toutes les campagnes brouillon...');
8792

88-
const deletePromises = draftCampaigns.map(campaign =>
89-
deleteDoc(doc(db, 'campaigns', campaign.id))
90-
);
93+
const { error } = await supabase
94+
.from('campaigns')
95+
.delete()
96+
.eq('user_id', user.uid)
97+
.eq('is_draft', true);
9198

92-
await Promise.all(deletePromises);
99+
if (error) {
100+
console.error('❌ SUPABASE: Erreur suppression globale:', error);
101+
throw error;
102+
}
93103

94104
toast({
95105
title: "Nettoyage terminé",
@@ -98,7 +108,7 @@ export const CampaignDeletionUtility = () => {
98108

99109
setDraftCampaigns([]);
100110
} catch (error) {
101-
console.error('❌ Erreur suppression globale:', error);
111+
console.error('❌ SUPABASE: Erreur suppression globale:', error);
102112
toast({
103113
title: "Erreur",
104114
description: "Erreur lors de la suppression globale",
@@ -143,7 +153,7 @@ export const CampaignDeletionUtility = () => {
143153
<div>
144154
<span className="font-medium">{campaign.name}</span>
145155
<span className="text-sm text-gray-500 ml-2">
146-
({campaign.createdAt.toLocaleDateString()})
156+
({new Date(campaign.created_at).toLocaleDateString()})
147157
</span>
148158
</div>
149159
<Button
@@ -161,4 +171,4 @@ export const CampaignDeletionUtility = () => {
161171
</CardContent>
162172
</Card>
163173
);
164-
};
174+
};
Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
export interface PaymentMethod {
32
id: string;
43
type: string;
@@ -11,73 +10,77 @@ export interface PaymentMethod {
1110

1211
export const paymentMethodService = {
1312
async getPaymentMethods(userEmail: string): Promise<PaymentMethod[]> {
14-
console.log('🔍 API: Chargement des cartes bancaires pour:', userEmail);
13+
console.log('🔍 SUPABASE: Chargement des cartes bancaires pour:', userEmail);
1514

1615
try {
17-
const response = await fetch('/api/stripe-payment-methods', {
18-
method: 'POST',
19-
headers: {
20-
'Content-Type': 'application/json',
21-
},
22-
body: JSON.stringify({ userEmail }),
16+
// Utiliser Supabase Edge Function au lieu de l'ancienne API
17+
const { supabase } = await import('@/integrations/supabase/client');
18+
19+
const { data, error } = await supabase.functions.invoke('stripe-payment-methods', {
20+
body: { userEmail }
2321
});
2422

25-
if (!response.ok) {
26-
throw new Error('Failed to fetch payment methods');
23+
if (error) {
24+
console.error('❌ SUPABASE: Erreur récupération méthodes de paiement:', error);
25+
return [];
2726
}
2827

29-
const data = await response.json();
30-
console.log('✅ API: Cartes bancaires chargées:', data.paymentMethods?.length || 0);
31-
return data.paymentMethods || [];
28+
console.log('✅ SUPABASE: Cartes bancaires chargées:', data?.paymentMethods?.length || 0);
29+
return data?.paymentMethods || [];
3230
} catch (error) {
33-
console.error('❌ API: Erreur chargement cartes:', error);
31+
console.error('❌ SUPABASE: Erreur chargement cartes:', error);
3432
return [];
3533
}
3634
},
3735

3836
async deletePaymentMethod(paymentMethodId: string): Promise<void> {
39-
console.log(`🗑️ API: Suppression de la carte ${paymentMethodId}`);
37+
console.log(`🗑️ SUPABASE: Suppression de la carte ${paymentMethodId}`);
4038

4139
try {
42-
const response = await fetch('/api/stripe-delete-payment-method', {
43-
method: 'POST',
44-
headers: {
45-
'Content-Type': 'application/json',
46-
},
47-
body: JSON.stringify({ paymentMethodId }),
40+
const { supabase } = await import('@/integrations/supabase/client');
41+
42+
const { error } = await supabase.functions.invoke('stripe-payment-methods', {
43+
body: {
44+
action: 'delete',
45+
paymentMethodId
46+
}
4847
});
4948

50-
if (!response.ok) {
51-
throw new Error('Failed to delete payment method');
49+
if (error) {
50+
console.error('❌ SUPABASE: Erreur suppression carte:', error);
51+
throw error;
5252
}
5353

54-
console.log('✅ API: Carte supprimée de Stripe');
54+
console.log('✅ SUPABASE: Carte supprimée de Stripe');
5555
} catch (error) {
56-
console.error('❌ API: Erreur suppression carte:', error);
56+
console.error('❌ SUPABASE: Erreur suppression carte:', error);
5757
throw error;
5858
}
5959
},
6060

6161
async setDefaultPaymentMethod(userEmail: string, paymentMethodId: string): Promise<void> {
62-
console.log(`⭐ API: Définition de la carte par défaut ${paymentMethodId} pour ${userEmail}`);
62+
console.log(`⭐ SUPABASE: Définition de la carte par défaut ${paymentMethodId} pour ${userEmail}`);
6363

6464
try {
65-
const response = await fetch('/api/stripe-set-default-payment-method', {
66-
method: 'POST',
67-
headers: {
68-
'Content-Type': 'application/json',
69-
},
70-
body: JSON.stringify({ userEmail, paymentMethodId }),
65+
const { supabase } = await import('@/integrations/supabase/client');
66+
67+
const { error } = await supabase.functions.invoke('stripe-payment-methods', {
68+
body: {
69+
action: 'setDefault',
70+
userEmail,
71+
paymentMethodId
72+
}
7173
});
7274

73-
if (!response.ok) {
74-
throw new Error('Failed to set default payment method');
75+
if (error) {
76+
console.error('❌ SUPABASE: Erreur définition carte par défaut:', error);
77+
throw error;
7578
}
7679

77-
console.log('✅ API: Carte par défaut mise à jour');
80+
console.log('✅ SUPABASE: Carte par défaut mise à jour');
7881
} catch (error) {
79-
console.error('❌ API: Erreur définition carte par défaut:', error);
82+
console.error('❌ SUPABASE: Erreur définition carte par défaut:', error);
8083
throw error;
8184
}
8285
}
83-
};
86+
};

0 commit comments

Comments
 (0)