import {useEffect, useReducer, useState} from 'react' import {AppState, type AppStateStatus, View} from 'react-native' import ReactNativeDeviceAttest from 'react-native-device-attest' import Animated, {FadeIn, LayoutAnimationConfig} from 'react-native-reanimated' import {AppBskyGraphStarterpack} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {FEEDBACK_FORM_URL} from '#/lib/constants' import {logger} from '#/logger' import {isAndroid} from '#/platform/detection' import {useServiceQuery} from '#/state/queries/service' import {useStarterPackQuery} from '#/state/queries/starter-packs' import {useActiveStarterPack} from '#/state/shell/starter-pack' import {LoggedOutLayout} from '#/view/com/util/layouts/LoggedOutLayout' import { initialState, reducer, SignupContext, SignupStep, useSubmitSignup, } from '#/screens/Signup/state' import {StepCaptcha} from '#/screens/Signup/StepCaptcha' import {StepHandle} from '#/screens/Signup/StepHandle' import {StepInfo} from '#/screens/Signup/StepInfo' import {atoms as a, useBreakpoints, useTheme} from '#/alf' import {AppLanguageDropdown} from '#/components/AppLanguageDropdown' import {Divider} from '#/components/Divider' import {LinearGradientBackground} from '#/components/LinearGradientBackground' import {InlineLinkText} from '#/components/Link' import {Text} from '#/components/Typography' import {GCP_PROJECT_ID} from '#/env' import * as bsky from '#/types/bsky' export function Signup({onPressBack}: {onPressBack: () => void}) { const {_} = useLingui() const t = useTheme() const [state, dispatch] = useReducer(reducer, initialState) const {gtMobile} = useBreakpoints() const submit = useSubmitSignup() const activeStarterPack = useActiveStarterPack() const { data: starterPack, isFetching: isFetchingStarterPack, isError: isErrorStarterPack, } = useStarterPackQuery({ uri: activeStarterPack?.uri, }) const [isFetchedAtMount] = useState(starterPack != null) const showStarterPackCard = activeStarterPack?.uri && !isFetchingStarterPack && starterPack const { data: serviceInfo, isFetching, isError, refetch, } = useServiceQuery(state.serviceUrl) useEffect(() => { if (isFetching) { dispatch({type: 'setIsLoading', value: true}) } else if (!isFetching) { dispatch({type: 'setIsLoading', value: false}) } }, [isFetching]) useEffect(() => { if (isError) { dispatch({type: 'setServiceDescription', value: undefined}) dispatch({ type: 'setError', value: _( msg`Unable to contact your service. Please check your Internet connection.`, ), }) } else if (serviceInfo) { dispatch({type: 'setServiceDescription', value: serviceInfo}) dispatch({type: 'setError', value: ''}) } }, [_, serviceInfo, isError]) useEffect(() => { if (state.pendingSubmit) { if (!state.pendingSubmit.mutableProcessed) { state.pendingSubmit.mutableProcessed = true submit(state, dispatch) } } }, [state, dispatch, submit]) // Track app backgrounding during signup useEffect(() => { const subscription = AppState.addEventListener( 'change', (nextAppState: AppStateStatus) => { if (nextAppState === 'background') { dispatch({type: 'incrementBackgroundCount'}) } }, ) return () => subscription.remove() }, []) // On Android, warmup the Play Integrity API on the signup screen so it is ready by the time we get to the gate screen. useEffect(() => { if (!isAndroid) { return } ReactNativeDeviceAttest.warmupIntegrity(GCP_PROJECT_ID).catch(err => logger.error(err), ) }, []) return ( {showStarterPackCard && bsky.dangerousIsType( starterPack.record, AppBskyGraphStarterpack.isRecord, ) ? ( {starterPack.record.name} {starterPack.feeds?.length ? ( You'll follow the suggested users and feeds once you finish creating your account! ) : ( You'll follow the suggested users once you finish creating your account! )} ) : null} Step {state.activeStep + 1} of{' '} {state.serviceDescription && !state.serviceDescription.phoneVerificationRequired ? '2' : '3'} {state.activeStep === SignupStep.INFO ? ( Your account ) : state.activeStep === SignupStep.HANDLE ? ( Choose your username ) : ( Complete the challenge )} {state.activeStep === SignupStep.INFO ? ( ) : state.activeStep === SignupStep.HANDLE ? ( ) : ( )} Having trouble?{' '} Contact support ) }