Retro Bulletin Board Systems on atproto. Web app and TUI.
atbbs.xyz
python
tui
atproto
bbs
1/** Debounced BBS resolution — resolves a handle to a BBS name if one exists. */
2
3import { useEffect, useState } from "react";
4import { resolveIdentity, getRecord } from "../lib/atproto";
5import { SITE } from "../lib/lexicon";
6import type { Suggestion } from "../components/DialBBS";
7
8const DEBOUNCE_MS = 300;
9
10export function useResolvedBBS(query: string): Suggestion | null {
11 const [result, setResult] = useState<Suggestion | null>(null);
12
13 useEffect(() => {
14 const trimmed = query.trim();
15 if (!trimmed || !trimmed.includes(".")) {
16 setResult(null);
17 return;
18 }
19
20 let cancelled = false;
21 const timeout = setTimeout(async () => {
22 try {
23 const identity = await resolveIdentity(trimmed);
24 const siteRecord = await getRecord(identity.did, SITE, "self");
25 const siteValue = siteRecord.value as { name?: string };
26 if (!cancelled) {
27 setResult({
28 to: `/bbs/${encodeURIComponent(identity.handle)}`,
29 name: siteValue.name ?? identity.handle,
30 handle: identity.handle,
31 });
32 }
33 } catch {
34 if (!cancelled) setResult(null);
35 }
36 }, DEBOUNCE_MS);
37
38 return () => {
39 cancelled = true;
40 clearTimeout(timeout);
41 };
42 }, [query]);
43
44 return result;
45}