import React, {memo, useCallback} from 'react' import {StyleProp, StyleSheet, TextStyle, View, ViewStyle} from 'react-native' import {AppBskyActorDefs, ModerationDecision, ModerationUI} from '@atproto/api' import {useQueryClient} from '@tanstack/react-query' import {precacheProfile} from '#/state/queries/profile' import {usePalette} from 'lib/hooks/usePalette' import {makeProfileLink} from 'lib/routes/links' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' import {niceDate} from 'lib/strings/time' import {TypographyVariant} from 'lib/ThemeContext' import {isAndroid} from 'platform/detection' import {ProfileHoverCard} from '#/components/ProfileHoverCard' import {TextLinkOnWebOnly} from './Link' import {Text} from './text/Text' import {TimeElapsed} from './TimeElapsed' import {PreviewableUserAvatar} from './UserAvatar' interface PostMetaOpts { author: AppBskyActorDefs.ProfileViewBasic moderation: ModerationDecision | undefined authorHasWarning: boolean postHref: string timestamp: string showAvatar?: boolean avatarModeration?: ModerationUI avatarSize?: number displayNameType?: TypographyVariant displayNameStyle?: StyleProp onOpenAuthor?: () => void style?: StyleProp } let PostMeta = (opts: PostMetaOpts): React.ReactNode => { const pal = usePalette('default') const displayName = opts.author.displayName || opts.author.handle const handle = opts.author.handle const profileLink = makeProfileLink(opts.author) const queryClient = useQueryClient() const onOpenAuthor = opts.onOpenAuthor const onBeforePressAuthor = useCallback(() => { precacheProfile(queryClient, opts.author) onOpenAuthor?.() }, [queryClient, opts.author, onOpenAuthor]) const onBeforePressPost = useCallback(() => { precacheProfile(queryClient, opts.author) }, [queryClient, opts.author]) return ( {opts.showAvatar && ( )} {sanitizeDisplayName( displayName, opts.moderation?.ui('displayName'), )} } href={profileLink} onBeforePress={onBeforePressAuthor} /> {!isAndroid && ( · )} {({timeElapsed}) => ( )} ) } PostMeta = memo(PostMeta) export {PostMeta} const styles = StyleSheet.create({ container: { flexDirection: 'row', alignItems: 'flex-end', paddingBottom: 2, gap: 4, zIndex: 1, flex: 1, }, avatar: { alignSelf: 'center', }, maxWidth: { flex: isAndroid ? 1 : undefined, flexShrink: isAndroid ? undefined : 1, }, })