import { NativeStackScreenProps } from '@react-navigation/native-stack' import React, { useEffect, useRef, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { RefreshControl, ScrollView, StyleSheet, Text, View } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' import AppAnalytics from 'src/analytics/AppAnalytics' import { PointsEvents } from 'src/analytics/Events' import BackButton from 'src/components/BackButton' import BeatingHeartLoader from 'src/components/BeatingHeartLoader' import BottomSheet, { BottomSheetModalRefType } from 'src/components/BottomSheet' import Button, { BtnSizes, BtnTypes } from 'src/components/Button' import InLineNotification, { NotificationVariant } from 'src/components/InLineNotification' import NumberTicker from 'src/components/NumberTicker' import Toast from 'src/components/Toast' import Touchable from 'src/components/Touchable' import CustomHeader from 'src/components/header/CustomHeader' import AttentionIcon from 'src/icons/Attention' import LogoHeart from 'src/images/LogoHeart' import { Screens } from 'src/navigator/Screens' import { StackParamList } from 'src/navigator/types' import ActivityCardSection from 'src/points/ActivityCardSection' import PointsHistoryBottomSheet from 'src/points/PointsHistoryBottomSheet' import { pointsActivitiesSelector, pointsBalanceSelector, pointsBalanceStatusSelector, pointsConfigStatusSelector, pointsHistoryStatusSelector, } from 'src/points/selectors' import { getPointsConfigRetry, pointsDataRefreshStarted } from 'src/points/slice' import { BottomSheetParams, PointsActivityId } from 'src/points/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' type Props = NativeStackScreenProps export default function PointsHome({ route, navigation }: Props) { const { t } = useTranslation() const dispatch = useDispatch() const pointsActivities = useSelector(pointsActivitiesSelector) const pointsConfigStatus = useSelector(pointsConfigStatusSelector) const pointsBalance = useSelector(pointsBalanceSelector) const pointsBalanceStatus = useSelector(pointsBalanceStatusSelector) const pointsHistoryStatus = useSelector(pointsHistoryStatusSelector) const historyBottomSheetRef = useRef(null) const activityCardBottomSheetRef = useRef(null) const disclaimerBottomSheetRef = useRef(null) const [bottomSheetParams, setBottomSheetParams] = useState( undefined ) useEffect(() => { if (bottomSheetParams) { activityCardBottomSheetRef.current?.snapToIndex(0) } }, [bottomSheetParams]) useEffect(() => { onRefreshHistoryAndBalance() }, []) const onRefreshHistoryAndBalance = () => { dispatch(pointsDataRefreshStarted()) } const onCardPress = (bottomSheetDetails: BottomSheetParams) => { setBottomSheetParams(bottomSheetDetails) } const onCtaPressWrapper = (onPress: () => void, activityId: PointsActivityId) => { return () => { AppAnalytics.track(PointsEvents.points_screen_card_cta_press, { activityId, }) activityCardBottomSheetRef.current?.close() onPress() } } const onPressActivity = () => { AppAnalytics.track(PointsEvents.points_screen_activity_press) historyBottomSheetRef.current?.snapToIndex(0) } const onRetryLoadConfig = () => { dispatch(getPointsConfigRetry()) } const onPressDisclaimer = () => { AppAnalytics.track(PointsEvents.points_screen_disclaimer_press) disclaimerBottomSheetRef.current?.snapToIndex(0) } return ( } /> } > {pointsConfigStatus === 'loading' && ( {t('points.loading.title')} {t('points.loading.description')} )} {pointsConfigStatus === 'error' && ( {t('points.error.title')} {t('points.error.description')}