import { useState, useEffect } from "react"; import { Card } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Search, RefreshCw } from "lucide-react"; import { Skeleton } from "@/components/ui/skeleton"; interface Token { id: string; symbol: string; chain_name: string; balance: string; } interface BalancesProps { client: { getBalances: (params: { evmAddress: string }) => Promise; }; account: any; onBalanceClick?: (balance: Token) => void; } export const Balances = ({ client, account, onBalanceClick = () => {}, }: BalancesProps) => { const [balances, setBalances] = useState([]); const [error, setError] = useState(null); const [search, setSearch] = useState(""); const [selectedChain, setSelectedChain] = useState(""); const { address, status } = account; const [isReloading, setIsReloading] = useState(false); const fetchBalances = async (reloading = false) => { if (reloading) setIsReloading(true); try { const result = await client.getBalances({ evmAddress: address }); setBalances(result); } catch (err: any) { setError(err.message); } finally { if (reloading) setIsReloading(false); } }; useEffect(() => { if (client && address) { fetchBalances(); } }, [client, address]); useEffect(() => { setBalances([]); setError(null); }, [address]); const uniqueChains = Array.from( new Set(balances.map((token: Token) => token.chain_name)) ); const filteredBalances = balances .filter( (token: Token) => token.symbol.toLowerCase().includes(search.toLowerCase()) && (selectedChain === "" || token.chain_name === selectedChain) ) .sort( (a: Token, b: Token) => parseFloat(b.balance) - parseFloat(a.balance) ); const SearchInput = (
setSearch(e.target.value)} className="pl-9" />
); const ChainFilter = (
{uniqueChains.map((chain) => ( ))}
); const BalancesList = (filteredBalances: Token[]) => (
{filteredBalances.map((token: Token) => (
onBalanceClick(token)} >
{token.symbol} {token.chain_name}
{parseFloat(token.balance).toFixed(2)}
))}
); const LoadingSkeleton = (
{Array(5) .fill(null) .map((_, index) => ( ))}
); const ErrorMessage = (
Something went wrong
); return (
{SearchInput} {error ? ( ErrorMessage ) : status === "connected" ? ( <> {ChainFilter} {filteredBalances.length > 0 ? BalancesList(filteredBalances) : LoadingSkeleton} ) : ( LoadingSkeleton )}
); };