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
setShowingAddAccount(false)} />
{
scopeFlow.cancel();
setShowingAddAccount(false);
}}
/>
>
);
};