import {View} from 'react-native' import {msg} from '@lingui/core/macro' import {useLingui} from '@lingui/react' import {Trans} from '@lingui/react/macro' import {dateDiff, useGetTimeAgo} from '#/lib/hooks/useTimeAgo' import {atoms as a, useBreakpoints, useTheme, type ViewStyleProp} from '#/alf' import {Admonition} from '#/components/Admonition' import {AgeAssuranceAppealDialog} from '#/components/ageAssurance/AgeAssuranceAppealDialog' import {AgeAssuranceBadge} from '#/components/ageAssurance/AgeAssuranceBadge' import {AgeAssuranceConfigUnavailableError} from '#/components/ageAssurance/AgeAssuranceErrors' import { AgeAssuranceInitDialog, useDialogControl, } from '#/components/ageAssurance/AgeAssuranceInitDialog' import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {DeviceLocationRequestDialog} from '#/components/dialogs/DeviceLocationRequestDialog' import {Divider} from '#/components/Divider' import {createStaticClick, InlineLinkText} from '#/components/Link' import * as Toast from '#/components/Toast' import {Text} from '#/components/Typography' import {useAgeAssurance} from '#/ageAssurance' import {useComputeAgeAssuranceRegionAccess} from '#/ageAssurance/useComputeAgeAssuranceRegionAccess' import {useAnalytics} from '#/analytics' import {IS_NATIVE} from '#/env' import {useDeviceGeolocationApi} from '#/geolocation' export function AgeAssuranceAccountCard({style}: ViewStyleProp & {}) { const aa = useAgeAssurance() if (aa.state.access === aa.Access.Full) return null if (aa.state.error === 'config') { return ( ) } return } function Inner({style}: ViewStyleProp & {}) { const t = useTheme() const {_, i18n} = useLingui() const ax = useAnalytics() const control = useDialogControl() const appealControl = Dialog.useDialogControl() const locationControl = Dialog.useDialogControl() const getTimeAgo = useGetTimeAgo() const {gtPhone} = useBreakpoints() const {setDeviceGeolocation} = useDeviceGeolocationApi() const computeAgeAssuranceRegionAccess = useComputeAgeAssuranceRegionAccess() const copy = useAgeAssuranceCopy() const aa = useAgeAssurance() const {status, lastInitiatedAt} = aa.state const isBlocked = status === aa.Status.Blocked const hasInitiated = !!lastInitiatedAt const hasCompletedFlow = status === aa.Status.Assured const timeAgo = lastInitiatedAt ? getTimeAgo(lastInitiatedAt, new Date()) : null const diff = lastInitiatedAt ? dateDiff(lastInitiatedAt, new Date(), 'down') : null return ( <> {copy.notice} {hasCompletedFlow && ( If you are 18 years of age or older and want to try again, click the button below and use a different verification method if one is available in your region. If you have questions or concerns,{' '} { appealControl.open() })}> our support team can help. )} {IS_NATIVE && ( <> Is your location not accurate?{' '} { locationControl.open() })}> Tap here to confirm your location. {' '} { const access = computeAgeAssuranceRegionAccess( props.geolocation, ) if (access !== aa.Access.Full) { props.disableDialogAction() props.setDialogError( _( msg`We're sorry, but based on your device's location, you are currently located in a region that requires age assurance.`, ), ) } else { props.closeDialog(() => { // set this after close! setDeviceGeolocation(props.geolocation) Toast.show(_(msg`Thanks! You're all set.`), { type: 'success', }) }) } }} /> )} {isBlocked ? ( You are currently unable to access Bluesky's Age Assurance flow. Please{' '} { appealControl.open() ax.metric('ageAssurance:appealDialogOpen', {}) })}> contact our moderation team {' '} if you believe this is an error. ) : ( <> {lastInitiatedAt && timeAgo && diff ? ( {diff.value === 0 ? ( Last initiated just now ) : ( Last initiated {timeAgo} ago )} ) : ( Age assurance only takes a few minutes )} )} ) }