"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
export default function AdminYoga({ tiers, members, recentAttendances }: any) {
const router = useRouter();
const [tierName, setTierName] = useState("");
const [tierSessions, setTierSessions] = useState("");
const [tierPrice, setTierPrice] = useState("");
const [savingTier, setSavingTier] = useState(false);
const [tierError, setTierError] = useState("");
async function createTier(e: React.FormEvent) {
e.preventDefault();
if (!tierName || !tierSessions || !tierPrice) return;
setSavingTier(true);
setTierError("");
const res = await fetch("/api/admin/yoga-tiers", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: tierName,
numberOfSessions: Number(tierSessions),
priceTotal: Number(tierPrice),
}),
});
setSavingTier(false);
if (res.ok) {
setTierName("");
setTierSessions("");
setTierPrice("");
router.refresh();
} else {
const data = await res.json();
setTierError(data.error || "Erreur");
}
}
return (
🧘 Gestion Yoga
{/* Tarifs dégressifs */}
💰 Tarifs dégressifs
Configure les packs de séances que Juanito veut vendre. Les plus
assidus paient moins cher par séance.
{tiers.map((t: any) => (
{t.name}
{t.numberOfSessions} séance{t.numberOfSessions > 1 ? "s" : ""} ·{" "}
{t.priceTotal} €
{" "}
({(t.priceTotal / t.numberOfSessions).toFixed(2)} €/séance)
))}
{tiers.length === 0 && (
Aucun tarif configuré.
)}
{tierError && {tierError}
}
💡 Un pack de 10 à 70€ = 7€/séance au lieu de 9€. Les membres
voient le tarif dégressif dans leur espace.
{/* Compteur séances membres */}
👥 Compteurs de séances des membres
{members.length === 0 && (
Aucun membre yoga. Crée-en un dans l'onglet Membres.
)}
{members.map((m: any) => (
router.refresh()} />
))}
{/* Dernières présences */}
🕐 Dernières présences enregistrées
{recentAttendances.length === 0 && (
Aucune présence enregistrée.
)}
{recentAttendances.map((a: any) => (
{a.profile.user.name}
{new Date(a.date).toLocaleDateString("fr-FR", { day: "numeric", month: "long" })}
{a.pricePaid !== null && (
{a.pricePaid} €
)}
))}
);
async function toggleTier(id: string, isActive: boolean) {
const res = await fetch(`/api/admin/yoga-tiers/${id}`, {
method: "PATCH",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ id, isActive }),
});
if (res.ok) router.refresh();
}
async function deleteTier(id: string) {
if (!confirm("Supprimer ce tarif ?")) return;
const res = await fetch(`/api/admin/yoga-tiers/${id}`, {
method: "DELETE",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ id }),
});
if (res.ok) router.refresh();
}
}
function YogaMemberCard({ member, onUpdate }: any) {
const [adding, setAdding] = useState(false);
const [count, setCount] = useState("1");
const [recordingSession, setRecordingSession] = useState(false);
const profile = member.yoga;
const remaining = profile?.sessionsRemaining ?? 0;
async function addSessions(e: React.FormEvent) {
e.preventDefault();
const res = await fetch("/api/admin/yoga-members", {
method: "PATCH",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ userId: member.id, sessionsToAdd: Number(count) }),
});
if (res.ok) {
setAdding(false);
setCount("1");
onUpdate();
}
}
async function recordSession() {
if (!confirm(`Enregistrer une séance suivie pour ${member.name} ? (1 séance restante va être déduite)`)) return;
setRecordingSession(true);
const res = await fetch("/api/yoga-sessions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ userId: member.id }),
});
setRecordingSession(false);
if (res.ok) onUpdate();
}
return (
{member.name}
{remaining} séance
{remaining > 1 ? "s" : ""} restante{remaining > 1 ? "s" : ""}
{adding && (
)}
);
}