From 8136258cd8b8d6fa9c0ee4875956934bc5e3ec7f Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 30 Dec 2025 11:31:09 +0200 Subject: [PATCH] add pressed state to quote embed (#9592) --- src/components/Post/Embed/index.tsx | 42 ++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/components/Post/Embed/index.tsx b/src/components/Post/Embed/index.tsx index 6382412b56..732d10815f 100644 --- a/src/components/Post/Embed/index.tsx +++ b/src/components/Post/Embed/index.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import {useCallback, useMemo} from 'react' import {View} from 'react-native' import { type $Typed, @@ -11,7 +11,6 @@ import { import {Trans} from '@lingui/macro' import {useQueryClient} from '@tanstack/react-query' -import {usePalette} from '#/lib/hooks/usePalette' import {makeProfileLink} from '#/lib/routes/links' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {unstableCacheProfileView} from '#/state/queries/profile' @@ -19,6 +18,7 @@ import {useSession} from '#/state/session' import {Link} from '#/view/com/util/Link' import {PostMeta} from '#/view/com/util/PostMeta' import {atoms as a, useTheme} from '#/alf' +import {useInteractionState} from '#/components/hooks/useInteractionState' import {ContentHider} from '#/components/moderation/ContentHider' import {PostAlerts} from '#/components/moderation/PostAlerts' import {RichText} from '#/components/RichText' @@ -232,7 +232,7 @@ export function QuoteEmbed({ viewContext?: QuoteEmbedViewContext }) { const moderationOpts = useModerationOpts() - const quote = React.useMemo<$Typed>( + const quote = useMemo<$Typed>( () => ({ ...embed.view, $type: 'app.bsky.feed.defs#postView', @@ -241,18 +241,17 @@ export function QuoteEmbed({ }), [embed], ) - const moderation = React.useMemo(() => { + const moderation = useMemo(() => { return moderationOpts ? moderatePost(quote, moderationOpts) : undefined }, [quote, moderationOpts]) const t = useTheme() const queryClient = useQueryClient() - const pal = usePalette('default') const itemUrip = new AtUri(quote.uri) const itemHref = makeProfileLink(quote.author, 'post', itemUrip.rkey) const itemTitle = `Post by ${quote.author.handle}` - const richText = React.useMemo(() => { + const richText = useMemo(() => { if ( !bsky.dangerousIsType( quote.record, @@ -266,17 +265,26 @@ export function QuoteEmbed({ : undefined }, [quote.record]) - const onBeforePress = React.useCallback(() => { + const onBeforePress = useCallback(() => { unstableCacheProfileView(queryClient, quote.author) onOpen?.() }, [queryClient, quote.author, onOpen]) - const [hover, setHover] = React.useState(false) + const { + state: hover, + onIn: onPointerEnter, + onOut: onPointerLeave, + } = useInteractionState() + const { + state: pressed, + onIn: onPressIn, + onOut: onPressOut, + } = useInteractionState() return ( setHover(true)} - onPointerLeave={() => setHover(false)}> + onPointerEnter={onPointerEnter} + onPointerLeave={onPointerLeave}> {({active}) => ( <> - {!active && } + {!active && ( + + )} + onBeforePress={onBeforePress} + onPressIn={onPressIn} + onPressOut={onPressOut}>