"use client"; import { useState, useEffect, useCallback } from "react"; interface Candidature { id: string; email: string; firstname: string; phone: string; persona: string; age: number; experience: string; time_daily: string; availability: string; start_date: string; motivation: string; monthly_goal: string; biggest_fear: string; tiktok_username: string | null; status: "pending" | "approved" | "rejected"; created_at: string; } export default function AdminCandidaturesPage() { const [candidatures, setCandidatures] = useState([]); const [loading, setLoading] = useState(true); const [actionLoading, setActionLoading] = useState(null); const [checkoutUrls, setCheckoutUrls] = useState>({}); const [expandedId, setExpandedId] = useState(null); const [error, setError] = useState(null); const [filter, setFilter] = useState<"all" | "pending" | "approved" | "rejected">("all"); const fetchCandidatures = useCallback(async () => { setLoading(true); setError(null); try { const res = await fetch("/api/admin/candidatures"); const data = await res.json(); if (!res.ok) throw new Error(data.error); setCandidatures(data.candidatures); } catch (err) { setError(err instanceof Error ? err.message : "Erreur de chargement"); } finally { setLoading(false); } }, []); useEffect(() => { fetchCandidatures(); }, [fetchCandidatures]); const handleApprove = async (id: string) => { setActionLoading(id); try { const res = await fetch(`/api/admin/candidatures/${id}/approve`, { method: "POST", }); const data = await res.json(); if (!res.ok) throw new Error(data.error); if (data.checkoutUrl) { setCheckoutUrls((prev) => ({ ...prev, [id]: data.checkoutUrl })); } await fetchCandidatures(); } catch (err) { setError(err instanceof Error ? err.message : "Erreur"); } finally { setActionLoading(null); } }; const handleReject = async (id: string) => { if (!confirm("Rejeter cette candidature ?")) return; setActionLoading(id); try { const res = await fetch(`/api/admin/candidatures/${id}/reject`, { method: "POST", }); const data = await res.json(); if (!res.ok) throw new Error(data.error); await fetchCandidatures(); } catch (err) { setError(err instanceof Error ? err.message : "Erreur"); } finally { setActionLoading(null); } }; const statusColors: Record = { pending: "bg-warning/10 text-warning", approved: "bg-success/10 text-success", rejected: "bg-error/10 text-error", }; const statusLabels: Record = { pending: "En attente", approved: "Approuvée", rejected: "Rejetée", }; const filtered = filter === "all" ? candidatures : candidatures.filter((c) => c.status === filter); const pending = candidatures.filter((c) => c.status === "pending"); const approved = candidatures.filter((c) => c.status === "approved"); const rejected = candidatures.filter((c) => c.status === "rejected"); if (loading) { return (
); } return (
{/* Header */}

Candidatures

{candidatures.length} candidature(s) au total

{/* Filtres */}
{[ { key: "all" as const, label: "Toutes", count: candidatures.length }, { key: "pending" as const, label: "En attente", count: pending.length }, { key: "approved" as const, label: "Approuvées", count: approved.length }, { key: "rejected" as const, label: "Rejetées", count: rejected.length }, ].map((f) => ( ))}
{error && (

{error}

)} {/* Liste */} {filtered.length === 0 ? (

Aucune candidature dans cette catégorie.

) : (
{filtered.map((c) => (
{/* Header row */}
setExpandedId(expandedId === c.id ? null : c.id)} >
{c.firstname.charAt(0).toUpperCase()}

{c.firstname}

{c.email}

{new Date(c.created_at).toLocaleDateString("fr-FR", { day: "numeric", month: "short", year: "numeric", })} {statusLabels[c.status]}
{/* Expanded details */} {expandedId === c.id && (

Téléphone

{c.phone}

Âge

{c.age} ans

Profil

{c.persona}

Expérience

{c.experience}

Temps disponible

{c.time_daily}

Disponibilité

{c.availability}

Début souhaité

{c.start_date}

Objectif mensuel

{c.monthly_goal}

{c.tiktok_username && (

TikTok

{c.tiktok_username}

)}

Motivation

{c.motivation}

Plus grande peur

{c.biggest_fear}

{/* Checkout URL */} {checkoutUrls[c.id] && (

Lien de paiement généré :

)} {/* Actions */} {c.status === "pending" && (
)} {c.status === "approved" && !checkoutUrls[c.id] && (
)}
)}
))}
)}
); }