import { observer } from "mobx-react-lite"; import { useEffect, useState } from "react"; import { formatter } from "../../omni/utils"; import { Token } from "../../omni/token"; import { HotConnector } from "../../HotConnector"; import { OmniWallet } from "../../OmniWallet"; import { PopupOption } from "../styles"; import { chainsMap } from "../../omni/config"; const images = { cached: new Map>(), cache(url: string): Promise { if (this.cached.has(url)) return this.cached.get(url)!; const promise = new Promise((resolve, reject) => { const img = new Image(); img.src = url; img.onload = () => resolve(); img.onerror = () => reject(new Error("Failed to load image")); }); this.cached.set(url, promise); return promise; }, }; enum ImageState { Loading = "loading", Loaded = "loaded", Error = "error", } export const ImageView = ({ src, size = 40, alt, style }: { src: string; size?: number; alt: string; style?: React.CSSProperties }) => { const [icon, setIcon] = useState(ImageState.Loading); useEffect(() => { setIcon(ImageState.Loading); images .cache(src) .then(() => setIcon(ImageState.Loaded)) .catch(() => setIcon(ImageState.Error)); }, [src]); if (icon === ImageState.Loaded) { return {alt}; } return (

{alt.charAt(0)?.toUpperCase()}

); }; export const TokenIcon = observer(({ token, wallet }: { token: Token; wallet?: OmniWallet }) => { return (
{token.chain === -4 && wallet?.type && }
); }); export const TokenCard = observer(({ token, onSelect, hot, wallet }: { token: Token; onSelect: (token: Token, wallet?: OmniWallet) => void; hot: HotConnector; wallet?: OmniWallet }) => { const balance = hot.balance(wallet, token); const symbol = token.chain === -4 && !token.isMainOmni ? `${token.originalChainSymbol}_${token.symbol}` : token.symbol; return ( onSelect(token, wallet)}>

{symbol}

${formatter.amount(token.usd)}

{token.readable(balance)}

${token.readable(balance, token.usd)}

); });