import {useMemo, useState} from 'react' import {View} from 'react-native' import {type AppBskyActorDefs, moderateProfile} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {differenceInSeconds} from 'date-fns' import {HITSLOP_10} from '#/lib/constants' import {useGetTimeAgo} from '#/lib/hooks/useTimeAgo' import {sanitizeDisplayName} from '#/lib/strings/display-names' import {isNative} from '#/platform/detection' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useSession} from '#/state/session' import {atoms as a, useTheme, web} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {useDialogControl} from '#/components/Dialog' import {Newskie} from '#/components/icons/Newskie' import * as StarterPackCard from '#/components/StarterPack/StarterPackCard' import {Text} from '#/components/Typography' export function NewskieDialog({ profile, disabled, }: { profile: AppBskyActorDefs.ProfileViewDetailed disabled?: boolean }) { const {_} = useLingui() const control = useDialogControl() const createdAt = profile.createdAt as string | undefined const [now] = useState(() => Date.now()) const daysOld = useMemo(() => { if (!createdAt) return Infinity return differenceInSeconds(now, new Date(createdAt)) / 86400 }, [createdAt, now]) if (!createdAt || daysOld > 7) return null return ( ) } function DialogInner({ profile, createdAt, now, }: { profile: AppBskyActorDefs.ProfileViewDetailed createdAt: string now: number }) { const control = Dialog.useDialogContext() const {_} = useLingui() const t = useTheme() const moderationOpts = useModerationOpts() const {currentAccount} = useSession() const timeAgo = useGetTimeAgo() const isMe = profile.did === currentAccount?.did const profileName = useMemo(() => { if (!moderationOpts) return profile.displayName || profile.handle const moderation = moderateProfile(profile, moderationOpts) return sanitizeDisplayName( profile.displayName || profile.handle, moderation.ui('displayName'), ) }, [moderationOpts, profile]) const getJoinMessage = () => { const timeAgoString = timeAgo(createdAt, now, {format: 'long'}) if (isMe) { if (profile.joinedViaStarterPack) { return _( msg`You joined Bluesky using a starter pack ${timeAgoString} ago`, ) } else { return _(msg`You joined Bluesky ${timeAgoString} ago`) } } else { if (profile.joinedViaStarterPack) { return _( msg`${profileName} joined Bluesky using a starter pack ${timeAgoString} ago`, ) } else { return _(msg`${profileName} joined Bluesky ${timeAgoString} ago`) } } } return ( {isMe ? Welcome, friend! : Say hello!} {getJoinMessage()} {profile.joinedViaStarterPack ? ( control.close()}> ) : null} {isNative && ( )} ) }