import {View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {dateDiff, useGetTimeAgo} from '#/lib/hooks/useTimeAgo' import {isNative} from '#/platform/detection' import {useAgeAssurance} from '#/state/ageAssurance/useAgeAssurance' import {logger} from '#/state/ageAssurance/util' import {useDeviceGeolocationApi} from '#/state/geolocation' 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 { 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' export function AgeAssuranceAccountCard({style}: ViewStyleProp & {}) { const {isReady, isAgeRestricted, isDeclaredUnderage} = useAgeAssurance() if (!isReady) return null if (isDeclaredUnderage) return null if (!isAgeRestricted) return null return } function Inner({style}: ViewStyleProp & {}) { const t = useTheme() const {_, i18n} = useLingui() const control = useDialogControl() const appealControl = Dialog.useDialogControl() const locationControl = Dialog.useDialogControl() const getTimeAgo = useGetTimeAgo() const {gtPhone} = useBreakpoints() const {setDeviceGeolocation} = useDeviceGeolocationApi() const copy = useAgeAssuranceCopy() const {status, lastInitiatedAt} = useAgeAssurance() const isBlocked = status === 'blocked' const hasInitiated = !!lastInitiatedAt const timeAgo = lastInitiatedAt ? getTimeAgo(lastInitiatedAt, new Date()) : null const diff = lastInitiatedAt ? dateDiff(lastInitiatedAt, new Date(), 'down') : null return ( <> {copy.notice} {isNative && ( <> Is your location not accurate?{' '} { locationControl.open() })}> Click here to confirm your location. {' '} { if (props.geolocationStatus.isAgeRestrictedGeo) { 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({ countryCode: props.geolocationStatus.countryCode, regionCode: props.geolocationStatus.regionCode, }) 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() logger.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 )} )} ) }