Something went wrong. Try again.
A lexicon-driven AppView for ATProto.
Something went wrong. Try again.
TypeScript
1234567891011121314151617181920212223242526272829303132333435"use client"
import { useCallback, useEffect, useMemo, useState } from "react"import { getOfficialPlugins, type OfficialPluginSummary } from "@/lib/api"
export function useOfficialPlugins() { const [plugins, setPlugins] = useState<OfficialPluginSummary[]>([]) const [loading, setLoading] = useState(true)
const refresh = useCallback(async () => { try { const res = await getOfficialPlugins() setPlugins(res.plugins) } catch { // swallow — registry may be empty on startup } finally { setLoading(false) } }, [])
useEffect(() => { refresh() const id = setInterval(refresh, 60_000) return () => clearInterval(id) }, [refresh])
const byId = useMemo(() => { const map = new Map<string, OfficialPluginSummary>() for (const p of plugins) map.set(p.id, p) return map }, [plugins])
return { plugins, byId, loading, refresh }}