add pressed state to quote embed (#9592)

This commit is contained in:
Samuel Newman
2025-12-30 11:31:09 +02:00
committed by GitHub
parent afe5db8b57
commit 8136258cd8
+29 -13
View File
@@ -1,4 +1,4 @@
import React from 'react' import {useCallback, useMemo} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import { import {
type $Typed, type $Typed,
@@ -11,7 +11,6 @@ import {
import {Trans} from '@lingui/macro' import {Trans} from '@lingui/macro'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
import {usePalette} from '#/lib/hooks/usePalette'
import {makeProfileLink} from '#/lib/routes/links' import {makeProfileLink} from '#/lib/routes/links'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {unstableCacheProfileView} from '#/state/queries/profile' import {unstableCacheProfileView} from '#/state/queries/profile'
@@ -19,6 +18,7 @@ import {useSession} from '#/state/session'
import {Link} from '#/view/com/util/Link' import {Link} from '#/view/com/util/Link'
import {PostMeta} from '#/view/com/util/PostMeta' import {PostMeta} from '#/view/com/util/PostMeta'
import {atoms as a, useTheme} from '#/alf' import {atoms as a, useTheme} from '#/alf'
import {useInteractionState} from '#/components/hooks/useInteractionState'
import {ContentHider} from '#/components/moderation/ContentHider' import {ContentHider} from '#/components/moderation/ContentHider'
import {PostAlerts} from '#/components/moderation/PostAlerts' import {PostAlerts} from '#/components/moderation/PostAlerts'
import {RichText} from '#/components/RichText' import {RichText} from '#/components/RichText'
@@ -232,7 +232,7 @@ export function QuoteEmbed({
viewContext?: QuoteEmbedViewContext viewContext?: QuoteEmbedViewContext
}) { }) {
const moderationOpts = useModerationOpts() const moderationOpts = useModerationOpts()
const quote = React.useMemo<$Typed<AppBskyFeedDefs.PostView>>( const quote = useMemo<$Typed<AppBskyFeedDefs.PostView>>(
() => ({ () => ({
...embed.view, ...embed.view,
$type: 'app.bsky.feed.defs#postView', $type: 'app.bsky.feed.defs#postView',
@@ -241,18 +241,17 @@ export function QuoteEmbed({
}), }),
[embed], [embed],
) )
const moderation = React.useMemo(() => { const moderation = useMemo(() => {
return moderationOpts ? moderatePost(quote, moderationOpts) : undefined return moderationOpts ? moderatePost(quote, moderationOpts) : undefined
}, [quote, moderationOpts]) }, [quote, moderationOpts])
const t = useTheme() const t = useTheme()
const queryClient = useQueryClient() const queryClient = useQueryClient()
const pal = usePalette('default')
const itemUrip = new AtUri(quote.uri) const itemUrip = new AtUri(quote.uri)
const itemHref = makeProfileLink(quote.author, 'post', itemUrip.rkey) const itemHref = makeProfileLink(quote.author, 'post', itemUrip.rkey)
const itemTitle = `Post by ${quote.author.handle}` const itemTitle = `Post by ${quote.author.handle}`
const richText = React.useMemo(() => { const richText = useMemo(() => {
if ( if (
!bsky.dangerousIsType<AppBskyFeedPost.Record>( !bsky.dangerousIsType<AppBskyFeedPost.Record>(
quote.record, quote.record,
@@ -266,17 +265,26 @@ export function QuoteEmbed({
: undefined : undefined
}, [quote.record]) }, [quote.record])
const onBeforePress = React.useCallback(() => { const onBeforePress = useCallback(() => {
unstableCacheProfileView(queryClient, quote.author) unstableCacheProfileView(queryClient, quote.author)
onOpen?.() onOpen?.()
}, [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 ( return (
<View <View
style={[a.mt_sm]} style={[a.mt_sm]}
onPointerEnter={() => setHover(true)} onPointerEnter={onPointerEnter}
onPointerLeave={() => setHover(false)}> onPointerLeave={onPointerLeave}>
<ContentHider <ContentHider
modui={moderation?.ui('contentList')} modui={moderation?.ui('contentList')}
style={[a.rounded_md, a.border, t.atoms.border_contrast_low, style]} style={[a.rounded_md, a.border, t.atoms.border_contrast_low, style]}
@@ -284,13 +292,21 @@ export function QuoteEmbed({
childContainerStyle={[a.pt_sm]}> childContainerStyle={[a.pt_sm]}>
{({active}) => ( {({active}) => (
<> <>
{!active && <SubtleHover hover={hover} style={[a.rounded_md]} />} {!active && (
<SubtleHover
native
hover={hover || pressed}
style={[a.rounded_md]}
/>
)}
<Link <Link
style={[!active && a.p_md]} style={[!active && a.p_md]}
hoverStyle={{borderColor: pal.colors.borderLinkHover}} hoverStyle={t.atoms.border_contrast_high}
href={itemHref} href={itemHref}
title={itemTitle} title={itemTitle}
onBeforePress={onBeforePress}> onBeforePress={onBeforePress}
onPressIn={onPressIn}
onPressOut={onPressOut}>
<View pointerEvents="none"> <View pointerEvents="none">
<PostMeta <PostMeta
author={quote.author} author={quote.author}