import { Button, TokenContextMenu, TokenInfoModal, TokenListItem, TokenModal, } from "@/components"; import { useMoonAccount, useMoonTokenManager } from "@/hooks"; import { shortenAddress } from "@/utils"; import React, { useMemo, useState } from "react"; import type { UserToken } from "./types"; import { useTokenManagmentUIState } from "./useTokenManagmentUIState"; export const UserTokenManager: React.FC = () => { const [contextMenuToken, setContextMenuToken] = React.useState(); const { accounts: wallets, account: wallet } = useMoonAccount(); const { tokensWithGasToken: tokens, addToken, removeToken, updateToken, tokenList, chain, } = useMoonTokenManager(wallets); const [activeFilters, setActiveFilters] = useState([ "balance>0", `selectedWallet`, `selectedChain`, "native", "erc20", ]); const { tokenInfoModalCGID, isEditingExistingToken, setTokenInfoModalCGID, cgToken, setCgToken, newToken, setNewToken, isModalOpen, autocompleteOptions, showAutocomplete, platforms, selectedPlatform, contextMenuOpen, toggleModal, handleAutocompleteChange, handleAutocompleteSelect, handlePlatformChange, toggleContextMenu, } = useTokenManagmentUIState(tokenList); const handleUpdateToken = async () => { await updateToken(newToken); setNewToken({ type: "erc20", name: "", symbol: "", coinGeckoId: "", decimals: 0, address: "", chainId: 1, icon: "", }); toggleModal(); }; const handleAddToken = async () => { await addToken(newToken); setNewToken({ type: "erc20", name: "", symbol: "", coinGeckoId: "", decimals: 0, address: "", chainId: 1, icon: "", }); toggleModal(); }; const toggleFilter = (filter: string) => { setActiveFilters((prev) => prev.includes(filter) ? prev.filter((f) => f !== filter) : [...prev, filter], ); }; const filteredTokens = useMemo(() => { return tokens.filter((token: UserToken) => { if ( activeFilters.includes("balance>0") && Number.parseFloat(token.balance || "0") <= 0 ) { return false; } if ( activeFilters.includes(`selectedChain`) && token.chainId !== chain?.chain_id ) { return false; } if ( activeFilters.includes(`selectedWallet`) && token.wallet?.toLocaleLowerCase() !== (wallet || "").toLocaleLowerCase() ) { return false; } const tokenType = token?.type || "erc20"; if (!activeFilters.includes(tokenType)) { return false; } return true; }); }, [tokens, activeFilters, chain?.chain_id]); const FilterButton: React.FC<{ filter: string; label: string }> = ({ filter, label, }) => ( ); filteredTokens.sort((a, b) => { if (!a?.balance || !b?.balance) return 0; return Number.parseFloat(b.balance) - Number.parseFloat(a.balance); }); return (
{filteredTokens.length === 0 && (

No tokens match the current filters

)}
    {filteredTokens.map((token) => ( { toggleContextMenu(token.address + token.chainId + token.wallet); setContextMenuToken(token); }} /> ))}
{contextMenuOpen && contextMenuToken && ( removeToken(contextMenuToken.address)} onSend={() => alert("Send functionality not implemented")} onEdit={() => { setNewToken(contextMenuToken); setCgToken(contextMenuToken.coinGeckoId); toggleModal(); }} onInfo={() => setTokenInfoModalCGID(contextMenuToken.coinGeckoId)} onClose={() => { toggleContextMenu( contextMenuToken.address + contextMenuToken.chainId + contextMenuToken.wallet, ); setContextMenuToken(null); }} // Toggle to close the context menu /> )} handleAutocompleteChange(value)} autocompleteOptions={autocompleteOptions} showAutocomplete={showAutocomplete} handleAutocompleteChange={(e) => handleAutocompleteChange(e.target.value) } handleAutocompleteSelect={handleAutocompleteSelect} platforms={platforms} selectedPlatform={selectedPlatform} handlePlatformChange={(e) => handlePlatformChange(e.target.value)} newToken={newToken} setNewToken={setNewToken} handleAddToken={handleAddToken} handleUpdateToken={handleUpdateToken} /> setTokenInfoModalCGID("")} cgTokenId={tokenInfoModalCGID} />
); };