'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { usePortalAuthStore } from '@/lib/portal-auth-store'; import portalApi from '@/lib/portal-api'; import { formatCurrency } from '@/lib/utils'; interface AccountData { accountNumber: string; firstName: string; lastName: string; email?: string; phone?: string; subscription?: { planName: string; downloadMbps: number; uploadMbps: number; monthlyRate: number; status: string; }; balanceDue: number; } const statusColors: Record = { ACTIVE: { bg: '#DCFCE7', text: '#16A34A' }, SUSPENDED: { bg: '#FEF9C3', text: '#CA8A04' }, CANCELLED: { bg: '#FEE2E2', text: '#DC2626' }, PENDING: { bg: '#F1F5F9', text: '#64748B' }, }; export default function PortalDashboardPage() { const router = useRouter(); const { isAuthenticated, subscriber, logout } = usePortalAuthStore(); const [mounted, setMounted] = useState(false); const [account, setAccount] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); useEffect(() => { setMounted(true); }, []); useEffect(() => { if (!mounted) return; if (!isAuthenticated) { router.replace('/portal/login'); return; } portalApi.get('/api/v1/portal/account') .then((res) => setAccount(res.data)) .catch(() => setError('Failed to load account info.')) .finally(() => setLoading(false)); }, [mounted, isAuthenticated, router]); if (!mounted || !isAuthenticated) return null; const handleLogout = () => { logout(); router.replace('/portal/login'); }; return (
{/* Header row */}

Welcome, {subscriber?.firstName ?? 'Subscriber'}

Account #{subscriber?.accountNumber}

{error && (
{error}
)} {loading ? (
{[1, 2, 3].map((i) => (
))}
) : account && (
{/* Account Info */}

Account Information

{[ { label: 'Full Name', value: `${account.firstName} ${account.lastName}` }, { label: 'Account Number', value: account.accountNumber }, { label: 'Email', value: account.email || 'โ€”' }, { label: 'Phone', value: account.phone || 'โ€”' }, ].map(({ label, value }) => (

{label}

{value}

))}
{/* Subscription */}

Active Subscription

{account.subscription ? (

Plan

{account.subscription.planName}

Speed

{account.subscription.downloadMbps}โ†“ / {account.subscription.uploadMbps}โ†‘ Mbps

Monthly Rate

{formatCurrency(account.subscription.monthlyRate)}

Status

{account.subscription.status}
) : (

No active subscription.

)}
{/* Balance Due */}
0 ? '1px solid #FECACA' : '1px solid #E2E8F0' }}>

Balance Due

0 ? '#DC2626' : '#16A34A', }}> {formatCurrency(account.balanceDue)}
{account.balanceDue > 0 && (

You have an outstanding balance. Please settle your invoices to avoid service interruption.

)}
{/* Quick Links */}
๐Ÿงพ

View Invoices

See your billing history

๐ŸŽซ

Support Tickets

View or raise a ticket

)}
); } const cardStyle: React.CSSProperties = { backgroundColor: '#ffffff', borderRadius: 12, border: '1px solid #E2E8F0', padding: 24, boxShadow: '0 1px 3px rgba(0,0,0,0.04)', }; const cardTitleStyle: React.CSSProperties = { fontSize: 15, fontWeight: 600, color: '#0F172A', margin: 0, }; const labelStyle: React.CSSProperties = { fontSize: 11, fontWeight: 600, color: '#94A3B8', textTransform: 'uppercase', letterSpacing: '0.05em', marginBottom: 2, };