import { Client, CredentialManager } from "@atcute/client"; import { Did } from "@atcute/lexicons"; import { deleteStoredSession, getSession, OAuthUserAgent } from "@atcute/oauth-browser-client"; import { A } from "@solidjs/router"; import { createSignal, For, onMount, Show } from "solid-js"; import { createStore } from "solid-js/store"; import { resolveDidDoc } from "../utils/api.js"; import { agent, Login, retrieveSession, setAgent } from "./login.jsx"; import { Modal } from "./modal.jsx"; const AccountManager = () => { const [openManager, setOpenManager] = createSignal(false); const [sessions, setSessions] = createStore>(); const [avatar, setAvatar] = createSignal(); onMount(async () => { await retrieveSession(); const storedSessions = localStorage.getItem("atcute-oauth:sessions"); if (storedSessions) { const sessionDids = Object.keys(JSON.parse(storedSessions)) as Did[]; sessionDids.forEach((did) => setSessions(did, "")); sessionDids.forEach(async (did) => { const doc = await resolveDidDoc(did); doc.alsoKnownAs?.forEach((alias) => { if (alias.startsWith("at://")) { setSessions(did, alias.replace("at://", "")); return; } }); }); } const repo = localStorage.getItem("lastSignedIn"); if (repo) setAvatar(await getAvatar(repo as Did)); }); const resumeSession = async (did: Did) => { localStorage.setItem("lastSignedIn", did); retrieveSession(); setAvatar(await getAvatar(did)); }; const removeSession = async (did: Did) => { const currentSession = agent()?.sub; try { const session = await getSession(did, { allowStale: true }); const agent = new OAuthUserAgent(session); await agent.signOut(); } catch { deleteStoredSession(did); } setSessions(did, undefined); if (currentSession === did) setAgent(undefined); }; const getAvatar = 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.avatar; } return undefined; }; return ( <> setOpenManager(false)}>
Manage accounts
{(did) => (
setOpenManager(false)} class="flex items-center p-1" >
)}
); }; export { AccountManager };