import { useState } from "react"; import { observer } from "mobx-react-lite"; import styled from "styled-components"; import { formatter } from "../../omni/utils"; import { Token } from "../../omni/token"; import { HotConnector } from "../../HotConnector"; import { OmniWallet } from "../../OmniWallet"; import { Network, OmniToken } from "../../omni/config"; import { PopupOption } from "../styles"; import Popup from "../Popup"; import { TokenCard, ImageView } from "./TokenCard"; import { tokens } from "../../omni/tokens"; interface SelectTokenPopupProps { hot: HotConnector; initialChain?: number; onClose: () => void; onSelect: (token: Token, wallet?: OmniWallet) => void; } export const SelectTokenPopup = observer(({ hot, initialChain, onClose, onSelect }: SelectTokenPopupProps) => { const [chain, setChain] = useState(initialChain || null); const [search, setSearch] = useState(""); if (chain == null) { const chains: Record = {}; tokens.list.forEach((token) => { if (!chains[token.chain]) chains[token.chain] = { chain: token.chain, name: token.chainName, icon: token.chainIcon, balance: 0, }; hot.wallets.forEach((wallet) => { const balance = hot.balance(wallet, token); chains[token.chain].balance += token.float(balance) * token.usd; }); }); const sorted = Object.values(chains).sort((a, b) => { if (a.chain === Network.Hot) return -1; return b.balance - a.balance; }); return ( Select chain

} style={{ minHeight: 300 }}> setSearch(e.target.value)} /> {sorted.map(({ chain, balance, name, icon }) => { if (search && !name.toLowerCase().includes(search.toLowerCase())) return; return ( (setChain(chain), setSearch(""))}>

{name}

{balance > 0 &&

${formatter.amount(balance)}

}
); })}
); } if (chain !== -4) { return ( Select token

} style={{ minHeight: 300 }}> setSearch(e.target.value)} /> {tokens.list .filter((token) => token.chain === chain) .sort((a, b) => { const wallet = hot.wallets.find((w) => w.type === a.type)!; const aBalance = a.float(hot.balance(wallet, a)) * a.usd; const bBalance = b.float(hot.balance(wallet, b)) * b.usd; return bBalance - aBalance; }) .map((token) => { const wallet = hot.wallets.find((w) => w.type === token.type); if (search && !token.symbol.toLowerCase().includes(search.toLowerCase())) return; return ; })}
); } let used = new Set(); return ( Select token

}> setSearch(e.target.value)} /> {hot.walletsTokens .filter(({ token, balance }) => { if (token.chain !== Network.Hot) return false; if (token.float(balance) < 0.0001) return false; if (!token.symbol.toLowerCase().includes(search.toLowerCase())) return false; used.add(token.address); return true; }) .sort((a, b) => { const aBalance = a.token.float(a.balance) * a.token.usd; const bBalance = b.token.float(b.balance) * b.token.usd; return bBalance - aBalance; }) .map(({ token, wallet }) => ( ))} {Object.values(OmniToken) .filter((token) => !used.has(token)) .map((token) => ( ))}
); }); const SearchInput = styled.input` width: 100%; padding: 12px 16px; border-radius: 16px; border: 1px solid #282c30; background: #282c30; color: #fff; outline: none; font-size: 20px; font-weight: 500; line-height: 24px; letter-spacing: -0.32px; text-align: left; margin-bottom: 8px; `;