"use client"; import { Popover } from "./Popover"; import useSWR from "swr"; import { callRPC } from "app/api/rpc/client"; import { useRef, useState } from "react"; import { ProfileHeader } from "app/(home-pages)/p/[didOrHandle]/ProfileHeader"; import { SpeedyLink } from "./SpeedyLink"; import { Tooltip } from "./Tooltip"; import { ProfileViewDetailed } from "@atproto/api/dist/client/types/app/bsky/actor/defs"; import { BlueskyTiny } from "./Icons/BlueskyTiny"; import { ArrowRightTiny } from "./Icons/ArrowRightTiny"; export const ProfilePopover = (props: { trigger: React.ReactNode; didOrHandle: string; }) => { const [isOpen, setIsOpen] = useState(false); let [isHovered, setIsHovered] = useState(false); const hoverTimeout = useRef(null); const { data, isLoading } = useSWR( isHovered ? ["profile-data", props.didOrHandle] : null, async () => { const response = await callRPC("get_profile_data", { didOrHandle: props.didOrHandle, }); return response.result; }, ); return ( { if (hoverTimeout.current) { window.clearTimeout(hoverTimeout.current); } hoverTimeout.current = window.setTimeout(async () => { setIsHovered(true); }, 150); }} onPointerLeave={() => { if (isHovered) return; if (hoverTimeout.current) { window.clearTimeout(hoverTimeout.current); hoverTimeout.current = null; } setIsHovered(false); }} > {props.trigger} } onOpenChange={setIsOpen} > {isLoading ? (
Loading...
) : data ? (
) : (
No profile found...
)}
); }; const ProfileLinks = (props: { handle: string }) => { let linkClassName = "flex gap-1.5 text-tertiary items-center border border-transparent px-1 rounded-md hover:bg-[var(--accent-light)] hover:border-accent-contrast hover:text-accent-contrast no-underline hover:no-underline"; return (

Bluesky
Full profile
); };