import { RouteProp } from '@react-navigation/native' import { NativeStackScreenProps } from '@react-navigation/native-stack' import React, { useCallback, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { ActivityIndicator, Dimensions, LayoutChangeEvent, SafeAreaView, ScrollView, StyleSheet, Text, TouchableOpacity, View, } from 'react-native' import Persona from 'src/account/Persona' import { KycStatus } from 'src/account/reducer' import AppAnalytics from 'src/analytics/AppAnalytics' import { CICOEvents, FiatExchangeEvents } from 'src/analytics/Events' import BackButton from 'src/components/BackButton' import FiatConnectQuote from 'src/fiatExchanges/quotes/FiatConnectQuote' import { CICOFlow } from 'src/fiatExchanges/types' import { LinkAccountSection, getTranslationStrings } from 'src/fiatconnect/LinkAccountScreen' import { personaInProgressSelector } from 'src/fiatconnect/selectors' import { personaFinished, personaStarted, postKyc } from 'src/fiatconnect/slice' import i18n from 'src/i18n' import CheckBox from 'src/icons/CheckBox' import GreyOut from 'src/icons/GreyOut' import { emptyHeader } from 'src/navigator/Headers' import { Screens } from 'src/navigator/Screens' import { StackParamList } from 'src/navigator/types' import { useDispatch, useSelector } from 'src/redux/hooks' import { getDynamicConfigParams } from 'src/statsig' import { DynamicConfigs } from 'src/statsig/constants' import { StatsigDynamicConfigs } from 'src/statsig/types' import Colors from 'src/styles/colors' import { typeScale } from 'src/styles/fonts' import variables from 'src/styles/variables' import { navigateToURI } from 'src/utils/linking' export interface Props { quote: FiatConnectQuote flow: CICOFlow step: 'one' | 'two' personaKycStatus?: KycStatus } export default function KycLanding( props: NativeStackScreenProps ) { const { quote, flow, step, personaKycStatus } = props.route.params const personaInProgress = useSelector(personaInProgressSelector) if (personaInProgress) { return ( ) } return ( ) } KycLanding.navigationOptions = ({ route, }: { route: RouteProp }) => ({ ...emptyHeader, headerLeft: () => ( ), headerTitle: i18n.t(getTranslationStrings(route.params.quote.getFiatAccountType()).header), }) const useComponentSize = (): [ { width: number; height: number }, (event: LayoutChangeEvent) => void, ] => { const { width, height } = Dimensions.get('window') const [size, setSize] = useState({ height, width, }) const onLayout = useCallback((event: LayoutChangeEvent) => { const { width, height } = event.nativeEvent.layout setSize({ width, height }) }, []) return [size, onLayout] } function StepOne(props: { disabled: boolean personaKycStatus?: KycStatus quote: FiatConnectQuote }) { const { t } = useTranslation() const { disabled, personaKycStatus, quote } = props const [size, onLayout] = useComponentSize() return ( {disabled && } {t('fiatConnectKycLandingScreen.stepOne')} ) } function StepTwo(props: { quote: FiatConnectQuote; flow: CICOFlow; disabled: boolean }) { const { quote, flow, disabled } = props const { t } = useTranslation() const [size, onLayout] = useComponentSize() return ( {disabled && } {t('fiatConnectKycLandingScreen.stepTwo')} ) } function KycAgreement(props: { personaKycStatus?: KycStatus quote: FiatConnectQuote disabled: boolean }) { const { t } = useTranslation() const dispatch = useDispatch() const { personaKycStatus, quote, disabled } = props const [agreementChecked, toggleAgreementChecked] = useState(false) const { links } = getDynamicConfigParams(DynamicConfigs[StatsigDynamicConfigs.APP_CONFIG]) const onPressPrivacyPolicy = () => { navigateToURI(links.privacy) } return ( {t('fiatConnectKycLandingScreen.title')} {t('fiatConnectKycLandingScreen.description')} toggleAgreementChecked(!agreementChecked)} style={styles.checkBoxContainer} > {/* If disabled, the user is in step 2 and this should be completed already*/} { setTimeout(() => { dispatch(personaStarted()) }, 500) // delay to avoid screen flash AppAnalytics.track(CICOEvents.persona_kyc_start) }} onSuccess={() => { dispatch(postKyc({ quote })) }} onCanceled={() => { dispatch(personaFinished()) }} onError={() => { dispatch(personaFinished()) }} /> ) } const styles = StyleSheet.create({ stepOne: { alignItems: 'center', paddingVertical: 48, borderBottomWidth: 1, borderBottomColor: Colors.borderPrimary, }, stepTwo: { alignItems: 'center', paddingVertical: 48, }, stepText: { ...typeScale.labelSemiBoldMedium, textAlign: 'center', marginBottom: 12, }, content: { flex: 1, flexDirection: 'column', justifyContent: 'center', alignItems: 'center', }, title: { ...typeScale.titleSmall, marginHorizontal: 16, }, description: { ...typeScale.bodyMedium, textAlign: 'center', marginVertical: 12, marginHorizontal: 24, }, disclaimer: { color: Colors.contentSecondary, textAlign: 'left', marginLeft: 11, fontSize: 13, lineHeight: 18, fontWeight: '400', }, privacyLink: { textDecorationLine: 'underline', }, consentContainer: { flex: 1, flexDirection: 'row', marginHorizontal: 27, marginBottom: 12, }, checkBoxContainer: { marginTop: 3, }, activityIndicatorContainer: { paddingVertical: variables.contentPadding, flex: 1, alignContent: 'center', justifyContent: 'center', }, })