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, produce } from "solid-js/store"; import { ActionMenu, DropdownMenu, MenuProvider, NavMenu } from "../components/dropdown.jsx"; import { Modal } from "../components/modal.jsx"; import { Login } from "./login.jsx"; import { useOAuthScopeFlow } from "./scope-flow.js"; import { ScopeSelector } from "./scope-selector.jsx"; import { parseScopeString } from "./scope-utils.js"; import { getAvatar, loadHandleForSession, loadSessionsFromStorage, resumeSession, retrieveSession, saveSessionToStorage, } from "./session-manager.js"; import { agent, sessions, setAgent, setSessions } from "./state.js"; const AccountDropdown = (props: { did: Did; onEditPermissions: (did: Did) => void }) => { 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]; }), ); saveSessionToStorage(sessions); if (currentSession === did) setAgent(undefined); }; return ( props.onEditPermissions(props.did)} /> removeSession(props.did)} /> ); }; export const AccountManager = () => { const [openManager, setOpenManager] = createSignal(false); const [avatars, setAvatars] = createStore>(); const [showingAddAccount, setShowingAddAccount] = createSignal(false); const getThumbnailUrl = (avatarUrl: string) => { return avatarUrl.replace("img/avatar/", "img/avatar_thumbnail/"); }; const scopeFlow = useOAuthScopeFlow({ beforeRedirect: (account) => resumeSession(account as Did), }); const handleAccountClick = async (did: Did) => { try { await resumeSession(did); } catch { scopeFlow.initiate(did); } }; onMount(async () => { try { await retrieveSession(); } catch {} const storedSessions = loadSessionsFromStorage(); if (storedSessions) { const sessionDids = Object.keys(storedSessions) as Did[]; sessionDids.forEach(async (did) => { await loadHandleForSession(did, storedSessions); }); sessionDids.forEach(async (did) => { const avatar = await getAvatar(did); if (avatar) setAvatars(did, avatar); }); } }); return ( <> { setOpenManager(false); setShowingAddAccount(false); scopeFlow.cancel(); }} >
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" > } > scopeFlow.initiateWithRedirect(accountDid)} />
)}
setShowingAddAccount(false)} /> { scopeFlow.cancel(); setShowingAddAccount(false); }} />
); };