···
import { Client, CredentialManager } from "@atcute/client";
import { Did } from "@atcute/lexicons";
3
-
import { deleteStoredSession, getSession, OAuthUserAgent } from "@atcute/oauth-browser-client";
4
+
createAuthorizationUrl,
9
+
} from "@atcute/oauth-browser-client";
import { A } from "@solidjs/router";
import { createSignal, For, onMount, Show } from "solid-js";
6
-
import { createStore } from "solid-js/store";
12
+
import { createStore, produce } from "solid-js/store";
import { resolveDidDoc } from "../utils/api.js";
8
-
import { agent, Login, retrieveSession, setAgent } from "./login.jsx";
14
+
import { agent, Login, retrieveSession, Sessions, setAgent } from "./login.jsx";
import { Modal } from "./modal.jsx";
const AccountManager = () => {
const [openManager, setOpenManager] = createSignal(false);
13
-
const [sessions, setSessions] = createStore<Record<string, string | undefined>>();
19
+
const [sessions, setSessions] = createStore<Sessions>();
const [avatars, setAvatars] = createStore<Record<Did, string>>();
17
-
await retrieveSession();
24
+
await retrieveSession();
19
-
const storedSessions = localStorage.getItem("atcute-oauth:sessions");
20
-
if (storedSessions) {
21
-
const sessionDids = Object.keys(JSON.parse(storedSessions)) as Did[];
22
-
sessionDids.forEach((did) => setSessions(did, ""));
27
+
const localSessions = localStorage.getItem("sessions");
28
+
if (localSessions) {
29
+
const storedSessions: Sessions = JSON.parse(localSessions);
30
+
const sessionDids = Object.keys(storedSessions) as Did[];
sessionDids.forEach(async (did) => {
const doc = await resolveDidDoc(did);
doc.alsoKnownAs?.forEach((alias) => {
if (alias.startsWith("at://")) {
27
-
setSessions(did, alias.replace("at://", ""));
36
+
signedIn: storedSessions[did].signedIn,
37
+
handle: alias.replace("at://", ""),
sessionDids.forEach(async (did) => {
34
-
await getSession(did, { allowStale: true });
35
-
const avatar = await getAvatar(did);
36
-
if (avatar) setAvatars(did, avatar);
38
-
deleteStoredSession(did);
39
-
setSessions(did, undefined);
44
+
const avatar = await getAvatar(did);
45
+
if (avatar) setAvatars(did, avatar);
const resumeSession = async (did: Did) => {
46
-
localStorage.setItem("lastSignedIn", did);
52
+
localStorage.setItem("lastSignedIn", did);
53
+
await retrieveSession();
55
+
const resolved = await resolveFromIdentity(did);
56
+
const authUrl = await createAuthorizationUrl({
57
+
scope: import.meta.env.VITE_OAUTH_SCOPE,
61
+
await new Promise((resolve) => setTimeout(resolve, 250));
63
+
location.assign(authUrl);
const removeSession = async (did: Did) => {
···
deleteStoredSession(did);
59
-
setSessions(did, undefined);
81
+
localStorage.setItem("sessions", JSON.stringify(sessions));
if (currentSession === did) setAgent(undefined);
···
class="size-6 rounded-full"
96
-
<span class="truncate">{sessions[did]?.length ? sessions[did] : did}</span>
118
+
<span class="truncate">
119
+
{sessions[did]?.handle ? sessions[did].handle : did}
98
-
<Show when={did === agent()?.sub}>
122
+
<Show when={did === agent()?.sub && sessions[did].signedIn}>
<span class="iconify lucide--check shrink-0 text-green-500 dark:text-green-400"></span>
125
+
<Show when={!sessions[did].signedIn}>
126
+
<span class="iconify lucide--circle-alert shrink-0 text-red-500 dark:text-red-400"></span>