diff options
Diffstat (limited to 'src/view/com/posts/PostFeedItem.tsx')
-rw-r--r-- | src/view/com/posts/PostFeedItem.tsx | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/src/view/com/posts/PostFeedItem.tsx b/src/view/com/posts/PostFeedItem.tsx index 499b9ccd5..facd31e5f 100644 --- a/src/view/com/posts/PostFeedItem.tsx +++ b/src/view/com/posts/PostFeedItem.tsx @@ -1,23 +1,23 @@ -import React, {memo, useMemo, useState} from 'react' +import {memo, useCallback, useMemo, useState} from 'react' import {StyleSheet, View} from 'react-native' import { - AppBskyActorDefs, + type AppBskyActorDefs, AppBskyFeedDefs, AppBskyFeedPost, AppBskyFeedThreadgate, AtUri, - ModerationDecision, + type ModerationDecision, RichText as RichTextAPI, } from '@atproto/api' import { FontAwesomeIcon, - FontAwesomeIconStyle, + type FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useQueryClient} from '@tanstack/react-query' -import {isReasonFeedSource, ReasonFeedSource} from '#/lib/api/feed/types' +import {isReasonFeedSource, type ReasonFeedSource} from '#/lib/api/feed/types' import {MAX_POST_LINES} from '#/lib/constants' import {usePalette} from '#/lib/hooks/usePalette' import {makeProfileLink} from '#/lib/routes/links' @@ -25,7 +25,11 @@ import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeHandle} from '#/lib/strings/handles' import {countLines} from '#/lib/strings/helpers' import {s} from '#/lib/styles' -import {POST_TOMBSTONE, Shadow, usePostShadow} from '#/state/cache/post-shadow' +import { + POST_TOMBSTONE, + type Shadow, + usePostShadow, +} from '#/state/cache/post-shadow' import {useFeedFeedbackContext} from '#/state/feed-feedback' import {precacheProfile} from '#/state/queries/profile' import {useSession} from '#/state/session' @@ -43,7 +47,7 @@ import {Repost_Stroke2_Corner2_Rounded as RepostIcon} from '#/components/icons/R import {ContentHider} from '#/components/moderation/ContentHider' import {LabelsOnMyPost} from '#/components/moderation/LabelsOnMe' import {PostAlerts} from '#/components/moderation/PostAlerts' -import {AppModerationCause} from '#/components/Pills' +import {type AppModerationCause} from '#/components/Pills' import {ProfileHoverCard} from '#/components/ProfileHoverCard' import {RichText} from '#/components/RichText' import {SubtleWebHover} from '#/components/SubtleWebHover' @@ -86,9 +90,11 @@ export function PostFeedItem({ isParentBlocked, isParentNotFound, rootPost, + onShowLess, }: FeedItemProps & { post: AppBskyFeedDefs.PostView rootPost: AppBskyFeedDefs.PostView + onShowLess?: (interaction: AppBskyFeedDefs.Interaction) => void }): React.ReactNode { const postShadowed = usePostShadow(post) const richText = useMemo( @@ -122,6 +128,7 @@ export function PostFeedItem({ isParentBlocked={isParentBlocked} isParentNotFound={isParentNotFound} rootPost={rootPost} + onShowLess={onShowLess} /> ) } @@ -144,23 +151,27 @@ let FeedItemInner = ({ isParentBlocked, isParentNotFound, rootPost, + onShowLess, }: FeedItemProps & { richText: RichTextAPI post: Shadow<AppBskyFeedDefs.PostView> rootPost: AppBskyFeedDefs.PostView + onShowLess?: (interaction: AppBskyFeedDefs.Interaction) => void }): React.ReactNode => { const queryClient = useQueryClient() const {openComposer} = useComposerControls() const pal = usePalette('default') const {_} = useLingui() + const [hover, setHover] = useState(false) + const href = useMemo(() => { const urip = new AtUri(post.uri) return makeProfileLink(post.author, 'post', urip.rkey) }, [post.uri, post.author]) const {sendInteraction} = useFeedFeedbackContext() - const onPressReply = React.useCallback(() => { + const onPressReply = useCallback(() => { sendInteraction({ item: post.uri, event: 'app.bsky.feed.defs#interactionReply', @@ -178,7 +189,7 @@ let FeedItemInner = ({ }) }, [post, record, openComposer, moderation, sendInteraction, feedContext]) - const onOpenAuthor = React.useCallback(() => { + const onOpenAuthor = useCallback(() => { sendInteraction({ item: post.uri, event: 'app.bsky.feed.defs#clickthroughAuthor', @@ -186,7 +197,7 @@ let FeedItemInner = ({ }) }, [sendInteraction, post, feedContext]) - const onOpenReposter = React.useCallback(() => { + const onOpenReposter = useCallback(() => { sendInteraction({ item: post.uri, event: 'app.bsky.feed.defs#clickthroughReposter', @@ -194,7 +205,7 @@ let FeedItemInner = ({ }) }, [sendInteraction, post, feedContext]) - const onOpenEmbed = React.useCallback(() => { + const onOpenEmbed = useCallback(() => { sendInteraction({ item: post.uri, event: 'app.bsky.feed.defs#clickthroughEmbed', @@ -202,7 +213,7 @@ let FeedItemInner = ({ }) }, [sendInteraction, post, feedContext]) - const onBeforePress = React.useCallback(() => { + const onBeforePress = useCallback(() => { sendInteraction({ item: post.uri, event: 'app.bsky.feed.defs#clickthroughItem', @@ -240,7 +251,6 @@ let FeedItemInner = ({ ? rootPost.threadgate.record : undefined - const [hover, setHover] = useState(false) return ( <Link testID={`feedItem-by-${post.author.handle}`} @@ -427,6 +437,7 @@ let FeedItemInner = ({ logContext="FeedItem" feedContext={feedContext} threadgateRecord={threadgateRecord} + onShowLess={onShowLess} /> </View> </View> @@ -461,7 +472,7 @@ let PostContent = ({ const threadgateHiddenReplies = useMergedThreadgateHiddenReplies({ threadgateRecord, }) - const additionalPostAlerts: AppModerationCause[] = React.useMemo(() => { + const additionalPostAlerts: AppModerationCause[] = useMemo(() => { const isPostHiddenByThreadgate = threadgateHiddenReplies.has(post.uri) const rootPostUri = bsky.dangerousIsType<AppBskyFeedPost.Record>( post.record, @@ -482,7 +493,7 @@ let PostContent = ({ : [] }, [post, currentAccount?.did, threadgateHiddenReplies]) - const onPressShowMore = React.useCallback(() => { + const onPressShowMore = useCallback(() => { setLimitLines(false) }, [setLimitLines]) |