import { useState } from 'react'; import { useSnapshot } from 'valtio'; import { Modal, ScrollView, SectionList, View, type SectionListData, type StyleProp, type ViewStyle } from 'react-native'; import { FlexView, IconLink, InputText, ListToken, ListTokenTotalHeight, Separator, Text, TokenButton, useTheme, useCustomDimensions } from '@reown/appkit-ui-react-native'; import { AssetController, AssetUtil, ConnectionsController, SwapController, type SwapControllerState } from '@reown/appkit-core-react-native'; import { type SwapInputTarget, type SwapTokenWithBalance } from '@reown/appkit-common-react-native'; import { Placeholder } from '../../../../partials/w3m-placeholder'; import styles from './styles'; import { createSections } from './utils'; interface Props { onClose: () => void; visible: boolean; type?: SwapInputTarget; style?: StyleProp; } export function SwapSelectTokenModal({ onClose, type, style, visible }: Props) { const { padding, maxHeight } = useCustomDimensions(); const Theme = useTheme(); const { activeNetwork } = useSnapshot(ConnectionsController.state); const { networkImages } = useSnapshot(AssetController.state); const { sourceToken, suggestedTokens, myTokensWithBalance } = useSnapshot( SwapController.state ) as SwapControllerState; const networkImage = AssetUtil.getNetworkImage(activeNetwork, networkImages); const [tokenSearch, setTokenSearch] = useState(''); const isSourceToken = type === 'sourceToken'; const filteredTokens = createSections(isSourceToken, tokenSearch, myTokensWithBalance); const suggestedList = suggestedTokens ?.filter(token => token.address !== SwapController.state.sourceToken?.address) .slice(0, 8); const onSearchChange = (value: string) => { setTokenSearch(value); }; const onTokenPress = (token: SwapTokenWithBalance) => { if (isSourceToken) { SwapController.setSourceToken(token); } else { SwapController.setToToken(token); if (SwapController.state.sourceToken && SwapController.state.sourceTokenAmount) { SwapController.swapTokens(); } } onClose(); }; return ( Select token {!isSourceToken && ( <> {suggestedList?.map((token, index) => ( onTokenPress(token)} style={index !== suggestedList.length - 1 ? styles.suggestedToken : undefined} /> ))} )} []} bounces={false} fadingEdgeLength={20} contentContainerStyle={styles.tokenList} renderSectionHeader={({ section: { title } }) => ( {title} )} ListEmptyComponent={ } getItemLayout={(_, index) => ({ length: ListTokenTotalHeight, offset: ListTokenTotalHeight * index, index })} renderItem={({ item }) => ( onTokenPress(item)} disabled={item.address === sourceToken?.address} /> )} /> ); }