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/macro' import {useLingui} from '@lingui/react' import {useQueryClient} from '@tanstack/react-query' import type React from 'react' import {useActorStatus} from '#/lib/actor-status' 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 {niceDate} from '#/lib/strings/time' import {isAndroid} from '#/platform/detection' import {useProfileShadow} from '#/state/cache/profile-shadow' import {precacheProfile} from '#/state/queries/profile' import {atoms as a, platform, useTheme, web} from '#/alf' import {WebOnlyInlineLinkText} from '#/components/Link' import {ProfileHoverCard} from '#/components/ProfileHoverCard' import {Text} from '#/components/Typography' import {useSimpleVerificationState} from '#/components/verification' import {VerificationCheck} from '#/components/verification/VerificationCheck' import {TimeElapsed} from './TimeElapsed' import {PreviewableUserAvatar} from './UserAvatar' interface PostMetaOpts { author: AppBskyActorDefs.ProfileViewBasic moderation: ModerationDecision | undefined postHref: string timestamp: string showAvatar?: 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 const profileLink = makeProfileLink(author) const queryClient = useQueryClient() const onOpenAuthor = opts.onOpenAuthor const onBeforePressAuthor = useCallback(() => { precacheProfile(queryClient, author) onOpenAuthor?.() }, [queryClient, author, onOpenAuthor]) const onBeforePressPost = useCallback(() => { precacheProfile(queryClient, author) }, [queryClient, author]) const timestampLabel = niceDate(i18n, opts.timestamp) const verification = useSimpleVerificationState({profile: author}) const {isActive: live} = useActorStatus(author) return ( {opts.showAvatar && ( )} {forceLTR( sanitizeDisplayName( displayName, opts.moderation?.ui('displayName'), ), )} {verification.showBadge && ( )} {NON_BREAKING_SPACE + sanitizeHandle(handle, '@')} {({timeElapsed}) => ( {!isAndroid && ( ·{' '} )} {timeElapsed} )} ) } PostMeta = memo(PostMeta) export {PostMeta}