import { Client, CredentialManager } from "@atcute/client"; import { Did } from "@atcute/lexicons"; import { createAuthorizationUrl, deleteStoredSession, getSession, OAuthUserAgent, } from "@atcute/oauth-browser-client"; import { A } from "@solidjs/router"; import { createSignal, For, onMount, Show } from "solid-js"; import { createStore, produce } from "solid-js/store"; import { resolveDidDoc } from "../utils/api.js"; import { agent, Login, retrieveSession, Sessions, setAgent } from "./login.jsx"; import { Modal } from "./modal.jsx"; export const [sessions, setSessions] = createStore(); export const AccountManager = () => { const [openManager, setOpenManager] = createSignal(false); const [avatars, setAvatars] = createStore>(); onMount(async () => { try { await retrieveSession(); } catch {} const localSessions = localStorage.getItem("sessions"); if (localSessions) { const storedSessions: Sessions = JSON.parse(localSessions); const sessionDids = Object.keys(storedSessions) as Did[]; sessionDids.forEach(async (did) => { const doc = await resolveDidDoc(did); const alias = doc.alsoKnownAs?.find((alias) => alias.startsWith("at://")); if (alias) { setSessions(did, { signedIn: storedSessions[did].signedIn, handle: alias.replace("at://", ""), }); } }); sessionDids.forEach(async (did) => { const avatar = await getAvatar(did); if (avatar) setAvatars(did, avatar); }); } }); const resumeSession = async (did: Did) => { try { localStorage.setItem("lastSignedIn", did); await retrieveSession(); } catch { const authUrl = await createAuthorizationUrl({ scope: import.meta.env.VITE_OAUTH_SCOPE, target: { type: "account", identifier: did }, }); await new Promise((resolve) => setTimeout(resolve, 250)); location.assign(authUrl); } }; 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( produce((accs) => { delete accs[did]; }), ); localStorage.setItem("sessions", JSON.stringify(sessions)); 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 rounded-md p-1 hover:bg-neutral-200 active:bg-neutral-300 dark:hover:bg-neutral-700 dark:active:bg-neutral-600" > } >
)}
); };