"use client"; import { useEffect, useRef } from "react"; import Image from "next/image"; import { Dropdown, DropdownTrigger, DropdownMenu, DropdownItem, } from "@heroui/react"; import { useTokenList } from "@/hooks/useTokenList"; import { Token } from "@/lib/api/tokens"; interface TokenSelectorProps { selectedToken?: Token; onSelect: (token: Token) => void; filterTypes?: ('stablecoin' | 'yield-token')[]; disabled?: boolean; defaultSymbol?: string; } export default function TokenSelector({ selectedToken, onSelect, filterTypes = ['stablecoin', 'yield-token'], disabled = false, defaultSymbol, }: TokenSelectorProps) { const hasInitialized = useRef(false); const { tokens: allTokens, isLoading } = useTokenList(); const tokens = allTokens.filter(t => filterTypes.includes(t.tokenType)); // 数据加载完成后自动选中默认 token(仅初始化一次) useEffect(() => { if (hasInitialized.current || selectedToken || tokens.length === 0) return; hasInitialized.current = true; const target = defaultSymbol ? (tokens.find(t => t.symbol === defaultSymbol) ?? tokens[0]) : tokens[0]; onSelect(target); // eslint-disable-next-line react-hooks/exhaustive-deps }, [tokens]); if (isLoading) { return ( Loading... ); } return ( {selectedToken ? ( <> { (e.target as HTMLImageElement).src = '/assets/tokens/default.svg'; }} /> {selectedToken.symbol} > ) : ( No tokens available )} { const token = tokens.find(t => t.symbol === key); if (token) onSelect(token); }} > {tokens.map((token) => ( { (e.target as HTMLImageElement).src = '/assets/tokens/default.svg'; }} /> {token.symbol} {token.name} ))} ); }