add pressed state to quote embed (#9592)
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user