"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é.

)}
setTierName(e.target.value)} /> setTierSessions(e.target.value)} /> setTierPrice(e.target.value)} />
{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 && (
setCount(e.target.value)} className="input !w-20" />
)}
); }