import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { DollarSign, TrendingUp, Shield, AlertTriangle, RefreshCw, ExternalLink } from 'lucide-react'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { usePezkuwi } from '@/contexts/PezkuwiContext'; import { getWUSDTTotalSupply, checkReserveHealth, formatWUSDT } from '@pezkuwi/lib/usdt'; import { MultisigMembers } from './MultisigMembers'; interface ReservesDashboardProps { specificAddresses?: Record; offChainReserveAmount?: number; // Manual input for MVP } export const ReservesDashboard: React.FC = ({ specificAddresses = {}, offChainReserveAmount = 0, }) => { const { t } = useTranslation(); const { api, isApiReady } = usePezkuwi(); const [wusdtSupply, setWusdtSupply] = useState(0); const [offChainReserve, setOffChainReserve] = useState(offChainReserveAmount); const [collateralRatio, setCollateralRatio] = useState(0); const [isHealthy, setIsHealthy] = useState(true); const [loading, setLoading] = useState(true); const [lastUpdate, setLastUpdate] = useState(new Date()); // Fetch reserve data const fetchReserveData = async () => { if (!api || !isApiReady) return; setLoading(true); try { const supply = await getWUSDTTotalSupply(api); setWusdtSupply(supply); const health = await checkReserveHealth(api, offChainReserve); setCollateralRatio(health.collateralRatio); setIsHealthy(health.isHealthy); setLastUpdate(new Date()); } catch (error) { if (import.meta.env.DEV) console.error('Error fetching reserve data:', error); } finally { setLoading(false); } }; useEffect(() => { fetchReserveData(); // Auto-refresh every 30 seconds const interval = setInterval(fetchReserveData, 30000); return () => clearInterval(interval); // eslint-disable-next-line react-hooks/exhaustive-deps }, [api, isApiReady, offChainReserve]); const getHealthColor = () => { if (collateralRatio >= 105) return 'text-green-500'; if (collateralRatio >= 100) return 'text-yellow-500'; return 'text-red-500'; }; const getHealthStatus = () => { if (collateralRatio >= 105) return t('reserves.healthy'); if (collateralRatio >= 100) return t('reserves.warning'); return t('reserves.critical'); }; return (
{/* Header */}

{t('reserves.title')}

{t('reserves.subtitle')}

{/* Key Metrics */}
{/* Total Supply */}

{t('reserves.totalSupply')}

${formatWUSDT(wusdtSupply)}

{t('reserves.onChainHint')}

{/* Off-chain Reserve */}

{t('reserves.offChainReserve')}

${formatWUSDT(offChainReserve)}

setOffChainReserve(parseFloat(e.target.value) || 0)} className="w-24 text-xs bg-gray-700 border border-gray-600 rounded px-2 py-1 text-white" placeholder="Amount" />
{/* Collateral Ratio */}

{t('reserves.collateralRatio')}

{collateralRatio.toFixed(2)}%

{getHealthStatus()}
{/* Health Alert */} {!isHealthy && (

{t('reserves.underCollateralized')}

{t('reserves.underCollateralizedDesc')}

)} {/* Tabs */} {t('reserves.tabOverview')} {t('reserves.tabMultisig')} {t('reserves.tabProof')} {/* Overview Tab */}

{t('reserves.detailsTitle')}

{t('reserves.onChainWusdt')} ${formatWUSDT(wusdtSupply)}
{t('reserves.offChainUsdt')} ${formatWUSDT(offChainReserve)}
{t('reserves.backingRatio')} {collateralRatio.toFixed(2)}%
{t('reserves.status')} {getHealthStatus()}
{t('reserves.lastUpdated')} {lastUpdate.toLocaleTimeString()}

{t('reserves.backingTitle')}

{t('reserves.backingDesc')}

{/* Multisig Tab */} {/* Proof of Reserves Tab */}

{t('reserves.proofTitle')}

{t('reserves.howToVerify')}

  1. {t('reserves.verifyStep1')}
  2. {t('reserves.verifyStep2')}
  3. {t('reserves.verifyStep3')}
  4. {t('reserves.verifyStep4')}

{t('reserves.noteTitle')}

{t('reserves.noteDesc')}

); };