You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.4 KiB
124 lines
4.4 KiB
import { getPersistedLogin, initNdk, ndkInstance } from "../lib/ndk.ts"; |
|
import { |
|
loginWithExtension, |
|
loginWithAmber, |
|
loginWithNpub, |
|
} from "../lib/stores/userStore.ts"; |
|
import { loginMethodStorageKey } from "../lib/stores/userStore.ts"; |
|
import Pharos, { pharosInstance } from "../lib/parser.ts"; |
|
import type { LayoutLoad } from "./$types"; |
|
import { get } from "svelte/store"; |
|
|
|
export const ssr = false; |
|
|
|
export const load: LayoutLoad = () => { |
|
// Initialize NDK with new relay management system |
|
const ndk = initNdk(); |
|
ndkInstance.set(ndk); |
|
|
|
try { |
|
const pubkey = getPersistedLogin(); |
|
const loginMethod = localStorage.getItem(loginMethodStorageKey); |
|
const logoutFlag = localStorage.getItem("alexandria/logout/flag"); |
|
console.log("Layout load - persisted pubkey:", pubkey); |
|
console.log("Layout load - persisted login method:", loginMethod); |
|
console.log("Layout load - logout flag:", logoutFlag); |
|
console.log("All localStorage keys:", Object.keys(localStorage)); |
|
|
|
if (pubkey && loginMethod && !logoutFlag) { |
|
if (loginMethod === "extension") { |
|
console.log("Restoring extension login..."); |
|
loginWithExtension(); |
|
} else if (loginMethod === "amber") { |
|
// Attempt to restore Amber (NIP-46) session from localStorage |
|
const relay = "wss://relay.nsec.app"; |
|
const localNsec = localStorage.getItem("amber/nsec"); |
|
if (localNsec) { |
|
import("@nostr-dev-kit/ndk").then( |
|
async ({ NDKNip46Signer }) => { |
|
const ndk = get(ndkInstance); |
|
try { |
|
// deno-lint-ignore no-explicit-any |
|
const amberSigner = (NDKNip46Signer as any).nostrconnect( |
|
ndk, |
|
relay, |
|
localNsec, |
|
{ |
|
name: "Alexandria", |
|
perms: "sign_event:1;sign_event:4", |
|
}, |
|
); |
|
// Try to reconnect (blockUntilReady will resolve if Amber is running and session is valid) |
|
await amberSigner.blockUntilReady(); |
|
const user = await amberSigner.user(); |
|
await loginWithAmber(amberSigner, user); |
|
console.log("Amber session restored."); |
|
} catch { |
|
// If reconnection fails, automatically fallback to npub-only mode |
|
console.warn( |
|
"Amber session could not be restored. Falling back to npub-only mode.", |
|
); |
|
try { |
|
// Set the flag first, before login |
|
localStorage.setItem("alexandria/amber/fallback", "1"); |
|
console.log("Set fallback flag in localStorage"); |
|
|
|
// Small delay to ensure flag is set |
|
await new Promise((resolve) => setTimeout(resolve, 100)); |
|
|
|
await loginWithNpub(pubkey); |
|
console.log("Successfully fell back to npub-only mode."); |
|
} catch (fallbackErr) { |
|
console.error( |
|
"Failed to fallback to npub-only mode:", |
|
fallbackErr, |
|
); |
|
} |
|
} |
|
}, |
|
); |
|
} else { |
|
// No session data, automatically fallback to npub-only mode |
|
console.log( |
|
"No Amber session data found. Falling back to npub-only mode.", |
|
); |
|
|
|
// Set the flag first, before login |
|
localStorage.setItem("alexandria/amber/fallback", "1"); |
|
console.log("Set fallback flag in localStorage"); |
|
|
|
// Small delay to ensure flag is set |
|
setTimeout(async () => { |
|
try { |
|
await loginWithNpub(pubkey); |
|
console.log("Successfully fell back to npub-only mode."); |
|
} catch (fallbackErr) { |
|
console.error( |
|
"Failed to fallback to npub-only mode:", |
|
fallbackErr, |
|
); |
|
} |
|
}, 100); |
|
} |
|
} else if (loginMethod === "npub") { |
|
console.log("Restoring npub login..."); |
|
loginWithNpub(pubkey); |
|
} |
|
} else if (logoutFlag) { |
|
console.log("Skipping auto-login due to logout flag"); |
|
localStorage.removeItem("alexandria/logout/flag"); |
|
} |
|
} catch (e) { |
|
console.warn( |
|
`Failed to restore login: ${e}\n\nContinuing with anonymous session.`, |
|
); |
|
} |
|
|
|
const parser = new Pharos(ndk); |
|
pharosInstance.set(parser); |
|
|
|
return { |
|
ndk, |
|
parser, |
|
}; |
|
};
|
|
|