"use client" import { useState, useEffect } from "react" import { useParams } from "next/navigation" import { Card, CardContent } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { MessageCircle, Share2, QrCode, TrendingUp, Users, Banknote, Loader2 } from "lucide-react" interface VolunteerData { qrSource: { label: string volunteerName: string | null code: string scanCount: number } event: { name: string organizationName: string } pledges: Array<{ id: string reference: string amountPence: number status: string donorName: string | null createdAt: string giftAid: boolean }> stats: { totalPledges: number totalPledgedPence: number totalPaidPence: number conversionRate: number } } const statusColors: Record = { new: "secondary", initiated: "warning", paid: "success", overdue: "destructive", } export default function VolunteerPage() { const params = useParams() const code = params.code as string const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState("") useEffect(() => { fetch(`/api/qr/${code}/volunteer`) .then((r) => r.json()) .then((d) => { if (d.error) setError(d.error) else setData(d) }) .catch(() => setError("Failed to load")) .finally(() => setLoading(false)) const interval = setInterval(() => { fetch(`/api/qr/${code}/volunteer`) .then((r) => r.json()) .then((d) => { if (!d.error) setData(d) }) .catch(() => {}) }, 15000) return () => clearInterval(interval) }, [code]) const handleWhatsAppShare = () => { if (!data) return const url = `${window.location.origin}/p/${code}` const text = `🤲 Pledge to ${data.event.name}!\n\nMake a pledge here — it only takes 15 seconds:\n${url}` window.open(`https://wa.me/?text=${encodeURIComponent(text)}`, "_blank") } const handleShare = async () => { if (!data) return const url = `${window.location.origin}/p/${code}` if (navigator.share) { await navigator.share({ title: data.event.name, text: `Pledge to ${data.event.name}`, url }) } else { handleWhatsAppShare() } } const formatPence = (p: number) => `£${(p / 100).toLocaleString("en-GB", { minimumFractionDigits: 0 })}` if (loading) { return (
) } if (error || !data) { return (

QR code not found

{error}

) } return (
{/* Header */}

{data.event.organizationName}

{data.event.name}

{data.qrSource.volunteerName || data.qrSource.label}'s Pledges

{/* Stats */}

{data.stats.totalPledges}

Pledges

{formatPence(data.stats.totalPledgedPence)}

Pledged

{formatPence(data.stats.totalPaidPence)}

Paid

{/* Progress bar */} {data.stats.totalPledgedPence > 0 && (
Collection progress {Math.round((data.stats.totalPaidPence / data.stats.totalPledgedPence) * 100)}%
)} {/* Share buttons */}
{/* Pledge list */}

My Pledges ({data.pledges.length})

{data.pledges.length === 0 ? (

No pledges yet. Share your link to start collecting!

) : ( data.pledges.map((p) => (

{p.donorName || "Anonymous"}

{new Date(p.createdAt).toLocaleDateString("en-GB", { day: "numeric", month: "short", hour: "2-digit", minute: "2-digit" })} {p.giftAid && " · 🎁 Gift Aid"}

{formatPence(p.amountPence)} {p.status === "paid" ? "Paid ✓" : p.status}
)) )}
{/* Auto-refresh indicator */}

Updates automatically every 15 seconds

) }