'use client' import { useState, useEffect } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { RefreshCw, AlertTriangle } from 'lucide-react' export default function FailedSmsPage() { const [failed, setFailed] = useState([]) const [loading, setLoading] = useState(true) const [retrying, setRetrying] = useState(null) const [message, setMessage] = useState('') async function loadFailed() { setLoading(true) const res = await fetch('/api/sms/failed') const data = await res.json() setFailed(data) setLoading(false) } useEffect(() => { loadFailed() }, []) async function handleRetry(id: string) { setRetrying(id) setMessage('') const res = await fetch(`/api/sms/${id}/retry`, { method: 'POST' }) const data = await res.json() setMessage(data.message || (res.ok ? 'Queued for retry' : 'Retry failed')) setRetrying(null) if (res.ok) { setTimeout(() => loadFailed(), 2000) } } return (

Failed SMS

SMS messages that failed after 3 attempts

{message && (
{message}
)} Failed Messages ({failed.length}) {loading ? (

Loading...

) : failed.length === 0 ? (

🎉 No failed messages!

) : (
{failed.map(item => ( ))}
Student Client Phone Event Error Failed At Action
{item.studentName}
{item.studentId}
{item.client.name} {item.parentPhone} {item.event === 'time_in' ? '✅ In' : '🔴 Out'} {item.lastError || 'Unknown error'} {new Date(item.updatedAt).toLocaleString('en-PH', { timeZone: 'Asia/Manila' })}
)}
) }