diff --git a/src/lib/components/Avatar.svelte b/src/lib/components/Avatar.svelte index b063bb8..b5f9750 100644 --- a/src/lib/components/Avatar.svelte +++ b/src/lib/components/Avatar.svelte @@ -1,29 +1,45 @@
diff --git a/src/lib/components/LoginModal/Nip07Button.svelte b/src/lib/components/LoginModal/Nip07Button.svelte index c3fa47f..c0545e9 100644 --- a/src/lib/components/LoginModal/Nip07Button.svelte +++ b/src/lib/components/LoginModal/Nip07Button.svelte @@ -4,8 +4,10 @@ import { currentUser } from '$lib/store'; import { browser } from '$app/environment'; import { createEventDispatcher } from 'svelte'; + import { get } from 'svelte/store'; let noNip07: boolean; + let _ndk = get(ndk); $: if (browser) { noNip07 = !window.nostr; @@ -14,13 +16,14 @@ const dispatch = createEventDispatcher(); async function nip07Login() { - const user = await login($ndk, undefined, 'nip07'); + const user = await login('nip07', undefined); if (!user) alert('Nip07 Login Failed'); else { $currentUser = user; - $currentUser.fetchProfile(); + await $currentUser.fetchProfile(); localStorage.setItem('nostr-key-method', 'nip07'); localStorage.setItem('nostr-target-npub', $currentUser.npub); + _ndk.activeUser = $currentUser; dispatch('closeModal'); console.debug($currentUser); } diff --git a/src/lib/components/NavBar.svelte b/src/lib/components/NavBar.svelte index 7d30aa7..9f35fe8 100644 --- a/src/lib/components/NavBar.svelte +++ b/src/lib/components/NavBar.svelte @@ -1,5 +1,4 @@ diff --git a/src/lib/store.ts b/src/lib/store.ts index 1800c2e..dc67997 100644 --- a/src/lib/store.ts +++ b/src/lib/store.ts @@ -1,19 +1,19 @@ -import { writable } from "svelte/store"; -import { NDKUser } from "@nostr-dev-kit/ndk"; +import { writable } from 'svelte/store'; +import { NDKUser } from '@nostr-dev-kit/ndk'; export const currentUser = writable(null); export const currentUserFollowPubkeys = writable(undefined); export const backgroundBanner = writable(null); export type ScopeSelection = { - label: string; - id: string; - pubkeys: string[] | undefined; + label: string; + id: string; + pubkeys: string[] | undefined; }; export const currentScope = writable({ - label: 'global', - id: 'global', - pubkeys: undefined, + label: 'global', + id: 'global', + pubkeys: undefined }); let zapEvent: any; @@ -21,4 +21,4 @@ let zapEvent: any; export const zap = writable(zapEvent); export const pageTitle = writable(null); -export const pageSubtitle = writable(null); \ No newline at end of file +export const pageSubtitle = writable(null); diff --git a/src/lib/stores/nostr.ts b/src/lib/stores/nostr.ts index cca7dfc..bdad3de 100644 --- a/src/lib/stores/nostr.ts +++ b/src/lib/stores/nostr.ts @@ -1,12 +1,14 @@ import { writable } from 'svelte/store'; -import NDKSvelte from '@nostr-dev-kit/ndk-svelte'; +//import NDKSvelte from '@nostr-dev-kit/ndk-svelte'; import NDK from '@nostr-dev-kit/ndk'; let relays; try { relays = localStorage.getItem('relays'); -} catch (e) {} +} catch (e) { + console.error(e); +} let relayList: string[] = []; @@ -31,11 +33,10 @@ const _ndk: NDK = new NDK({ _ndk.connect(); -console.log(_ndk.activeUser?.profile); +console.debug('Nostr store current user: ', _ndk.activeUser?.profile); const ndkStore = writable(_ndk); - export const ndk = ndkStore; const _bunkerNDK = new NDK({ diff --git a/src/lib/stores/sesson.ts b/src/lib/stores/sesson.ts index 322994c..46a6669 100644 --- a/src/lib/stores/sesson.ts +++ b/src/lib/stores/sesson.ts @@ -1,4 +1,12 @@ -import { writable } from "svelte/store"; +import { get, writable } from 'svelte/store'; +// import { ndk } from "$lib/stores/nostr"; +// import type { NDKUser } from "@nostr-dev-kit/ndk"; + +// let $ndk = get(ndk); + +// export let user: NDKUser | undefined = undefined; export type LoginState = 'logging-in' | 'logged-in' | 'contacting-remote-signer' | 'logged-out'; -export const loginState = writable(null); \ No newline at end of file +export const loginState = writable(null); + +// if ($ndk.cacheAdapter?.fetchProfile) diff --git a/src/lib/stores/signer.ts b/src/lib/stores/signer.ts index 9f39b49..f4763e0 100644 --- a/src/lib/stores/signer.ts +++ b/src/lib/stores/signer.ts @@ -1,82 +1,82 @@ -import { findEphemeralSigner } from "$lib/signers/ephemeral"; -import { NDKPrivateKeySigner, type NDKSigner, type NDKUser } from "@nostr-dev-kit/ndk"; -import { writable, get as getStore, derived } from "svelte/store"; -import ndkStore from "./nostr"; -import { currentUser as currentUserStore } from "../store"; -import type NDKList from "$lib/ndk-kinds/lists"; +import { findEphemeralSigner } from '$lib/signers/ephemeral'; +import NDK, { NDKPrivateKeySigner, type NDKSigner, type NDKUser } from '@nostr-dev-kit/ndk'; +import { writable, get as getStore, derived } from 'svelte/store'; +import { ndk } from './nostr'; +import { currentUser as currentUserStore } from '../store'; +import type NDKList from '$lib/ndk-kinds/lists'; export type SignerStoreItem = { - signer: NDKPrivateKeySigner; - user: NDKUser; - saved: boolean; - name?: string; - id: string; + signer: NDKPrivateKeySigner; + user: NDKUser; + saved: boolean; + name?: string; + id: string; }; type SignerItems = Map; export const signers = writable(new Map()); export const npubSigners = derived(signers, ($signers) => { - const npubs = new Map(); + const npubs = new Map(); - for (const entry of $signers) { - const { user, signer } = entry[1]; + for (const entry of $signers) { + const { user, signer } = entry[1]; - npubs.set(user.npub, signer); - } + npubs.set(user.npub, signer); + } - return npubs; + return npubs; }); async function getDelegatedSignerName(list: NDKList) { - let name = ''; - const currentUser: NDKUser = getStore(currentUserStore); + let name = ''; + const currentUser = getStore(currentUserStore); - if (!currentUser?.profile) { - currentUser.ndk = getStore(ndkStore); - await currentUser?.fetchProfile(); - } + if (currentUser && !currentUser.profile) { + currentUser.ndk = getStore(ndk); + await currentUser?.fetchProfile(); + } - if (currentUser?.profile?.name) { - name = currentUser.profile.displayName + `'s `; - } + if (currentUser?.profile?.name) { + name = currentUser.profile.displayName + `'s `; + } - return name + list.name; + return name + list.name; } export async function getSigner(list: NDKList): Promise { - const store = getStore(signers); - const id = list.encode(); - let item = store.get(id); + const store = getStore(signers); + const id = list.encode(); + let item = store.get(id); - if (item) return item; + if (item) return item; - const ndk = getStore(ndkStore); - let signer = await findEphemeralSigner(ndk, ndk.signer!, { - associatedEventNip19: list.encode(), - }); + const _ndk: NDK = getStore(ndk); + let signer = await findEphemeralSigner(_ndk, _ndk.signer!, { + associatedEventNip19: list.encode() + }); - if (signer) { - console.log(`found a signer for list ${list.name}`); - item = { - signer: signer!, - user: await signer.user(), - saved: true, - id, - }; - } else { - signer = NDKPrivateKeySigner.generate(); - item = { - signer, - user: await signer.user(), - saved: false, - name: await getDelegatedSignerName(list), - id, - }; - } - item.user.ndk = ndk; + if (signer) { + console.log(`found a signer for list ${list.name}`); + item = { + signer: signer!, + user: await signer.user(), + saved: true, + id + }; + } else { + signer = NDKPrivateKeySigner.generate(); + item = { + signer, + user: await signer.user(), + saved: false, + name: await getDelegatedSignerName(list), + id + }; + } + item.user.ndk = _ndk; - store.set(id, item); + store.set(id, item); - return item; -} \ No newline at end of file + return item; +} diff --git a/src/lib/utils/login.ts b/src/lib/utils/login.ts index c0dd86e..0c6d223 100644 --- a/src/lib/utils/login.ts +++ b/src/lib/utils/login.ts @@ -13,10 +13,10 @@ import { loginState } from '$lib/stores/sesson'; import { get } from 'svelte/store'; export type LoginMethod = 'none' | 'pk' | 'nip07' | 'nip46'; -const $ndk = get(ndk); +let $ndk = get(ndk); const $bunkerNDK = get(bunkerNDK); -export async function login(method: LoginMethod, userPubkey?: string ): Promise { +export async function login(method: LoginMethod, userPubkey?: string): Promise { console.debug(`logging in with ${method}`); let u: NDKUser | null | undefined; @@ -25,9 +25,7 @@ export async function login(method: LoginMethod, userPubkey?: string ): Promise< loginState.set(null); return null; case 'pk': - const key = localStorage.getItem('nostr-key'); - if (!key) return null; - else return await pkLogin(key); + return await pkLogin(); case 'nip07': u = await nip07Login($ndk); console.debug('Logged in as: ', u); @@ -52,11 +50,20 @@ export async function login(method: LoginMethod, userPubkey?: string ): Promise< } } -async function pkLogin(key: string): Promise { +async function pkLogin(): Promise { + const key = localStorage.getItem('nostr-key'); + if (!key) return null; + else return await pkSignin(key); +} + +async function pkSignin(key: string): Promise { const signer = new NDKPrivateKeySigner(key); - const u = await signer.user(); - if (u) loggedIn(signer, u!, 'pk'); - return u; + const user = await signer.user(); + if (user) loggedIn(signer, user!, 'pk'); + await user.fetchProfile(); + currentUser.set(user); + sessionStorage.setItem('user', JSON.stringify(user)); + return user; } async function nip07Login(ndk: NDK): Promise { @@ -74,12 +81,19 @@ async function nip07Login(ndk: NDK): Promise { ndk.signer = new NDKNip07Signer(); user = await ndk.signer?.blockUntilReady(); ndk.activeUser = user; + ndk.activeUser.fetchProfile(); user.ndk = ndk; console.debug('Nip07 Login user:', user); console.debug('NDK: ', ndk); if (user) localStorage.setItem('nostr-key-method', 'nip07'); localStorage.setItem('pubkey', user.pubkey); - } catch (e) {} + await user.fetchProfile(); + currentUser.set(user); + sessionStorage.setItem('user', JSON.stringify(user)); + $ndk = ndk; + } catch (e) { + console.error(`NIP-07 login error: ${e}`); + } } if (user) await user.fetchProfile(); return user; diff --git a/src/routes/browser-setup.ts b/src/routes/browser-setup.ts index 8a90c9b..eaf799e 100644 --- a/src/routes/browser-setup.ts +++ b/src/routes/browser-setup.ts @@ -1,30 +1,31 @@ -import { loginState } from "$lib/stores/sesson"; -import { loggedIn, login, type LoginMethod } from "$lib/utils/login"; -import { ndk } from "$lib/stores/nostr"; -import { get } from "svelte/store"; -import { currentUser } from "$lib/store"; -import { NDKNip07Signer, NDKUser } from "@nostr-dev-kit/ndk"; +import { loginState } from '$lib/stores/sesson'; +import { loggedIn, login, type LoginMethod } from '$lib/utils/login'; +import { ndk } from '$lib/stores/nostr'; +import { get } from 'svelte/store'; +import { currentUser } from '$lib/store'; +import { NDKNip07Signer, NDKUser } from '@nostr-dev-kit/ndk'; const _ndk = get(ndk); export async function browserSetup() { - const pubkey = localStorage.getItem('pubkey'); - console.debug(pubkey); + const pubkey = localStorage.getItem('pubkey'); + console.debug(pubkey); - if (pubkey){ - const u = _ndk.getUser({pubkey}); + if (pubkey) { + const u = _ndk.getUser({ pubkey }); u.fetchProfile(); - loginState.set('logging-in') - currentUser.set(u); - } + loginState.set('logging-in'); + currentUser.set(u); + } - const method = localStorage.getItem('nostr-key-method') as LoginMethod; + const method = localStorage.getItem('nostr-key-method') as LoginMethod; - if (!pubkey && method !== 'none') return newSessionTryNip07(); + if (!pubkey && method !== 'none') return newSessionTryNip07(); - if (method && pubkey) { - return await login(method, pubkey); - } + if (method && pubkey) { + console.debug(`logging in with ${method} as ${pubkey}`); + return await login(method, pubkey); + } } export async function newSessionTryNip07() { @@ -44,4 +45,4 @@ export async function newSessionTryNip07() { console.debug('nip07Signer succeeded'); await loggedIn(signer, u, 'nip07'); } -} \ No newline at end of file +}