import { NativeStackScreenProps } from '@react-navigation/native-stack' import BigNumber from 'bignumber.js' import React, { useMemo, useRef, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { LayoutChangeEvent, Platform, StyleSheet, Text, View } from 'react-native' import Animated, { useAnimatedScrollHandler, useSharedValue } from 'react-native-reanimated' import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context' import AppAnalytics from 'src/analytics/AppAnalytics' import { EarnEvents } from 'src/analytics/Events' import { EarnCommonProperties } from 'src/analytics/Properties' import { openUrl } from 'src/app/actions' import BottomSheet, { BottomSheetModalRefType } from 'src/components/BottomSheet' import Button, { BtnSizes, BtnTypes } from 'src/components/Button' import { IconSize } from 'src/components/TokenIcon' import Touchable from 'src/components/Touchable' import { useDepositEntrypointInfo } from 'src/earn/hooks' import BeforeDepositBottomSheet from 'src/earn/poolInfoScreen/BeforeDepositBottomSheet' import { AgeCard, DailyYieldRateCard, DepositAndEarningsCard, TvlCard, YieldCard, } from 'src/earn/poolInfoScreen/Cards' import { SafetyCard } from 'src/earn/poolInfoScreen/SafetyCard' import TokenIcons from 'src/earn/poolInfoScreen/TokenIcons' import WithdrawBottomSheet from 'src/earn/poolInfoScreen/WithdrawBottomSheet' import OpenLinkIcon from 'src/icons/OpenLinkIcon' import { navigate } from 'src/navigator/NavigationService' import { Screens } from 'src/navigator/Screens' import useScrollAwareHeader from 'src/navigator/ScrollAwareHeader' import { StackParamList } from 'src/navigator/types' import { positionsWithBalanceSelector } from 'src/positions/selectors' import { EarnPosition } from 'src/positions/types' import { useDispatch, useSelector } from 'src/redux/hooks' import { NETWORK_NAMES } from 'src/shared/conts' import { getFeatureGate } from 'src/statsig' import { StatsigFeatureGates } from 'src/statsig/types' 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 { tokensByIdSelector } from 'src/tokens/selectors' import { TokenBalance } from 'src/tokens/slice' import { navigateToURI } from 'src/utils/linking' function HeaderTitleSection({ earnPosition, tokensInfo, }: { earnPosition: EarnPosition tokensInfo: TokenBalance[] }) { return ( {/* View wrapper is needed to prevent token icons from overlapping title text */} {earnPosition.displayProps.title} ) } function TitleSection({ title, tokensInfo, providerName, networkName, onLayout, }: { title: string tokensInfo: TokenBalance[] providerName: string networkName: string onLayout?: (event: LayoutChangeEvent) => void }) { return ( {/* View wrapper is needed to prevent TokenIcons from taking up the whole line */} {title} ) } function LearnMoreTouchable({ url, providerName, commonAnalyticsProps, }: { url: string providerName: string commonAnalyticsProps: EarnCommonProperties }) { const { t } = useTranslation() return ( { AppAnalytics.track(EarnEvents.earn_pool_info_view_pool, commonAnalyticsProps) navigateToURI(url) }} > {t('earnFlow.poolInfoScreen.learnMoreOnProvider', { providerName })} ) } function ActionButtons({ earnPosition, onPressDeposit, onPressWithdraw, }: { earnPosition: EarnPosition onPressDeposit: () => void onPressWithdraw: () => void }) { const { bottom } = useSafeAreaInsets() const insetsStyle = { paddingBottom: Math.max(bottom, Spacing.Regular16), } const { t } = useTranslation() const { availableShortcutIds } = earnPosition const deposit = availableShortcutIds.includes('deposit') const withdraw = availableShortcutIds.includes('withdraw') && new BigNumber(earnPosition.balance).gt(0) return ( {withdraw && (