import React from 'react' import {View} from 'react-native' import {msg} from '@lingui/core/macro' import {useLingui} from '@lingui/react' import {Trans} from '@lingui/react/macro' import {useCleanError} from '#/lib/hooks/useCleanError' import {isAppPassword} from '#/lib/jwt' import {getAge, getDateAgo} from '#/lib/strings/time' import {logger} from '#/logger' import { useBirthdateMutation, useIsBirthdateUpdateAllowed, } from '#/state/birthdate' import { usePreferencesQuery, type UsePreferencesQueryResponse, } from '#/state/queries/preferences' import {useSession} from '#/state/session' import {ErrorMessage} from '#/view/com/util/error/ErrorMessage' import {atoms as a, useTheme, web} from '#/alf' import {Admonition} from '#/components/Admonition' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {DateField} from '#/components/forms/DateField' import {SimpleInlineLinkText} from '#/components/Link' import {Loader} from '#/components/Loader' import {Span, Text} from '#/components/Typography' import {IS_IOS, IS_WEB} from '#/env' export function BirthDateSettingsDialog({ control, }: { control: Dialog.DialogControlProps }) { const t = useTheme() const {_} = useLingui() const {isLoading, error, data: preferences} = usePreferencesQuery() const isBirthdateUpdateAllowed = useIsBirthdateUpdateAllowed() const {currentAccount} = useSession() const isUsingAppPassword = isAppPassword(currentAccount?.accessJwt || '') return ( {isBirthdateUpdateAllowed ? ( My Birthdate This information is private and not shared with other users. {isLoading ? ( ) : error || !preferences ? ( ) : isUsingAppPassword ? ( Hmm, it looks like you're signed in with an{' '} App Password. To set your birthdate, you'll need to sign in with your main account password, or ask whomever controls this account to do so. ) : ( )} ) : ( You recently changed your birthdate There is a limit to how often you can change your birthdate. You may need to wait a day or two before updating it again. )} ) } function BirthdayInner({ control, preferences, }: { control: Dialog.DialogControlProps preferences: UsePreferencesQueryResponse }) { const {_} = useLingui() const cleanError = useCleanError() const [date, setDate] = React.useState( preferences.birthDate || getDateAgo(18), ) const {isPending, error, mutateAsync: setBirthDate} = useBirthdateMutation() const hasChanged = date !== preferences.birthDate const errorMessage = React.useMemo(() => { if (error) { const {raw, clean} = cleanError(error) return clean || raw || error.toString() } }, [error, cleanError]) const age = getAge(new Date(date)) const isUnder13 = age < 13 const isUnder18 = age >= 13 && age < 18 const onSave = React.useCallback(async () => { try { // skip if date is the same if (hasChanged) { await setBirthDate({birthDate: date}) } control.close() } catch (e: any) { logger.error(`setBirthDate failed`, {message: e.message}) } }, [date, setBirthDate, control, hasChanged]) return ( setDate(new Date(newDate))} label={_(msg`Birthdate`)} accessibilityHint={_(msg`Enter your birthdate`)} /> {isUnder18 && hasChanged && ( The birthdate you've entered means you are under 18 years old. Certain content and features may be unavailable to you. )} {isUnder13 && ( You must be at least 13 years old to use Bluesky. Read our{' '} Terms of Service {' '} for more information. )} {errorMessage ? ( ) : undefined} ) }