import BigNumber from 'bignumber.js'
import React from 'react'
import { useTranslation } from 'react-i18next'
import { StyleSheet, Text, View } from 'react-native'
import AppAnalytics from 'src/analytics/AppAnalytics'
import { EarnEvents } from 'src/analytics/Events'
import TokenDisplay from 'src/components/TokenDisplay'
import Touchable from 'src/components/Touchable'
import { useEarnPositionProviderName } from 'src/earn/hooks'
import { navigate } from 'src/navigator/NavigationService'
import { Screens } from 'src/navigator/Screens'
import Colors from 'src/styles/colors'
import { typeScale } from 'src/styles/fonts'
import { Spacing } from 'src/styles/styles'
import variables from 'src/styles/variables'
import TransactionFeedItemImage from 'src/transactions/feed/TransactionFeedItemImage'
import {
EarnClaimReward,
EarnDeposit,
EarnSwapDeposit,
EarnWithdraw,
TokenTransactionTypeV2,
} from 'src/transactions/types'
interface DescriptionProps {
transaction: EarnWithdraw | EarnDeposit | EarnClaimReward | EarnSwapDeposit
}
function Description({ transaction }: DescriptionProps) {
const { t } = useTranslation()
const providerName = useEarnPositionProviderName(
transaction.type === TokenTransactionTypeV2.EarnSwapDeposit
? transaction.deposit.providerId
: transaction.providerId
)
let title
let subtitle
switch (transaction.type) {
case TokenTransactionTypeV2.EarnSwapDeposit:
case TokenTransactionTypeV2.EarnDeposit:
title = t('earnFlow.transactionFeed.earnDepositTitle')
subtitle = t('earnFlow.transactionFeed.earnDepositSubtitle', { providerName })
break
case TokenTransactionTypeV2.EarnWithdraw:
title = t('earnFlow.transactionFeed.earnWithdrawTitle')
subtitle = t('earnFlow.transactionFeed.earnWithdrawSubtitle', { providerName })
break
case TokenTransactionTypeV2.EarnClaimReward:
title = t('earnFlow.transactionFeed.earnClaimTitle')
subtitle = t('earnFlow.transactionFeed.earnClaimSubtitle', { providerName })
break
}
return (
{title}
{!!providerName && (
{subtitle}
)}
)
}
interface AmountDisplayProps {
transaction: EarnWithdraw | EarnDeposit | EarnClaimReward | EarnSwapDeposit
isLocal: boolean
}
function AmountDisplay({ transaction, isLocal }: AmountDisplayProps) {
let amountValue
let tokenId
switch (transaction.type) {
case TokenTransactionTypeV2.EarnDeposit:
amountValue = new BigNumber(-transaction.outAmount.value)
tokenId = transaction.outAmount.tokenId
break
case TokenTransactionTypeV2.EarnSwapDeposit:
amountValue = new BigNumber(-transaction.deposit.outAmount.value)
tokenId = transaction.deposit.outAmount.tokenId
break
case TokenTransactionTypeV2.EarnWithdraw:
amountValue = new BigNumber(transaction.inAmount.value)
tokenId = transaction.inAmount.tokenId
break
case TokenTransactionTypeV2.EarnClaimReward:
amountValue = new BigNumber(transaction.amount.value)
tokenId = transaction.amount.tokenId
break
}
const textStyle = isLocal
? styles.amountSubtitle
: [
styles.amountTitle,
transaction.type !== TokenTransactionTypeV2.EarnDeposit &&
transaction.type !== TokenTransactionTypeV2.EarnSwapDeposit && { color: Colors.accent },
]
return (
)
}
interface AmountProps {
transaction: EarnWithdraw | EarnDeposit | EarnClaimReward | EarnSwapDeposit
}
function Amount({ transaction }: AmountProps) {
return (
)
}
interface Props {
transaction: EarnWithdraw | EarnDeposit | EarnClaimReward | EarnSwapDeposit
}
export default function EarnFeedItem({ transaction }: Props) {
return (
{
AppAnalytics.track(EarnEvents.earn_feed_item_select, { origin: transaction.type })
navigate(Screens.TransactionDetailsScreen, { transaction })
}}
>
)
}
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
paddingVertical: Spacing.Small12,
paddingHorizontal: variables.contentPadding,
alignItems: 'center',
},
contentContainer: {
flex: 1,
paddingHorizontal: variables.contentPadding,
},
title: {
...typeScale.labelMedium,
},
subtitle: {
...typeScale.bodySmall,
color: Colors.contentSecondary,
},
amountContainer: {
maxWidth: '50%',
},
amountTitle: {
...typeScale.labelMedium,
flexWrap: 'wrap',
textAlign: 'right',
},
amountSubtitle: {
...typeScale.bodySmall,
color: Colors.contentSecondary,
flexWrap: 'wrap',
textAlign: 'right',
},
})