'use client' import { useEffect, useState, useCallback } from 'react' import { toast } from 'sonner' import { listSessionSignups, markAttendance, completeSession } from '@/lib/actions' import { SIGNUP_STATUS_LABEL } from '@/lib/classes-logic' type Signup = { id: string member_id: string status: string attended: boolean signed_up_at: string space_members: { display_name: string | null; email: string | null } | null } export function SessionAttendance({ sessionId, sessionStatus, onCompleted, }: { sessionId: string sessionStatus: string onCompleted: () => void }) { const [loading, setLoading] = useState(false) const [rows, setRows] = useState([]) const [busy, setBusy] = useState(false) const load = useCallback(async () => { setLoading(true) const res = await listSessionSignups({ sessionId }) setLoading(false) if ('error' in res && res.error) { toast.error(res.error) return } setRows(('data' in res ? res.data : []) ?? []) }, [sessionId]) useEffect(() => { load() }, [load]) async function toggle(s: Signup) { const res = await markAttendance({ signupId: s.id, attended: !s.attended }) if ('error' in res && res.error) { toast.error(res.error) return } setRows(prev => prev.map(r => (r.id === s.id ? { ...r, attended: !r.attended } : r))) } async function onComplete() { setBusy(true) const res = await completeSession({ sessionId }) setBusy(false) if ('error' in res && res.error) { toast.error(res.error) return } const d = (res as { data: { certificatesIssued: number; certificatesSkipped: boolean } }).data if (d.certificatesSkipped) { toast.success('Session completed. Certificates were NOT issued (requires the certifications.grant permission).') } else if (d.certificatesIssued > 0) { toast.success(`Session completed. ${d.certificatesIssued} certificate(s) issued.`) } else { toast.success('Session completed.') } onCompleted() } return (

Attendees

{sessionStatus === 'scheduled' && ( )}
{loading ? (

Loading…

) : rows.length === 0 ? (

No signups yet.

) : ( )}
) }