import { useRef, useMemo, useState } from "react"; import { ButtonModal } from "../Buttons"; import { useJupiterApiContext } from "../../contexts"; import { TokenInfo } from "@solana/spl-token-registry"; import { useVirtualList } from "ahooks"; import { ChevronDownIcon, LinkIcon } from "@heroicons/react/solid"; import defaultCoin from "../../assets/default-coin.png"; import { Link } from "../Link"; import Urls from "../../settings/urls"; const Row = ({ info, handleSelect, }: { info: TokenInfo; handleSelect: (e: TokenInfo) => void; }) => { return ( ); }; const Coin = ({ tokenInfo }: { tokenInfo: TokenInfo }) => { return (
{ currentTarget.onerror = null; // prevents looping currentTarget.src = defaultCoin; }} className="h-[25px] w-[25px]" />
{tokenInfo.symbol}
); }; const TOP_COINS = [ "EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp", // FIDA "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt", // SRM "9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E", // BTC "So11111111111111111111111111111111111111112", // wSOL "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R", // RAY "MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac", // Mango "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", // USDT "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So", // mSOL ]; const TopCoin = ({ token, handleSelect, }: { token: TokenInfo; handleSelect: (e: TokenInfo) => void; }) => { return ( ); }; export const SelectCoin = ({ tokenInfo, setCoin, }: { tokenInfo: TokenInfo | null | undefined; setCoin: React.Dispatch>; }) => { const containerRef = useRef(null); const wrapperRef = useRef(null); const { tokenMap } = useJupiterApiContext(); const [search, setSearch] = useState(""); const [visible, setVisible] = useState(false); const originalList = useMemo( () => Array.from(tokenMap.values()).filter( (e) => e.address.includes(search) || e.name.toLowerCase().includes(search.toLowerCase()) || e.symbol.toLowerCase().includes(search.toLowerCase()) ), [search, tokenInfo] ); const topList = originalList.filter((e) => TOP_COINS.includes(e.address)); const [list, scrollTo] = useVirtualList(originalList, { containerTarget: containerRef, wrapperTarget: wrapperRef, itemHeight: 70, overscan: 10, }); const handleSelect = (e: TokenInfo) => { setCoin(e); setVisible(false); }; if (!tokenInfo) { return null; } return ( } modalClass="h-screen overflow-clip" > { setSearch(e.target.value.trim()); scrollTo(0); }} type="text" id="search-token" placeholder="Search" className="w-full mb-3 text-xs font-bold sm:text-lg input input-bordered input-info" spellCheck={false} />
{topList.map((e, idx) => ( ))}
{list.map((e) => ( ))}
); };