import AppLayout from '@/layouts/app-layout'; import { type BreadcrumbItem, type DashboardMember, type DashboardService, type PageProps } from '@/types'; import { Head, router, usePage } from '@inertiajs/react'; import DashboardController from '@/actions/App/Http/Controllers/DashboardController'; import { ExternalLink, KeyRound, Loader2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { FlashMessage } from '@/components/flash-message'; import { useEffect, useState } from 'react'; import { cn } from '@/lib/utils'; const breadcrumbs: BreadcrumbItem[] = [ { title: 'Tableau de bord', href: DashboardController.index().url, }, ]; const ACTIVATION_REQUESTED_KEY = 'service_activation_requested'; function getRequestedServices(): string[] { try { return JSON.parse(localStorage.getItem(ACTIVATION_REQUESTED_KEY) ?? '[]'); } catch { return []; } } function markServiceRequested(identifier: string): void { const current = getRequestedServices(); if (!current.includes(identifier)) { localStorage.setItem(ACTIVATION_REQUESTED_KEY, JSON.stringify([...current, identifier])); } } function WelcomeCard({ member }: { member: DashboardMember }) { const membership = member.membership; return (

Bienvenue

{member.firstname} {member.lastname}

{member.retzien_email || member.email}

{membership ? (
{membership.package?.name ?? 'Adhésion'} {membership.status === 'active' ? 'Actif' : 'En attente'} {membership.end_date && ( Valide jusqu'au {new Date(membership.end_date).toLocaleDateString('fr-FR')} )}
) : (

Aucune adhésion active.

)}
); } function NoMemberCard() { return (

Pas encore membre ?

Votre compte n'est pas encore associé à une adhésion. Rejoignez l'association pour accéder aux services.

); } function ServiceCard({ service, onRequest }: { service: DashboardService; onRequest: (identifier: string) => void }) { const [alreadyRequested, setAlreadyRequested] = useState(() => getRequestedServices().includes(service.identifier), ); function handleRequest() { markServiceRequested(service.identifier); setAlreadyRequested(true); onRequest(service.identifier); } return (

{service.name}

{service.description && (

{service.description}

)}
{service.is_active ? 'Actif' : 'Inactif'}
{service.is_active ? ( Accéder au service ) : ( )}
); } export default function Dashboard() { const { flash, member } = usePage().props; const [showFlash, setShowFlash] = useState(!!flash); const [submitting, setSubmitting] = useState(false); useEffect(() => { if (flash) { setShowFlash(true); const timer = setTimeout(() => setShowFlash(false), 5000); return () => clearTimeout(timer); } }, [flash]); function handleActivationRequest(identifier: string) { setSubmitting(true); router.post( DashboardController.requestServiceActivation().url, { service_identifier: identifier }, { preserveScroll: true, onFinish: () => setSubmitting(false), }, ); } const membership = member?.membership ?? null; const services = membership?.services ?? []; return (
{showFlash && flash && } {member ? ( <> {services.length > 0 && (

Vos services

{submitting && (
Envoi en cours…
)}
{services.map((service) => ( ))}
)} {services.length === 0 && membership && (
Aucun service associé à votre adhésion pour le moment.
)} {!membership && (
Votre demande d'adhésion est en cours de traitement.
)} ) : ( )}
); }