Login stuff

This commit is contained in:
nate
2024-06-28 05:09:32 -04:00
parent 68600a4c4b
commit 9cd73c12db
10 changed files with 192 additions and 133 deletions

View File

@@ -1,29 +1,45 @@
<script lang="ts"> <script lang="ts">
import UserInterface from '$lib/interfaces/user';
import { ndk } from '$lib/stores/nostr'; import { ndk } from '$lib/stores/nostr';
import { currentUser } from '$lib/store'; import { currentUser } from '$lib/store';
import type { NDKUserProfile, NDKUser } from '@nostr-dev-kit/ndk'; import NDK, { NDKUser } from '@nostr-dev-kit/ndk';
import { get } from 'svelte/store'; import { get } from 'svelte/store';
import { onMount } from 'svelte';
let image: string | undefined; let image: string | undefined;
const _ndk = get(ndk); let _ndk = get(ndk);
let sessionProfile: NDKUser | null = null;
onMount(() => {
const sessionProfileObj = sessionStorage.getItem('user');
sessionProfile = sessionProfileObj ? JSON.parse(sessionProfileObj) : null;
if (sessionProfile) {
image = sessionProfile.profile?.image;
}
});
const _currentUser = get(currentUser);
let random = (Math.random() + 1).toString(36).substring(6); let random = (Math.random() + 1).toString(36).substring(6);
let defaultImage = `https://robohash.org/${random}`; let defaultImage = `https://robohash.org/${random}`;
if (!_ndk.activeUser?.profile?.image) {
image = defaultImage; image = defaultImage;
} else {
image = _ndk.activeUser.profile.image; $: {
console.debug(sessionProfile);
image = sessionProfile?.profile?.image;
} }
$: {image = _ndk.activeUser?.profile?.image;} $: ndkUpdated(_ndk);
// $: {
// //image = $currentUser?.profile?.image; function ndkUpdated(_ndk: NDK) {
// image = _ndk.activeUser?.profile?.image; console.debug('NDK updated');
// console.debug(image); if (_ndk.activeUser && _ndk.activeUser.profile && _ndk.activeUser.profile.image) {
// } image = _ndk.activeUser.profile.image;
} else {
image = defaultImage;
}
_ndk = _ndk;
}
</script> </script>
<figure class="image"> <figure class="image">

View File

@@ -4,8 +4,10 @@
import { currentUser } from '$lib/store'; import { currentUser } from '$lib/store';
import { browser } from '$app/environment'; import { browser } from '$app/environment';
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import { get } from 'svelte/store';
let noNip07: boolean; let noNip07: boolean;
let _ndk = get(ndk);
$: if (browser) { $: if (browser) {
noNip07 = !window.nostr; noNip07 = !window.nostr;
@@ -14,13 +16,14 @@
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
async function nip07Login() { async function nip07Login() {
const user = await login($ndk, undefined, 'nip07'); const user = await login('nip07', undefined);
if (!user) alert('Nip07 Login Failed'); if (!user) alert('Nip07 Login Failed');
else { else {
$currentUser = user; $currentUser = user;
$currentUser.fetchProfile(); await $currentUser.fetchProfile();
localStorage.setItem('nostr-key-method', 'nip07'); localStorage.setItem('nostr-key-method', 'nip07');
localStorage.setItem('nostr-target-npub', $currentUser.npub); localStorage.setItem('nostr-target-npub', $currentUser.npub);
_ndk.activeUser = $currentUser;
dispatch('closeModal'); dispatch('closeModal');
console.debug($currentUser); console.debug($currentUser);
} }

View File

@@ -1,5 +1,4 @@
<script lang="ts"> <script lang="ts">
import {} from '@nostr-dev-kit/ndk-svelte-components';
import Avatar from '$lib/components/Avatar.svelte'; import Avatar from '$lib/components/Avatar.svelte';
import { ndk } from '$lib/stores/nostr'; import { ndk } from '$lib/stores/nostr';
import { currentUser } from '$lib/store'; import { currentUser } from '$lib/store';
@@ -9,11 +8,6 @@
let active = false; let active = false;
let avatarimage: string | undefined;
$: {
avatarimage = $currentUser?.profile?.image;
}
function signIn() { function signIn() {
console.debug('signing in'); console.debug('signing in');
dispatch('signin'); dispatch('signin');
@@ -24,8 +18,7 @@
<div class="navbar-brand"> <div class="navbar-brand">
<h1 class="title is-1">CoFabricate</h1> <h1 class="title is-1">CoFabricate</h1>
<!-- svelte-ignore a11y-missing-attribute --> <!-- svelte-ignore a11y-missing-attribute -->
<a <button
role="button"
class="navbar-burger" class="navbar-burger"
class:is-active={active} class:is-active={active}
aria-label="menu" aria-label="menu"
@@ -37,19 +30,32 @@
<span aria-hidden="true"></span> <span aria-hidden="true"></span>
<span aria-hidden="true"></span> <span aria-hidden="true"></span>
<span aria-hidden="true"></span> <span aria-hidden="true"></span>
</a> </button>
</div> </div>
<div id="mainMenu" class="navbar-menu" class:is-active={active}> <div id="mainMenu" class="navbar-menu" class:is-active={active}>
<div class="navbar-end"> <div class="navbar-end">
<div class="navbar-item"> <div class="navbar-item">
<div class="buttons">
<a class="button" href="/">Home</a> <a class="button" href="/">Home</a>
</div>
<div class="navbar-item">
<a class="button" href="/about">About</a> <a class="button" href="/about">About</a>
</div>
<div class="navbar-item">
<button on:click={signIn}> <button on:click={signIn}>
<Avatar /> <Avatar />
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</div> <!-- <div id="mobileMenu" class="navbar-menu is-hidden-desktop" class:is-active={active}>
<aside class="menu">
</aside>
</div> -->
</nav> </nav>
<style>
.nav-menu {
display: flex;
flex-direction: column;
}
</style>

View File

@@ -0,0 +1,10 @@
<script lang="ts">
import { currentUser } from '$lib/store';
import { ndk } from '$lib/stores/nostr';
import { NDKList } from '@nostr-dev-kit/ndk';
import { get, writable } from 'svelte/store';
const $ndk = get(ndk);
export const userBlossom = writable<NDKList | null>(null);
</script>

View File

@@ -1,5 +1,5 @@
import { writable } from "svelte/store"; import { writable } from 'svelte/store';
import { NDKUser } from "@nostr-dev-kit/ndk"; import { NDKUser } from '@nostr-dev-kit/ndk';
export const currentUser = writable<NDKUser | null>(null); export const currentUser = writable<NDKUser | null>(null);
export const currentUserFollowPubkeys = writable<string[] | undefined>(undefined); export const currentUserFollowPubkeys = writable<string[] | undefined>(undefined);
@@ -13,7 +13,7 @@ export type ScopeSelection = {
export const currentScope = writable<ScopeSelection>({ export const currentScope = writable<ScopeSelection>({
label: 'global', label: 'global',
id: 'global', id: 'global',
pubkeys: undefined, pubkeys: undefined
}); });
let zapEvent: any; let zapEvent: any;

View File

@@ -1,12 +1,14 @@
import { writable } from 'svelte/store'; 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'; import NDK from '@nostr-dev-kit/ndk';
let relays; let relays;
try { try {
relays = localStorage.getItem('relays'); relays = localStorage.getItem('relays');
} catch (e) {} } catch (e) {
console.error(e);
}
let relayList: string[] = []; let relayList: string[] = [];
@@ -31,11 +33,10 @@ const _ndk: NDK = new NDK({
_ndk.connect(); _ndk.connect();
console.log(_ndk.activeUser?.profile); console.debug('Nostr store current user: ', _ndk.activeUser?.profile);
const ndkStore = writable(_ndk); const ndkStore = writable(_ndk);
export const ndk = ndkStore; export const ndk = ndkStore;
const _bunkerNDK = new NDK({ const _bunkerNDK = new NDK({

View File

@@ -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 type LoginState = 'logging-in' | 'logged-in' | 'contacting-remote-signer' | 'logged-out';
export const loginState = writable<LoginState | null>(null); export const loginState = writable<LoginState | null>(null);
// if ($ndk.cacheAdapter?.fetchProfile)

View File

@@ -1,9 +1,9 @@
import { findEphemeralSigner } from "$lib/signers/ephemeral"; import { findEphemeralSigner } from '$lib/signers/ephemeral';
import { NDKPrivateKeySigner, type NDKSigner, type NDKUser } from "@nostr-dev-kit/ndk"; import NDK, { NDKPrivateKeySigner, type NDKSigner, type NDKUser } from '@nostr-dev-kit/ndk';
import { writable, get as getStore, derived } from "svelte/store"; import { writable, get as getStore, derived } from 'svelte/store';
import ndkStore from "./nostr"; import { ndk } from './nostr';
import { currentUser as currentUserStore } from "../store"; import { currentUser as currentUserStore } from '../store';
import type NDKList from "$lib/ndk-kinds/lists"; import type NDKList from '$lib/ndk-kinds/lists';
export type SignerStoreItem = { export type SignerStoreItem = {
signer: NDKPrivateKeySigner; signer: NDKPrivateKeySigner;
@@ -30,10 +30,10 @@ export const npubSigners = derived(signers, ($signers) => {
async function getDelegatedSignerName(list: NDKList) { async function getDelegatedSignerName(list: NDKList) {
let name = ''; let name = '';
const currentUser: NDKUser = getStore(currentUserStore); const currentUser = getStore(currentUserStore);
if (!currentUser?.profile) { if (currentUser && !currentUser.profile) {
currentUser.ndk = getStore(ndkStore); currentUser.ndk = getStore(ndk);
await currentUser?.fetchProfile(); await currentUser?.fetchProfile();
} }
@@ -51,9 +51,9 @@ export async function getSigner(list: NDKList): Promise<SignerStoreItem> {
if (item) return item; if (item) return item;
const ndk = getStore(ndkStore); const _ndk: NDK = getStore(ndk);
let signer = await findEphemeralSigner(ndk, ndk.signer!, { let signer = await findEphemeralSigner(_ndk, _ndk.signer!, {
associatedEventNip19: list.encode(), associatedEventNip19: list.encode()
}); });
if (signer) { if (signer) {
@@ -62,7 +62,7 @@ export async function getSigner(list: NDKList): Promise<SignerStoreItem> {
signer: signer!, signer: signer!,
user: await signer.user(), user: await signer.user(),
saved: true, saved: true,
id, id
}; };
} else { } else {
signer = NDKPrivateKeySigner.generate(); signer = NDKPrivateKeySigner.generate();
@@ -71,10 +71,10 @@ export async function getSigner(list: NDKList): Promise<SignerStoreItem> {
user: await signer.user(), user: await signer.user(),
saved: false, saved: false,
name: await getDelegatedSignerName(list), name: await getDelegatedSignerName(list),
id, id
}; };
} }
item.user.ndk = ndk; item.user.ndk = _ndk;
store.set(id, item); store.set(id, item);

View File

@@ -13,10 +13,10 @@ import { loginState } from '$lib/stores/sesson';
import { get } from 'svelte/store'; import { get } from 'svelte/store';
export type LoginMethod = 'none' | 'pk' | 'nip07' | 'nip46'; export type LoginMethod = 'none' | 'pk' | 'nip07' | 'nip46';
const $ndk = get(ndk); let $ndk = get(ndk);
const $bunkerNDK = get(bunkerNDK); const $bunkerNDK = get(bunkerNDK);
export async function login(method: LoginMethod, userPubkey?: string ): Promise<NDKUser | null> { export async function login(method: LoginMethod, userPubkey?: string): Promise<NDKUser | null> {
console.debug(`logging in with ${method}`); console.debug(`logging in with ${method}`);
let u: NDKUser | null | undefined; let u: NDKUser | null | undefined;
@@ -25,9 +25,7 @@ export async function login(method: LoginMethod, userPubkey?: string ): Promise<
loginState.set(null); loginState.set(null);
return null; return null;
case 'pk': case 'pk':
const key = localStorage.getItem('nostr-key'); return await pkLogin();
if (!key) return null;
else return await pkLogin(key);
case 'nip07': case 'nip07':
u = await nip07Login($ndk); u = await nip07Login($ndk);
console.debug('Logged in as: ', u); 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<NDKUser | null> { async function pkLogin(): Promise<NDKUser | null> {
const key = localStorage.getItem('nostr-key');
if (!key) return null;
else return await pkSignin(key);
}
async function pkSignin(key: string): Promise<NDKUser | null> {
const signer = new NDKPrivateKeySigner(key); const signer = new NDKPrivateKeySigner(key);
const u = await signer.user(); const user = await signer.user();
if (u) loggedIn(signer, u!, 'pk'); if (user) loggedIn(signer, user!, 'pk');
return u; await user.fetchProfile();
currentUser.set(user);
sessionStorage.setItem('user', JSON.stringify(user));
return user;
} }
async function nip07Login(ndk: NDK): Promise<NDKUser | null> { async function nip07Login(ndk: NDK): Promise<NDKUser | null> {
@@ -74,12 +81,19 @@ async function nip07Login(ndk: NDK): Promise<NDKUser | null> {
ndk.signer = new NDKNip07Signer(); ndk.signer = new NDKNip07Signer();
user = await ndk.signer?.blockUntilReady(); user = await ndk.signer?.blockUntilReady();
ndk.activeUser = user; ndk.activeUser = user;
ndk.activeUser.fetchProfile();
user.ndk = ndk; user.ndk = ndk;
console.debug('Nip07 Login user:', user); console.debug('Nip07 Login user:', user);
console.debug('NDK: ', ndk); console.debug('NDK: ', ndk);
if (user) localStorage.setItem('nostr-key-method', 'nip07'); if (user) localStorage.setItem('nostr-key-method', 'nip07');
localStorage.setItem('pubkey', user.pubkey); 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(); if (user) await user.fetchProfile();
return user; return user;

View File

@@ -1,9 +1,9 @@
import { loginState } from "$lib/stores/sesson"; import { loginState } from '$lib/stores/sesson';
import { loggedIn, login, type LoginMethod } from "$lib/utils/login"; import { loggedIn, login, type LoginMethod } from '$lib/utils/login';
import { ndk } from "$lib/stores/nostr"; import { ndk } from '$lib/stores/nostr';
import { get } from "svelte/store"; import { get } from 'svelte/store';
import { currentUser } from "$lib/store"; import { currentUser } from '$lib/store';
import { NDKNip07Signer, NDKUser } from "@nostr-dev-kit/ndk"; import { NDKNip07Signer, NDKUser } from '@nostr-dev-kit/ndk';
const _ndk = get(ndk); const _ndk = get(ndk);
@@ -11,10 +11,10 @@ export async function browserSetup() {
const pubkey = localStorage.getItem('pubkey'); const pubkey = localStorage.getItem('pubkey');
console.debug(pubkey); console.debug(pubkey);
if (pubkey){ if (pubkey) {
const u = _ndk.getUser({pubkey}); const u = _ndk.getUser({ pubkey });
u.fetchProfile(); u.fetchProfile();
loginState.set('logging-in') loginState.set('logging-in');
currentUser.set(u); currentUser.set(u);
} }
@@ -23,6 +23,7 @@ export async function browserSetup() {
if (!pubkey && method !== 'none') return newSessionTryNip07(); if (!pubkey && method !== 'none') return newSessionTryNip07();
if (method && pubkey) { if (method && pubkey) {
console.debug(`logging in with ${method} as ${pubkey}`);
return await login(method, pubkey); return await login(method, pubkey);
} }
} }