From ba943148b6a17110b4ec55f923d19731569f9a10 Mon Sep 17 00:00:00 2001 From: 5jiji Date: Sun, 7 Dec 2025 00:38:52 +0100 Subject: [PATCH] Hovering over DIDs now makes a popup appear! --- src/components/didlink.tsx | 94 ++++++++++++++++++++++++++++++++++++++ src/components/json.tsx | 5 +- 2 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 src/components/didlink.tsx diff --git a/src/components/didlink.tsx b/src/components/didlink.tsx new file mode 100644 index 0000000..abed70d --- /dev/null +++ b/src/components/didlink.tsx @@ -0,0 +1,94 @@ +import { A } from "@solidjs/router"; +import { createSignal, createEffect, Show } from "solid-js"; +import { createStore } from "solid-js/store"; +import { Client, CredentialManager, SuccessClientResponse } from "@atcute/client"; +import { Did } from "@atcute/lexicons"; +import { mainSchema } from "@atcute/bluesky/types/app/actor/getProfile"; + +type getProfileResult = SuccessClientResponse["data"]; + +export const DIDLink = (props: { + did: Did +}) => { + let [hover, setHover] = createSignal(false); + const [previewHeight, setPreviewHeight] = createSignal(0); + const [data, setData] = createStore>(); + + let rkeyRef!: HTMLSpanElement; + let previewRef!: HTMLSpanElement; + + createEffect(async () => { + if (hover()) { + setPreviewHeight(previewRef.offsetHeight); + + if (data[props.did] === undefined) { + let data = await getData(props.did); + if (data) setData(props.did, data); + } + }; + }); + + const getData = async (did: Did) => { + const rpc = new Client({ + handler: new CredentialManager({service: "https://public.api.bsky.app"}), + }); + const res = await rpc.get("app.bsky.actor.getProfile", { params: { actor: did } }); + if (res.ok) { + return res.data; + } + return null; + } + + const isOverflowing = (previewHeight: number) => + rkeyRef.offsetTop - window.scrollY + previewHeight + 32 > window.innerHeight; + + return ( + setHover(true)} + onmouseleave={() => setHover(false)} + class="relative w-full min-w-0 items-start rounded px-0.5 hover:bg-neutral-200 active:bg-neutral-300 dark:hover:bg-neutral-700 dark:active:bg-neutral-600" + > + + {props.did} + + + + + } + > + + + +
+ {props.did}} + > + {data[props.did].displayName} + + @handle.invalid} + > + + @{data[props.did].handle} + + +
+
+
+
+
+ ) +} diff --git a/src/components/json.tsx b/src/components/json.tsx index 7f7b758..eef22da 100644 --- a/src/components/json.tsx +++ b/src/components/json.tsx @@ -6,6 +6,7 @@ import { hideMedia } from "../views/settings"; import { pds } from "./navbar"; import { addNotification, removeNotification } from "./notification"; import VideoPlayer from "./video-player"; +import { DIDLink } from "./didlink.tsx"; interface AtBlob { $type: string; @@ -61,9 +62,7 @@ const JSONString = (props: { {part} : isDid(part) ? - - {part} - + : isNsid(part.split("#")[0]) && props.isType ?