"use client"; import { useState, useEffect } from "react"; import Image from "next/image"; import { Button } from "@heroui/react"; import { useRouter } from "next/navigation"; import { useApp } from "@/contexts/AppContext"; import { useAccount } from "wagmi"; import { useCollateralBalance, useCollateralValue } from "@/hooks/useCollateral"; import { fetchProducts } from "@/lib/api/fundmarket"; import { useTokenBySymbol } from "@/hooks/useTokenBySymbol"; interface BorrowMarketItemData { tokenType: string; icon: string; iconBg: string; name: string; category: string; contractAddress: string; } // 渐变色映射(用于不同的 YT token) const GRADIENT_COLORS: Record = { 'YT-A': 'linear-gradient(135deg, #FF8904 0%, #F54900 100%)', 'YT-B': 'linear-gradient(135deg, #00BBA7 0%, #007A55 100%)', 'YT-C': 'linear-gradient(135deg, #667EEA 0%, #764BA2 100%)', }; const DEFAULT_GRADIENT = 'linear-gradient(135deg, #6B7280 0%, #374151 100%)'; // 单个代币行组件 function BorrowMarketItem({ tokenData }: { tokenData: BorrowMarketItemData }) { const { t } = useApp(); const router = useRouter(); const { isConnected } = useAccount(); const [mounted, setMounted] = useState(false); // 查询该代币的抵押品余额 const ytToken = useTokenBySymbol(tokenData.tokenType); const { formattedBalance, isLoading: isBalanceLoading } = useCollateralBalance(ytToken); // 查询抵押品价值(用 valueRaw 避免 toFixed 截断误差) const { valueRaw: collateralValueRaw } = useCollateralValue(ytToken); useEffect(() => { setMounted(true); }, []); return (
{/* Token Info */}
{tokenData.name}
{tokenData.name} {tokenData.category}
{/* Your Balance */}
{t("lending.yourBalance")} {!mounted || isBalanceLoading ? '...' : `$${collateralValueRaw.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`} {!mounted || isBalanceLoading ? '' : `${parseFloat(formattedBalance).toLocaleString()} ${tokenData.name}`}
{/* View Details Button */}
); } // 主组件 export default function BorrowMarket({ market }: { market: 'USDC' | 'USDT' }) { const { t } = useApp(); const [tokens, setTokens] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function loadTokens() { setLoading(true); try { const products = await fetchProducts(); const tokenList: BorrowMarketItemData[] = products.map((product) => ({ tokenType: product.tokenSymbol, icon: product.iconUrl, iconBg: GRADIENT_COLORS[product.name] || 'linear-gradient(135deg, #667EEA 0%, #764BA2 100%)', name: product.name, category: product.category || `Yield Token ${product.name.split('-')[1]}`, contractAddress: product.contractAddress || '', })); setTokens(tokenList); } catch (error) { console.error('Failed to fetch tokens:', error); } finally { setLoading(false); } } loadTokens(); }, []); if (loading) { return (

{market} {t("lending.borrowMarket")}

{[1, 2, 3, 4].map((i) => (
))}
); } return (
{/* Title */}

{market} {t("lending.borrowMarket")}

{/* Cards Grid */}
{tokens.map((tokenData) => ( ))}
); }