"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
export default function AdminUsers({ users }: { users: any[] }) {
const router = useRouter();
const [showCreate, setShowCreate] = useState(false);
const [filter, setFilter] = useState<"ALL" | "MUAY" | "YOGA">("ALL");
const filtered = users.filter((u) => {
if (filter === "MUAY") return u.isMuayThai;
if (filter === "YOGA") return u.isYoga;
return true;
});
return (
👥 Adhérents ({filtered.length})
{(
[
["ALL", "Tous"],
["MUAY", "🥊 Muay Thai"],
["YOGA", "🧘 Yoga"],
] as const
).map(([val, label]) => (
))}
{showCreate &&
{ setShowCreate(false); router.refresh(); }} />}
{filtered.length === 0 && (
Aucun adhérent.
)}
{filtered.map((user) => (
router.refresh()} />
))}
);
}
function CreateUserForm({ onDone }: { onDone: () => void }) {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [isMuayThai, setIsMuayThai] = useState(true);
const [isYoga, setIsYoga] = useState(false);
const [error, setError] = useState("");
const [saving, setSaving] = useState(false);
async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
setSaving(true);
setError("");
const res = await fetch("/api/admin/users", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name, email, password, isMuayThai, isYoga }),
});
const data = await res.json();
setSaving(false);
if (!res.ok) {
setError(data.error || "Erreur");
return;
}
onDone();
}
return (
);
}
function Checkbox({ label, checked, onChange }: { label: string; checked: boolean; onChange: (v: boolean) => void }) {
return (
);
}
function MemberCard({ user, onUpdate }: { user: any; onUpdate: () => void }) {
const [expanded, setExpanded] = useState(false);
const [editName, setEditName] = useState(user.name);
const [editPassword, setEditPassword] = useState("");
const router = useRouter();
const certStatus = user.certificates?.find((c: any) => c.status !== "REJECTED")?.status;
async function updateUser(data: any) {
const res = await fetch(`/api/admin/users/${user.id}`, {
method: "PATCH",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
});
if (res.ok) {
onUpdate();
setExpanded(false);
}
}
async function deleteUser() {
if (!confirm(`Supprimer le compte de ${user.name} ?`)) return;
const res = await fetch(`/api/admin/users/${user.id}`, {
method: "DELETE",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ id: user.id }),
});
if (res.ok) onUpdate();
}
return (
{user.name.charAt(0).toUpperCase()}
{user.name}
{user.email}
{user.isMuayThai && (
🥊 Muay Thai
)}
{user.isYoga && (
🧘 Yoga
)}
{user.role === "ADMIN" && (
⭐ Admin
)}
{certStatus && (
Certificat médical
)}
{user.yoga && (
Séances yoga restantes
{user.yoga.sessionsRemaining}
)}
{expanded && user.role !== "ADMIN" && (
Modifier
)}
);
}
function CertBadge({ status }: { status: string }) {
switch (status) {
case "VALIDATED":
return ✓ Validé;
case "PENDING":
return ⏳ En attente;
case "REJECTED":
return ✗ Rejeté;
default:
return null;
}
}