import {useCallback, useMemo, useState} from 'react' import {View} from 'react-native' import {Trans, useLingui} 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 {t: l} = useLingui() const {isLoading, error, data: preferences} = usePreferencesQuery() const isBirthdateUpdateAllowed = useIsBirthdateUpdateAllowed() const {currentAccount} = useSession() const isUsingAppPassword = currentAccount?.accessJwt ? isAppPassword(currentAccount?.accessJwt) : false 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 {t: l} = useLingui() const cleanError = useCleanError() const [date, setDate] = useState(preferences.birthDate || getDateAgo(18)) const {isPending, error, mutateAsync: setBirthDate} = useBirthdateMutation() const hasChanged = date !== preferences.birthDate const errorMessage = useMemo(() => { if (error) { const e = error as Error const {raw, clean} = cleanError(e) return clean || raw || e.toString() } }, [error, cleanError]) const age = getAge(new Date(date)) const isUnder13 = age < 13 const isUnder18 = age >= 13 && age < 18 const onSave = useCallback(async () => { try { // skip if date is the same if (hasChanged) { await setBirthDate({birthDate: date}) } control.close() } catch (error) { const e = error as Error logger.error(`setBirthDate failed`, {message: e.message}) } }, [date, setBirthDate, control, hasChanged]) return ( setDate(new Date(newDate))} label={l`Birthdate`} accessibilityHint={l`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} ) }