diff --git a/components/Home/NewHome/WalletActions.tsx b/components/Home/NewHome/WalletActions.tsx index 99bbe7790..48edb79dc 100644 --- a/components/Home/NewHome/WalletActions.tsx +++ b/components/Home/NewHome/WalletActions.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { Platform, Pressable, StyleSheet, useWindowDimensions, View } from 'react-native'; +import { Pressable, StyleSheet, useWindowDimensions, View } from 'react-native'; import HomeSend from '@/assets/images/home-send'; import HomeSwap from '@/assets/images/home-swap'; @@ -97,8 +97,7 @@ interface WalletActionsProps { /** * Home action row. No funds → full-width white "Add Funds". Funded → "Add Funds" - * plus "Swap" and "Send". Reuses the global Deposit/Swap/Send modals. Note - * SwapModal renders null on iOS, so Swap self-hides there (same as the legacy row). + * plus "Swap" and "Send". Reuses the global Deposit/Swap/Send modals. * * "Add Funds" has three destinations, and none of them is a destination picker: * @@ -117,7 +116,7 @@ const WalletActions = ({ hasFunds, hasCard }: WalletActionsProps) => { const fundsGoToCard = Boolean(hasCard) && canDepositToCard(provider); // Only the crowded three-pill row needs to shrink; alone, "Add Funds" always fits. const compact = hasFunds && width > 0 && width < COMPACT_WIDTH; - const showSwap = hasFunds && Platform.OS !== 'ios'; + const showSwap = hasFunds; const addFundsTrigger = ; const [isCardModalOpen, setIsCardModalOpen] = useState(false); diff --git a/components/Rewards/EarnPointsSection.tsx b/components/Rewards/EarnPointsSection.tsx index 8907e0ba4..e18489dc1 100644 --- a/components/Rewards/EarnPointsSection.tsx +++ b/components/Rewards/EarnPointsSection.tsx @@ -1,4 +1,4 @@ -import { ActivityIndicator, Platform, View } from 'react-native'; +import { ActivityIndicator, View } from 'react-native'; import { Text } from '@/components/ui/text'; import { useDimension } from '@/hooks/useDimension'; @@ -111,10 +111,7 @@ const EarnPointsSection = () => { ]; }; - // Swap is not available on iOS, so exclude it from the earning methods there. - const earningMethods = getEarningMethods().filter( - method => Platform.OS !== 'ios' || method.title !== 'Swap', - ); + const earningMethods = getEarningMethods(); return ( diff --git a/components/Rewards/TierFeesTable.tsx b/components/Rewards/TierFeesTable.tsx index 0dd378706..d4f162b26 100644 --- a/components/Rewards/TierFeesTable.tsx +++ b/components/Rewards/TierFeesTable.tsx @@ -1,5 +1,3 @@ -import { Platform } from 'react-native'; - import { resolveTierFees } from '@/components/Rewards/NewRewards/tierFees'; import { RewardsTier, TierBenefit, TierBenefits } from '@/lib/types'; @@ -13,8 +11,7 @@ interface TierFeesTableProps { const FEE_ROWS: { key: string; label: string; subtitle?: string }[] = [ { key: 'virtual_card', label: 'Virtual card', subtitle: 'Issued instantly' }, { key: 'bank_deposit', label: 'Bank deposit' }, - // Swap is not available on iOS, so the swap row is omitted there. - ...(Platform.OS === 'ios' ? [] : [{ key: 'swap', label: 'Swaps' }]), + { key: 'swap', label: 'Swaps' }, { key: 'stocks', label: 'Stocks' }, { key: 'fx', label: 'FX conversion' }, { key: 'offramp', label: 'Bank withdrawal' }, diff --git a/components/Swap/SwapModal.tsx b/components/Swap/SwapModal.tsx index 1694e48d3..ae238668c 100644 --- a/components/Swap/SwapModal.tsx +++ b/components/Swap/SwapModal.tsx @@ -1,5 +1,4 @@ import React, { ReactNode, useEffect } from 'react'; -import { Platform } from 'react-native'; import { SWAP_MODAL } from '@/constants/modals'; import { useSwapState } from '@/store/swapStore'; @@ -34,10 +33,6 @@ const SwapModal = ({ trigger = null, defaultOpen = false }: SwapModalProps) => { } }, [defaultOpen, setModal]); - if (Platform.OS === 'ios') { - return null; - } - // Headless usage - the global SwapModalProvider handles the modal if (trigger === null) { return null; diff --git a/components/Swap/SwapModalProvider.tsx b/components/Swap/SwapModalProvider.tsx index c2e6b95bc..d864d1018 100644 --- a/components/Swap/SwapModalProvider.tsx +++ b/components/Swap/SwapModalProvider.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo } from 'react'; -import { Platform, View } from 'react-native'; +import { View } from 'react-native'; import { useRouter } from 'expo-router'; import { useShallow } from 'zustand/react/shallow'; @@ -149,12 +149,6 @@ const SwapModalProvider = () => { handleTransactionStatusPress, ]); - // Regular Swap remains unavailable on iOS. Buy FUSE can open through its - // dedicated entry points and still passes the geo and disclaimer gates. - if (Platform.OS === 'ios' && !isBuyFuse) { - return null; - } - return ( { act(() => root.unmount()); }); -it('keeps the regular Swap modal hidden on iOS', () => { +it('renders the regular Swap modal on iOS', () => { mockCurrentModal = SWAP_MODAL.OPEN_FORM; const root = render(); - expect(root.root.findAllByType('ResponsiveModal')).toHaveLength(0); + expect(root.root.findAllByType('ResponsiveModal')).toHaveLength(1); + expect(root.root.findAllByType('SwapPair')).toHaveLength(1); act(() => root.unmount()); }); diff --git a/components/Wallet/WalletCard.tsx b/components/Wallet/WalletCard.tsx index 9721980a8..f5c1c98e7 100644 --- a/components/Wallet/WalletCard.tsx +++ b/components/Wallet/WalletCard.tsx @@ -1,4 +1,4 @@ -import { Platform, Pressable, View } from 'react-native'; +import { Pressable, View } from 'react-native'; import WalletIcon from '@/assets/images/wallet'; import CountUp from '@/components/CountUp'; @@ -74,7 +74,7 @@ const WalletCard = ({ balance, className, tokens, isLoading, decimalPlaces }: Wa content={ Displaying top three tokens by balance. Wallet can contain any ERC-20 and native - token in Ethereum and Fuse for {Platform.OS === 'ios' ? 'Send' : 'Swap and Send'}. + token in Ethereum and Fuse for Swap and Send. } />