Retro Bulletin Board Systems on atproto. Web app and TUI. atbbs.xyz
python tui atproto bbs
at master 45 lines 1.3 kB view raw
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}