diff --git a/packages/app/package.json b/packages/app/package.json index 2a59b9da..eaf19e7d 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -15,7 +15,6 @@ "@snort/system-wasm": "workspace:*", "@snort/system-web": "workspace:*", "@szhsin/react-menu": "^3.3.1", - "@uidotdev/usehooks": "^2.3.1", "@void-cat/api": "^1.0.10", "classnames": "^2.3.2", "debug": "^4.3.4", diff --git a/packages/app/src/Element/Embed/Mention.tsx b/packages/app/src/Element/Embed/Mention.tsx index b6c95ac5..51c8961b 100644 --- a/packages/app/src/Element/Embed/Mention.tsx +++ b/packages/app/src/Element/Embed/Mention.tsx @@ -1,25 +1,35 @@ import { NostrLink, NostrPrefix } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; -import { useHover } from "@uidotdev/usehooks"; import DisplayName from "@/Element/User/DisplayName"; import { ProfileCard } from "@/Element/User/ProfileCard"; import { ProfileLink } from "@/Element/User/ProfileLink"; +import { useCallback, useRef, useState } from "react"; export default function Mention({ link }: { link: NostrLink }) { - const [ref, hovering] = useHover(); const profile = useUserProfile(link.id); + const [isHovering, setIsHovering] = useState(false); + + const hoverTimeoutRef = useRef(null); + + const handleMouseEnter = useCallback(() => { + hoverTimeoutRef.current && clearTimeout(hoverTimeoutRef.current); + hoverTimeoutRef.current = setTimeout(() => setIsHovering(true), 100); // Adjust timeout as needed + }, []); + + const handleMouseLeave = useCallback(() => { + hoverTimeoutRef.current && clearTimeout(hoverTimeoutRef.current); + hoverTimeoutRef.current = setTimeout(() => setIsHovering(false), 300); // Adjust timeout as needed + }, []); if (link.type !== NostrPrefix.Profile && link.type !== NostrPrefix.PublicKey) return; return ( - <> + e.stopPropagation()}> - - @ - + @ - - + {isHovering && } + ); } diff --git a/packages/app/src/Element/User/ProfileCard.tsx b/packages/app/src/Element/User/ProfileCard.tsx index ff033122..e6be79f7 100644 --- a/packages/app/src/Element/User/ProfileCard.tsx +++ b/packages/app/src/Element/User/ProfileCard.tsx @@ -10,28 +10,15 @@ import Text from "@/Element/Text"; import { useEffect, useState } from "react"; import useLogin from "../../Hooks/useLogin"; -interface RectElement { - getBoundingClientRect(): { - left: number; - right: number; - top: number; - bottom: number; - width: number; - height: number; - }; -} - export function ProfileCard({ pubkey, user, show, - ref, delay, }: { pubkey: string; user?: UserMetadata; show: boolean; - ref: React.RefObject; delay?: number; }) { const [showProfileMenu, setShowProfileMenu] = useState(false); @@ -56,7 +43,6 @@ export function ProfileCard({ return ( setShowProfileMenu(false)} align="end"> diff --git a/packages/app/src/Element/User/ProfileImage.tsx b/packages/app/src/Element/User/ProfileImage.tsx index 309f786f..629de337 100644 --- a/packages/app/src/Element/User/ProfileImage.tsx +++ b/packages/app/src/Element/User/ProfileImage.tsx @@ -1,9 +1,8 @@ import "./ProfileImage.css"; -import React, { ReactNode } from "react"; +import React, { ReactNode, useCallback, useRef, useState } from "react"; import { HexKey, socialGraphInstance, UserMetadata } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; -import { useHover } from "@uidotdev/usehooks"; import classNames from "classnames"; import Avatar from "@/Element/User/Avatar"; @@ -51,7 +50,19 @@ export default function ProfileImage({ const user = useUserProfile(profile ? "" : pubkey) ?? profile; const nip05 = defaultNip ? defaultNip : user?.nip05; const followDistance = socialGraphInstance.getFollowDistance(pubkey); - const [ref, hovering] = useHover(); + const [isHovering, setIsHovering] = useState(false); + + const hoverTimeoutRef = useRef(null); + + const handleMouseEnter = useCallback(() => { + hoverTimeoutRef.current && clearTimeout(hoverTimeoutRef.current); + hoverTimeoutRef.current = setTimeout(() => setIsHovering(true), 100); // Adjust timeout as needed + }, []); + + const handleMouseLeave = useCallback(() => { + hoverTimeoutRef.current && clearTimeout(hoverTimeoutRef.current); + hoverTimeoutRef.current = setTimeout(() => setIsHovering(false), 300); // Adjust timeout as needed + }, []); function handleClick(e: React.MouseEvent) { if (link === "") { @@ -69,7 +80,7 @@ export default function ProfileImage({ } return ( <> -
+
; + if ((showProfileCard ?? true) && user && isHovering) { + return ( +
+ +
+ ); } return null; } @@ -120,7 +135,7 @@ export default function ProfileImage({ ); } else { return ( - <> +
{profileCard()} - +
); } }