diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 720d9cd..11cb0ef 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -239,9 +239,9 @@ function AdminPageContent() { ) : ( -
+
{campaigns.map((campaign) => ( - +
diff --git a/src/components/CreateCampaignModal.tsx b/src/components/CreateCampaignModal.tsx index 0d3c4f6..4373872 100644 --- a/src/components/CreateCampaignModal.tsx +++ b/src/components/CreateCampaignModal.tsx @@ -47,13 +47,79 @@ export default function CreateCampaignModal({ isOpen, onClose, onSuccess }: Crea } }; + const generateOptimalTiers = (budget: number): string => { + if (budget <= 0) return "0"; + + // Cas spéciaux pour des budgets courants + if (budget === 10000) { + return "0, 500, 1000, 2000, 3000, 5000, 7500, 10000"; + } + if (budget === 8000) { + return "0, 500, 1000, 2000, 3000, 4000, 6000, 8000"; + } + + const tiers = [0]; + + // Déterminer les paliers "ronds" selon la taille du budget + let roundValues: number[] = []; + + if (budget <= 100) { + // Petits budgets : multiples de 5, 10, 25 + roundValues = [5, 10, 25, 50, 75, 100]; + } else if (budget <= 500) { + // Budgets moyens : multiples de 25, 50, 100 + roundValues = [25, 50, 75, 100, 150, 200, 250, 300, 400, 500]; + } else if (budget <= 2000) { + // Budgets moyens-grands : multiples de 100, 250, 500 + roundValues = [100, 250, 500, 750, 1000, 1250, 1500, 1750, 2000]; + } else if (budget <= 10000) { + // Gros budgets : multiples de 500, 1000, 2000 + roundValues = [500, 1000, 1500, 2000, 2500, 3000, 4000, 5000, 6000, 7500, 10000]; + } else { + // Très gros budgets : multiples de 1000, 2000, 5000 + roundValues = [1000, 2000, 3000, 5000, 7500, 10000, 15000, 20000, 25000, 50000]; + } + + // Sélectionner les paliers qui sont inférieurs ou égaux au budget + const validTiers = roundValues.filter(tier => tier <= budget); + + // Prendre 6-8 paliers intermédiaires + 0 et le budget final + const targetCount = Math.min(8, Math.max(6, validTiers.length)); + const step = Math.max(1, Math.floor(validTiers.length / targetCount)); + + for (let i = 0; i < validTiers.length && tiers.length < targetCount + 1; i += step) { + if (!tiers.includes(validTiers[i])) { + tiers.push(validTiers[i]); + } + } + + // Ajouter le budget final s'il n'est pas déjà présent + if (!tiers.includes(budget)) { + tiers.push(budget); + } + + // Trier et retourner + return tiers.sort((a, b) => a - b).join(', '); + }; + const handleChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; setFormData(prev => ({ ...prev, - [e.target.name]: e.target.value + [name]: value })); }; + const handleBudgetBlur = (e: React.FocusEvent) => { + const budget = parseInt(e.target.value); + if (!isNaN(budget) && budget > 0 && !formData.spending_tiers) { + setFormData(prev => ({ + ...prev, + spending_tiers: generateOptimalTiers(budget) + })); + } + }; + const handleClose = () => { setFormData({ title: '', @@ -108,13 +174,14 @@ export default function CreateCampaignModal({ isOpen, onClose, onSuccess }: Crea
- +

Séparez les montants par des virgules (ex: 0, 10, 25, 50, 100) + {formData.budget_per_user && !formData.spending_tiers && ( + + 💡 Les paliers seront générés automatiquement après avoir saisi le budget + + )}

diff --git a/src/components/EditCampaignModal.tsx b/src/components/EditCampaignModal.tsx index ca9ccfd..fecdefb 100644 --- a/src/components/EditCampaignModal.tsx +++ b/src/components/EditCampaignModal.tsx @@ -137,7 +137,7 @@ export default function EditCampaignModal({ isOpen, onClose, onSuccess, campaign
- +