import { BigNumber } from 'bignumber.js' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { Image, StyleSheet, Text, View } from 'react-native' import Animated from 'react-native-reanimated' import { useSafeAreaInsets } from 'react-native-safe-area-context' import AppAnalytics from 'src/analytics/AppAnalytics' import { DappShortcutsEvents } from 'src/analytics/Events' import Button, { BtnSizes } from 'src/components/Button' import LegacyTokenDisplay from 'src/components/LegacyTokenDisplay' import TokenDisplay from 'src/components/TokenDisplay' import { navigate } from 'src/navigator/NavigationService' import { Screens } from 'src/navigator/Screens' import { getClaimableRewardId, positionsWithClaimableRewardsSelector, } from 'src/positions/selectors' import { triggerShortcut } from 'src/positions/slice' import { ClaimablePosition } from 'src/positions/types' import { useDispatch, useSelector } from 'src/redux/hooks' import Colors from 'src/styles/colors' import { typeScale } from 'src/styles/fonts' import { Spacing } from 'src/styles/styles' import Logger from 'src/utils/Logger' import { Currency } from 'src/utils/currencies' import { walletAddressSelector } from 'src/web3/selectors' function DappShortcutsRewards() { const { t } = useTranslation() const insets = useSafeAreaInsets() const dispatch = useDispatch() const address = useSelector(walletAddressSelector) const positionsWithClaimableRewards = useSelector(positionsWithClaimableRewardsSelector) const [claimablePositions, setClaimablePositions] = useState(positionsWithClaimableRewards) useEffect(() => { AppAnalytics.track(DappShortcutsEvents.dapp_shortcuts_rewards_screen_open, { numRewards: positionsWithClaimableRewards.length, }) }, []) useEffect(() => { setClaimablePositions((prev) => { // update the displayed rewards in place, so they do not change order and // claimed rewards can remain on the screen even if the reward disappears // after being claimed on data is refreshed const updatedPositions: ClaimablePosition[] = prev.map((reward) => { const updatedReward = positionsWithClaimableRewards.find( (position) => position.address === reward.address ) return ( updatedReward ?? { ...reward, status: 'success', } ) }) // add any new claimable positions to the end of the list const newClaimablePositions = positionsWithClaimableRewards.filter( (position) => !prev.find((reward) => reward.address === position.address) ) return [...updatedPositions, ...newClaimablePositions] }) }, [positionsWithClaimableRewards]) const createConfirmClaimRewardHandler = (position: ClaimablePosition, claimableValueUsd: BigNumber) => () => { if (!address) { // should never happen Logger.error('dapps/DappShortcutsRewards', 'No wallet address found when claiming reward') return } const { appName, displayProps, claimableShortcut, appId } = position const rewardId = getClaimableRewardId(position.address, claimableShortcut) AppAnalytics.track(DappShortcutsEvents.dapp_shortcuts_reward_claim_start, { appName, shortcutId: claimableShortcut.id, rewardId, appId, network: position.networkId, rewardTokens: claimableShortcut.claimableTokens.map((token) => token.symbol).join(', '), rewardAmounts: claimableShortcut.claimableTokens.map((token) => token.balance).join(', '), claimableValueUsd: claimableValueUsd.toString(), }) dispatch( triggerShortcut({ id: rewardId, appName, appImage: displayProps.imageUrl, data: { address, appId, networkId: position.networkId, positionId: position.positionId, positionAddress: position.address, shortcutId: claimableShortcut.id, }, }) ) navigate(Screens.DappShortcutTransactionRequest, { rewardId }) } const renderItem = ({ item }: { item: ClaimablePosition }) => { let claimableValueUsd = new BigNumber(0) item.claimableShortcut.claimableTokens.forEach((token) => { claimableValueUsd = claimableValueUsd.plus( BigNumber(token.priceUsd).times(BigNumber(token.balance)) ) }) const allowClaim = item.status === 'idle' || item.status === 'error' const loading = item.status === 'loading' || item.status === 'pendingAccept' || item.status === 'accepting' return ( {t('dappShortcuts.claimRewardsScreen.rewardLabel')} {item.claimableShortcut.claimableTokens.map((token, index) => ( {index > 0 && ', '} ))} {claimableValueUsd.gt(0) && ( )} {item.status === 'accepting' && ( {t('dappShortcuts.claimRewardsScreen.confirmingReward')} )}