Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
374 changes: 120 additions & 254 deletions src/components/scenes/RampCreateScene.tsx

Large diffs are not rendered by default.

150 changes: 150 additions & 0 deletions src/components/scenes/RampCreateScene/RampRegionSelect.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
import * as React from 'react'
import { View } from 'react-native'
import Feather from 'react-native-vector-icons/Feather'
import { sprintf } from 'sprintf-js'

import { useHandler } from '../../../hooks/useHandler'
import { lstrings } from '../../../locales/strings'
import { EdgeTouchableOpacity } from '../../common/EdgeTouchableOpacity'
import { SceneWrapper } from '../../common/SceneWrapper'
import { SceneContainer } from '../../layout/SceneContainer'
import { cacheStyles, useTheme } from '../../services/ThemeContext'
import { EdgeText } from '../../themed/EdgeText'

interface Props {
headerTitle: string
onRegionSelect: () => Promise<void>
}

export const RampRegionSelect: React.FC<Props> = props => {
const { headerTitle, onRegionSelect } = props
const theme = useTheme()
const styles = getStyles(theme)

const handleRegionSelect = useHandler(async () => {
await onRegionSelect()
})

return (
<SceneWrapper scroll hasTabs>
<SceneContainer headerTitle={headerTitle}>
<EdgeText style={styles.subtitleText}>
{lstrings.trade_region_select_start_steps}
</EdgeText>

<View style={styles.stepsCard}>
<View style={styles.stepRow}>
<EdgeText style={styles.stepNumberText}>
{sprintf(lstrings.step_prefix_s, '1')}
</EdgeText>
<EdgeText style={styles.stepText} numberOfLines={0}>
{lstrings.trade_region_select_step_1}
</EdgeText>
</View>
<View style={styles.stepRow}>
<EdgeText style={styles.stepNumberText}>
{sprintf(lstrings.step_prefix_s, '2')}
</EdgeText>
<EdgeText style={styles.stepText} numberOfLines={0}>
{lstrings.trade_region_select_step_2}
</EdgeText>
</View>
<View style={styles.stepRow}>
<EdgeText style={styles.stepNumberText}>
{sprintf(lstrings.step_prefix_s, '3')}
</EdgeText>
<EdgeText style={styles.stepText} numberOfLines={0}>
{lstrings.trade_region_select_step_3}
</EdgeText>
</View>
<View style={styles.stepRow}>
<EdgeText style={styles.stepNumberText}>
{sprintf(lstrings.step_prefix_s, '4')}
</EdgeText>
<EdgeText style={styles.stepText} numberOfLines={0}>
{lstrings.trade_region_select_step_4}
</EdgeText>
</View>
</View>

<EdgeTouchableOpacity
style={styles.regionButton}
onPress={handleRegionSelect}
>
<Feather
style={styles.globeIcon}
name="globe"
color={theme.iconTappable}
size={theme.rem(1.5)}
/>
<EdgeText
style={styles.regionButtonText}
disableFontScaling
ellipsizeMode="tail"
numberOfLines={1}
>
{lstrings.buy_sell_crypto_select_country_button}
</EdgeText>
<Feather
name="chevron-right"
color={theme.iconTappable}
size={theme.rem(1.25)}
/>
</EdgeTouchableOpacity>
</SceneContainer>
</SceneWrapper>
)
}

const getStyles = cacheStyles((theme: ReturnType<typeof useTheme>) => ({
stepsCard: {
marginHorizontal: theme.rem(0.5),
marginVertical: theme.rem(0.5),
padding: theme.rem(1),
backgroundColor: theme.cardBaseColor,
borderRadius: theme.rem(0.5),
borderWidth: theme.thinLineWidth,
borderColor: theme.cardBorderColor
},
stepRow: {
flexDirection: 'row' as const,
alignItems: 'flex-start' as const,
marginVertical: theme.rem(0.25),
gap: theme.rem(0.5)
},
stepNumberText: {
fontWeight: '600' as const,
minWidth: theme.rem(1.25)
},
stepText: {
flex: 1
},
regionButton: {
flexDirection: 'row' as const,
alignItems: 'center' as const,
backgroundColor: theme.cardBaseColor,
borderRadius: theme.rem(0.5),
margin: theme.rem(0.5),
padding: theme.rem(1),
borderWidth: theme.thinLineWidth,
borderColor: theme.cardBorderColor,
gap: theme.rem(0.5)
},
regionButtonText: {
flexShrink: 1,
color: theme.primaryText,
fontSize: theme.rem(1.1),
fontFamily: theme.fontFaceDefault
},
globeIcon: {
marginRight: theme.rem(0.75)
},
subtitleText: {
color: theme.primaryText,
fontSize: theme.rem(1.25),
fontFamily: theme.fontFaceDefault,
marginTop: theme.rem(1),
marginBottom: theme.rem(0.5),
marginHorizontal: theme.rem(0.5)
}
}))
4 changes: 2 additions & 2 deletions src/plugins/ramps/banxa/banxaRampPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -891,9 +891,9 @@ export const banxaRampPlugin: RampPluginFactory = (
const currencyPluginId = request.wallet.currencyInfo.pluginId

const isMaxAmount =
typeof request.exchangeAmount === 'object' && request.exchangeAmount.max
'max' in request.exchangeAmount && request.exchangeAmount.max
const exchangeAmount =
typeof request.exchangeAmount === 'object' ? '' : request.exchangeAmount
'amount' in request.exchangeAmount ? request.exchangeAmount.amount : ''

// Fetch provider configuration (cached or fresh)
const config = await fetchProviderConfig()
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/ramps/bity/bityRampPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -686,9 +686,9 @@ export const bityRampPlugin = (pluginConfig: RampPluginConfig): RampPlugin => {
const isBuy = direction === 'buy'

const isMaxAmount =
typeof request.exchangeAmount === 'object' && request.exchangeAmount.max
'max' in request.exchangeAmount && request.exchangeAmount.max
const exchangeAmount =
typeof request.exchangeAmount === 'object' ? '' : request.exchangeAmount
'amount' in request.exchangeAmount ? request.exchangeAmount.amount : ''

// Validate region using helper function
if (!isRegionSupported(regionCode)) {
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/ramps/moonpay/moonpayRampPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -518,9 +518,9 @@ export const moonpayRampPlugin: RampPluginFactory = (
const fiatCurrencyCode = ensureIsoPrefix(request.fiatCurrencyCode)

const isMaxAmount =
typeof request.exchangeAmount === 'object' && request.exchangeAmount.max
'max' in request.exchangeAmount && request.exchangeAmount.max
const exchangeAmountString =
typeof request.exchangeAmount === 'object' ? '' : request.exchangeAmount
'amount' in request.exchangeAmount ? request.exchangeAmount.amount : ''

// Fetch provider configuration (with caching)
const config = await fetchProviderConfig()
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/ramps/paybis/paybisRampPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -748,9 +748,9 @@ export const paybisRampPlugin: RampPluginFactory = (
const currencyPluginId = request.wallet.currencyInfo.pluginId

const isMaxAmount =
typeof request.exchangeAmount === 'object' && request.exchangeAmount.max
'max' in request.exchangeAmount && request.exchangeAmount.max
const exchangeAmount =
typeof request.exchangeAmount === 'object' ? '' : request.exchangeAmount
'amount' in request.exchangeAmount ? request.exchangeAmount.amount : ''

// Validate region restrictions
if (regionCode != null) {
Expand Down
8 changes: 7 additions & 1 deletion src/plugins/ramps/rampPluginTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,17 @@ export interface RampSupportResult {
supportedAmountTypes?: Array<'fiat' | 'crypto'>
}

export type RampExchangeAmount =
| {
max: true
}
| { amount: string }

export interface RampQuoteRequest {
wallet: EdgeCurrencyWallet
tokenId: EdgeTokenId
displayCurrencyCode: string
exchangeAmount: string | { max: true }
exchangeAmount: RampExchangeAmount
fiatCurrencyCode: string
amountType: 'fiat' | 'crypto'
direction: 'buy' | 'sell'
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/ramps/revolut/revolutRampPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,9 +192,9 @@ export const revolutRampPlugin: RampPluginFactory = (
const currencyPluginId = request.wallet.currencyInfo.pluginId

const isMaxAmount =
typeof request.exchangeAmount === 'object' && request.exchangeAmount.max
'max' in request.exchangeAmount && request.exchangeAmount.max
const exchangeAmount =
typeof request.exchangeAmount === 'object' ? '' : request.exchangeAmount
'amount' in request.exchangeAmount ? request.exchangeAmount.amount : ''

// Constraints per request
const constraintOk = validateRampQuoteRequest(
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/ramps/simplex/simplexRampPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -481,9 +481,9 @@ export const simplexRampPlugin: RampPluginFactory = (
const currencyPluginId = request.wallet.currencyInfo.pluginId

const isMaxAmount =
typeof request.exchangeAmount === 'object' && request.exchangeAmount.max
'max' in request.exchangeAmount && request.exchangeAmount.max
const exchangeAmount =
typeof request.exchangeAmount === 'object' ? '' : request.exchangeAmount
'amount' in request.exchangeAmount ? request.exchangeAmount.amount : ''

// Validate direction
if (!validateDirection(direction)) {
Expand Down
Loading