"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"; 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 ? (
) : (
Profile not found
)}
); }; let KnownFollowers = (props: { viewer: ProfileViewDetailed["viewer"]; did: string; }) => { if (!props.viewer?.knownFollowers) return null; let count = props.viewer.knownFollowers.count; return ( <>
Followed by{" "} {props.viewer?.knownFollowers?.followers[0]?.displayName}{" "} {count > 1 ? `and ${count - 1} other${count > 2 ? "s" : ""}` : ""} ); };