diff options
author | dan <dan.abramov@gmail.com> | 2024-04-28 13:59:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-28 13:59:18 +0100 |
commit | 3b4848ba59591b58a95c61af210697149a858f57 (patch) | |
tree | b555c462d2a8dc74790d44b455071d3b210f9ac2 | |
parent | 74cd1d44581b9ad2224bdf69819ca6f6208e3266 (diff) | |
download | voidsky-3b4848ba59591b58a95c61af210697149a858f57.tar.zst |
Reduce hovercard false positives, add them to display names and handles (#3739)
* Don't trigger hovercards on scroll * Add display name / handle hovercards * Increase hovercard delay
-rw-r--r-- | src/components/ProfileHoverCard/index.web.tsx | 18 | ||||
-rw-r--r-- | src/view/com/util/PostMeta.tsx | 65 |
2 files changed, 47 insertions, 36 deletions
diff --git a/src/components/ProfileHoverCard/index.web.tsx b/src/components/ProfileHoverCard/index.web.tsx index 2cd1228d8..d1b00d522 100644 --- a/src/components/ProfileHoverCard/index.web.tsx +++ b/src/components/ProfileHoverCard/index.web.tsx @@ -72,10 +72,10 @@ type Action = | 'unhovered-long-enough' | 'finished-animating-hide' -const SHOW_DELAY = 400 +const SHOW_DELAY = 500 const SHOW_DURATION = 300 const HIDE_DELAY = 150 -const HIDE_DURATION = 150 +const HIDE_DURATION = 200 export function ProfileHoverCardInner(props: ProfileHoverCardProps) { const {refs, floatingStyles} = useFloating({ @@ -244,12 +244,20 @@ export function ProfileHoverCardInner(props: ProfileHoverCardProps) { } }, [prefetchProfileQuery, props.did]) - const onPointerEnterTarget = React.useCallback(() => { + const didFireHover = React.useRef(false) + const onPointerMoveTarget = React.useCallback(() => { prefetchIfNeeded() - dispatch('hovered-target') + // Conceptually we want something like onPointerEnter, + // but we want to ignore entering only due to scrolling. + // So instead we hover on the first onPointerMove. + if (!didFireHover.current) { + didFireHover.current = true + dispatch('hovered-target') + } }, [prefetchIfNeeded]) const onPointerLeaveTarget = React.useCallback(() => { + didFireHover.current = false dispatch('unhovered-target') }, []) @@ -280,7 +288,7 @@ export function ProfileHoverCardInner(props: ProfileHoverCardProps) { return ( <div ref={refs.setReference} - onPointerEnter={onPointerEnterTarget} + onPointerMove={onPointerMoveTarget} onPointerLeave={onPointerLeaveTarget} onMouseUp={onPress} style={{ diff --git a/src/view/com/util/PostMeta.tsx b/src/view/com/util/PostMeta.tsx index db16ff066..e7ce18535 100644 --- a/src/view/com/util/PostMeta.tsx +++ b/src/view/com/util/PostMeta.tsx @@ -11,6 +11,7 @@ import {sanitizeHandle} from 'lib/strings/handles' import {niceDate} from 'lib/strings/time' import {TypographyVariant} from 'lib/ThemeContext' import {isAndroid, isWeb} from 'platform/detection' +import {ProfileHoverCard} from '#/components/ProfileHoverCard' import {TextLinkOnWebOnly} from './Link' import {Text} from './text/Text' import {TimeElapsed} from './TimeElapsed' @@ -58,37 +59,39 @@ let PostMeta = (opts: PostMetaOpts): React.ReactNode => { /> </View> )} - <Text - numberOfLines={1} - style={[styles.maxWidth, pal.textLight, opts.displayNameStyle]}> - <TextLinkOnWebOnly - type={opts.displayNameType || 'lg-bold'} - style={[pal.text]} - lineHeight={1.2} - disableMismatchWarning - text={ - <> - {sanitizeDisplayName( - displayName, - opts.moderation?.ui('displayName'), - )} - </> - } - href={profileLink} - onBeforePress={onBeforePress} - onPointerEnter={onPointerEnter} - /> - <TextLinkOnWebOnly - type="md" - disableMismatchWarning - style={[pal.textLight, {flexShrink: 4}]} - text={'\xa0' + sanitizeHandle(handle, '@')} - href={profileLink} - onBeforePress={onBeforePress} - onPointerEnter={onPointerEnter} - anchorNoUnderline - /> - </Text> + <ProfileHoverCard inline did={opts.author.did}> + <Text + numberOfLines={1} + style={[styles.maxWidth, pal.textLight, opts.displayNameStyle]}> + <TextLinkOnWebOnly + type={opts.displayNameType || 'lg-bold'} + style={[pal.text]} + lineHeight={1.2} + disableMismatchWarning + text={ + <> + {sanitizeDisplayName( + displayName, + opts.moderation?.ui('displayName'), + )} + </> + } + href={profileLink} + onBeforePress={onBeforePress} + onPointerEnter={onPointerEnter} + /> + <TextLinkOnWebOnly + type="md" + disableMismatchWarning + style={[pal.textLight, {flexShrink: 4}]} + text={'\xa0' + sanitizeHandle(handle, '@')} + href={profileLink} + onBeforePress={onBeforePress} + onPointerEnter={onPointerEnter} + anchorNoUnderline + /> + </Text> + </ProfileHoverCard> {!isAndroid && ( <Text type="md" |