import {memo, useCallback} from 'react' import {type StyleProp, View, type ViewStyle} from 'react-native' import {type AppBskyActorDefs, type ModerationDecision} from '@atproto/api' import {msg} from '@lingui/core/macro' import {useLingui} from '@lingui/react' import {useQueryClient} from '@tanstack/react-query' import {makeProfileLink} from '#/lib/routes/links' import {forceLTR} from '#/lib/strings/bidi' import {NON_BREAKING_SPACE} from '#/lib/strings/constants' import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeHandle} from '#/lib/strings/handles' import {sanitizePronouns} from '#/lib/strings/pronouns' import {niceDate} from '#/lib/strings/time' import {useProfileShadow} from '#/state/cache/profile-shadow' import {unstableCacheProfileView} from '#/state/queries/profile' import {atoms as a, platform, useTheme, web} from '#/alf' import {WebOnlyInlineLinkText} from '#/components/Link' import {PdsBadge} from '#/components/PdsBadge' import {ProfileHoverCard} from '#/components/ProfileHoverCard' import {Text} from '#/components/Typography' import {useSimpleVerificationState} from '#/components/verification' import {VerificationCheck} from '#/components/verification/VerificationCheck' import {IS_ANDROID} from '#/env' import {useActorStatus} from '#/features/liveNow' import {TimeElapsed} from './TimeElapsed' import {PreviewableUserAvatar} from './UserAvatar' interface PostMetaOpts { author: AppBskyActorDefs.ProfileViewBasic moderation: ModerationDecision | undefined postHref: string timestamp: string linkDisabled?: boolean showAvatar?: boolean showPronouns?: boolean avatarSize?: number onOpenAuthor?: () => void style?: StyleProp } let PostMeta = (opts: PostMetaOpts): React.ReactNode => { const t = useTheme() const {i18n, _} = useLingui() const author = useProfileShadow(opts.author) const displayName = author.displayName || author.handle const handle = author.handle // remove dumb typing when you update the atproto api package!! const pronouns = (author as {pronouns?: string})?.pronouns const profileLink = makeProfileLink(author) const queryClient = useQueryClient() const onOpenAuthor = opts.onOpenAuthor const onBeforePressAuthor = useCallback(() => { unstableCacheProfileView(queryClient, author) onOpenAuthor?.() }, [queryClient, author, onOpenAuthor]) const onBeforePressPost = useCallback(() => { unstableCacheProfileView(queryClient, author) }, [queryClient, author]) const timestampLabel = niceDate(i18n, opts.timestamp) const verification = useSimpleVerificationState({profile: author}) const {isActive: live} = useActorStatus(author) const MaybeLinkText = opts.linkDisabled ? Text : WebOnlyInlineLinkText return ( {opts.showAvatar && ( )} {forceLTR( sanitizeDisplayName( displayName, opts.moderation?.ui('displayName'), ), )} {verification.showBadge && ( )} {NON_BREAKING_SPACE + sanitizeHandle(handle, '@')} {opts.showPronouns && pronouns && ( {NON_BREAKING_SPACE + sanitizePronouns(pronouns)} )} {({timeElapsed}) => ( {!opts.showPronouns && ( <> {!IS_ANDROID && ( ·{' '} )} {timeElapsed} )} )} ) } PostMeta = memo(PostMeta) export {PostMeta}