import React, { useState, useEffect, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { usePezkuwi } from '@/contexts/PezkuwiContext'; import { toast } from 'sonner'; import { getPoolMember, getPoolSize, getCurrentValidatorSet, joinValidatorPool, leaveValidatorPool, updateValidatorCategory, ValidatorPoolCategory } from '@shared/lib/validator-pool'; import { Loader2, Users, UserCheck, UserX } from 'lucide-react'; import { PoolCategorySelector } from './PoolCategorySelector'; export function ValidatorPoolDashboard() { const { t } = useTranslation(); const { api, selectedAccount } = usePezkuwi(); const [poolMember, setPoolMember] = useState(null); const [poolSize, setPoolSize] = useState(0); const [validatorCount, setValidatorCount] = useState(0); const [loading, setLoading] = useState(true); const [actionLoading, setActionLoading] = useState(false); const fetchData = useCallback(async () => { if (!api) return; try { setLoading(true); const [size, validatorSet] = await Promise.all([ getPoolSize(api), getCurrentValidatorSet(api), ]); setPoolSize(size); // Calculate total validator count if (validatorSet) { const total = validatorSet.stake_validators.length + validatorSet.parliamentary_validators.length + validatorSet.merit_validators.length; setValidatorCount(total); } if (selectedAccount) { const memberData = await getPoolMember(api, selectedAccount.address); setPoolMember(memberData); } } catch (error) { if (import.meta.env.DEV) console.error('Failed to fetch validator pool data:', error); toast.error(t('validatorPool.fetchError')); } finally { setLoading(false); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [api, selectedAccount]); useEffect(() => { fetchData(); }, [fetchData]); const handleJoin = async (category: ValidatorPoolCategory) => { if (!api || !selectedAccount) return; setActionLoading(true); try { await joinValidatorPool(api, selectedAccount, category); toast.success(t('validatorPool.joinedPool', { category })); fetchData(); } catch (error) { if (import.meta.env.DEV) console.error('Join pool error:', error); // Error toast already shown in joinValidatorPool } finally { setActionLoading(false); } }; const handleLeave = async () => { if (!api || !selectedAccount) return; setActionLoading(true); try { await leaveValidatorPool(api, selectedAccount); toast.success(t('validatorPool.leftPool')); fetchData(); } catch (error) { if (import.meta.env.DEV) console.error('Leave pool error:', error); // Error toast already shown in leaveValidatorPool } finally { setActionLoading(false); } }; const handleCategorySwitch = async (newCategory: ValidatorPoolCategory) => { if (!api || !selectedAccount) return; setActionLoading(true); try { await updateValidatorCategory(api, selectedAccount, newCategory); toast.success(t('validatorPool.switchedCategory', { category: newCategory })); fetchData(); } catch (error) { if (import.meta.env.DEV) console.error('Switch category error:', error); // Error toast already shown in updateValidatorCategory } finally { setActionLoading(false); } }; if (loading) { return (

{t('validatorPool.loading')}

); } return ( {t('validatorPool.title')} {t('validatorPool.description')}
{t('validatorPool.poolSize')}
{poolSize}
{t('validatorPool.activeValidators')}
{validatorCount}
{selectedAccount ? ( poolMember ? (

{t('validatorPool.inPool', { category: poolMember })}

) : (

{t('validatorPool.notInPool')}

) ) : (

{t('validatorPool.connectWallet')}

)}
); }