import { ComAtprotoServerDescribeServer, ComAtprotoSyncListRepos } from "@atcute/atproto"; import { Client, CredentialManager } from "@atcute/client"; import { InferXRPCBodyOutput } from "@atcute/lexicons"; import * as TID from "@atcute/tid"; import { A, useLocation, useParams } from "@solidjs/router"; import { createResource, createSignal, For, Show } from "solid-js"; import { Button } from "../components/button"; import { CopyMenu, DropdownMenu, MenuProvider, NavMenu } from "../components/dropdown"; import { Modal } from "../components/modal"; import { setPDS } from "../components/navbar"; import Tooltip from "../components/tooltip"; import { localDateFromTimestamp } from "../utils/date"; const LIMIT = 1000; const PdsView = () => { const params = useParams(); const location = useLocation(); const [version, setVersion] = createSignal(); const [serverInfos, setServerInfos] = createSignal>(); const [cursor, setCursor] = createSignal(); setPDS(params.pds); const pds = params.pds!.startsWith("localhost") ? `http://${params.pds}` : `https://${params.pds}`; const rpc = new Client({ handler: new CredentialManager({ service: pds }) }); const getVersion = async () => { // @ts-expect-error: undocumented endpoint const res = await rpc.get("_health", {}); setVersion((res.data as any).version); }; const describeServer = async () => { const res = await rpc.get("com.atproto.server.describeServer"); if (!res.ok) console.error(res.data.error); else setServerInfos(res.data); }; const fetchRepos = async () => { getVersion(); describeServer(); const res = await rpc.get("com.atproto.sync.listRepos", { params: { limit: LIMIT, cursor: cursor() }, }); if (!res.ok) throw new Error(res.data.error); setCursor(res.data.repos.length < LIMIT ? undefined : res.data.cursor); setRepos(repos()?.concat(res.data.repos) ?? res.data.repos); return res.data; }; const [response, { refetch }] = createResource(fetchRepos); const [repos, setRepos] = createSignal(); const RepoCard = (repo: ComAtprotoSyncListRepos.Repo) => { const [openInfo, setOpenInfo] = createSignal(false); return (
{repo.did} setOpenInfo(false)}>

{repo.did}

Head: {repo.head} Rev:
{repo.rev} ยท {localDateFromTimestamp(TID.parse(repo.rev).timestamp / 1000)}
Active: Status: {repo.status}
); }; const Tab = (props: { tab: "repos" | "info"; label: string }) => ( {props.label} ); return (
{(repo) => }
{(version) => (
Version {version()}
)}
{(server) => ( <>
DID {server().did}
Invite Code Required Phone Verification Required
Available User Domains {(domain) => {domain}}
)}

{repos()?.length} loaded

); }; export { PdsView };