'use client'; import { useEffect, useState } from 'react'; import { useParams } from 'next/navigation'; import api from '@/lib/api'; import { JackpotCountdown } from '@/components/JackpotCountdown'; import { TicketList } from '@/components/TicketList'; import { PayoutStatus } from '@/components/PayoutStatus'; import { LoadingSpinner } from '@/components/LoadingSpinner'; import { formatDateTime } from '@/lib/format'; import STRINGS from '@/constants/strings'; export default function TicketStatusPage() { const params = useParams(); const ticketId = params.id as string; const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [data, setData] = useState(null); const [autoRefresh, setAutoRefresh] = useState(true); const [copied, setCopied] = useState(false); const ticketUrl = typeof window !== 'undefined' ? `${window.location.origin}/tickets/${ticketId}` : ''; const copyLink = async () => { try { await navigator.clipboard.writeText(ticketUrl); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (err) { console.error('Failed to copy:', err); } }; useEffect(() => { loadTicketStatus(); // Auto-refresh if payment pending or draw not complete const interval = setInterval(() => { if (autoRefresh) { loadTicketStatus(true); } }, 5000); return () => clearInterval(interval); }, [ticketId, autoRefresh]); const loadTicketStatus = async (silent = false) => { try { if (!silent) setLoading(true); const response = await api.getTicketStatus(ticketId); if (response.data) { setData(response.data); // Stop auto-refresh if payment is complete and draw is done if ( response.data.purchase.invoice_status === 'paid' && response.data.cycle.status === 'completed' ) { setAutoRefresh(false); } } } catch (err: any) { setError(err.message || 'Failed to load ticket status'); } finally { if (!silent) setLoading(false); } }; if (loading) { return ; } if (error) { return (
⚠️ {error}
); } if (!data) { return
Ticket not found
; } const { purchase, tickets, cycle, result } = data; return (

{STRINGS.ticket.title}

{/* Save This Link */}
🔖

Save This Link!

Bookmark or save this page to check if you've won after the draw. This is your only way to view your ticket status.

{ticketUrl || `/tickets/${ticketId}`}
{/* Purchase Info */}
Purchase ID:
{purchase.id}
Status:
{purchase.invoice_status}
Tickets:
{purchase.number_of_tickets}
Amount:
{purchase.amount_sats.toLocaleString()} sats
{/* Payment Status */} {purchase.invoice_status === 'pending' && (
{STRINGS.ticket.waiting}
)} {/* Tickets */} {purchase.ticket_issue_status === 'issued' && (

{STRINGS.ticket.ticketNumbers}

)} {/* Draw Info */}

Draw Information

Draw Time:
{formatDateTime(cycle.scheduled_at)}
Current Pot:
{cycle.pot_total_sats.toLocaleString()} sats
{cycle.status !== 'completed' && (
Time Until Draw:
)}
{/* Results */} {result.has_drawn && (

Draw Results

{result.is_winner ? (
🎉 {STRINGS.ticket.congratulations}
{result.payout && ( )}
) : (
{STRINGS.ticket.betterLuck}
{cycle.winning_ticket_id && (
{STRINGS.ticket.winningTicket}: #{cycle.winning_ticket_id.substring(0, 8)}
)}
)}
)}
); }