'use client' import { useState } from 'react' import { Button } from '@/components/ui/button' import { formatDate } from '@/lib/utils' import { getDaysUntilExpiry, isConsentExpiringSoon } from '../lib/api-client' import { CreditCard, AlertTriangle, RefreshCw, Trash2, Loader2, CheckCircle, XCircle, } from 'lucide-react' import type { BankConnection } from '@/types' interface BankConnectionStatusProps { connection: BankConnection onSync: (connectionId: string) => void onDisconnect: (connectionId: string) => void isSyncing?: boolean } export function BankConnectionStatus({ connection, onSync, onDisconnect, isSyncing = false, }: BankConnectionStatusProps) { const daysUntilExpiry = getDaysUntilExpiry(connection.consent_expires) const isExpiring = isConsentExpiringSoon(connection.consent_expires) const statusConfig = { active: { icon: CheckCircle, color: 'text-green-600', label: 'Aktiv', variant: 'success' as const, }, pending: { icon: Loader2, color: 'text-yellow-600', label: 'Väntar', variant: 'warning' as const, }, error: { icon: XCircle, color: 'text-red-600', label: 'Fel', variant: 'destructive' as const, }, revoked: { icon: XCircle, color: 'text-gray-600', label: 'Bortkopplad', variant: 'secondary' as const, }, } const status = statusConfig[connection.status as keyof typeof statusConfig] || statusConfig.error const StatusIcon = status.icon // Parse accounts from connection const accounts = (connection.accounts_data as Array<{ uid: string iban?: string name?: string currency: string balance?: number balance_updated_at?: string }>) || [] const [now] = useState(() => Date.now()) function formatBalanceAge(updatedAt: string): string { const hoursAgo = Math.floor((now - new Date(updatedAt).getTime()) / (1000 * 60 * 60)) if (hoursAgo < 1) return 'Nyss uppdaterat' if (hoursAgo < 24) return `${hoursAgo}h sedan` const daysAgo = Math.floor(hoursAgo / 24) return `${daysAgo}d sedan` } return (
{/* Header */}

{connection.bank_name}

{status.label} {connection.last_synced_at && ( <> - Synkad {formatDate(connection.last_synced_at)} )}
{connection.status === 'active' && ( )}
{/* Consent expiry warning */} {isExpiring && daysUntilExpiry !== null && (
Samtycket går ut om {daysUntilExpiry} {daysUntilExpiry === 1 ? 'dag' : 'dagar'}. Förnya genom att ansluta igen.
)} {/* Accounts list */} {accounts.length > 0 && (

Konton

{accounts.map((account) => (

{account.name || account.iban || 'Okänt konto'}

{account.iban && (

{account.iban.replace(/(.{4})/g, '$1 ').trim()}

)}
{account.balance !== undefined && (

{new Intl.NumberFormat('sv-SE', { style: 'currency', currency: account.currency, }).format(account.balance)}

{account.balance_updated_at && (

{formatBalanceAge(account.balance_updated_at)}

)}
)}
))}
)}
) }