Login stuff
This commit is contained in:
@@ -1,29 +1,45 @@
|
||||
<script lang="ts">
|
||||
import UserInterface from '$lib/interfaces/user';
|
||||
import { ndk } from '$lib/stores/nostr';
|
||||
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 { onMount } from 'svelte';
|
||||
|
||||
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 defaultImage = `https://robohash.org/${random}`;
|
||||
|
||||
if (!_ndk.activeUser?.profile?.image) {
|
||||
image = defaultImage;
|
||||
} else {
|
||||
image = _ndk.activeUser.profile.image;
|
||||
image = defaultImage;
|
||||
|
||||
$: {
|
||||
console.debug(sessionProfile);
|
||||
image = sessionProfile?.profile?.image;
|
||||
}
|
||||
|
||||
$: {image = _ndk.activeUser?.profile?.image;}
|
||||
// $: {
|
||||
// //image = $currentUser?.profile?.image;
|
||||
// image = _ndk.activeUser?.profile?.image;
|
||||
// console.debug(image);
|
||||
// }
|
||||
$: ndkUpdated(_ndk);
|
||||
|
||||
function ndkUpdated(_ndk: NDK) {
|
||||
console.debug('NDK updated');
|
||||
if (_ndk.activeUser && _ndk.activeUser.profile && _ndk.activeUser.profile.image) {
|
||||
image = _ndk.activeUser.profile.image;
|
||||
} else {
|
||||
image = defaultImage;
|
||||
}
|
||||
_ndk = _ndk;
|
||||
}
|
||||
</script>
|
||||
|
||||
<figure class="image">
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<script lang="ts">
|
||||
import {} from '@nostr-dev-kit/ndk-svelte-components';
|
||||
import Avatar from '$lib/components/Avatar.svelte';
|
||||
import { ndk } from '$lib/stores/nostr';
|
||||
import { currentUser } from '$lib/store';
|
||||
@@ -9,11 +8,6 @@
|
||||
|
||||
let active = false;
|
||||
|
||||
let avatarimage: string | undefined;
|
||||
$: {
|
||||
avatarimage = $currentUser?.profile?.image;
|
||||
}
|
||||
|
||||
function signIn() {
|
||||
console.debug('signing in');
|
||||
dispatch('signin');
|
||||
@@ -24,8 +18,7 @@
|
||||
<div class="navbar-brand">
|
||||
<h1 class="title is-1">CoFabricate</h1>
|
||||
<!-- svelte-ignore a11y-missing-attribute -->
|
||||
<a
|
||||
role="button"
|
||||
<button
|
||||
class="navbar-burger"
|
||||
class:is-active={active}
|
||||
aria-label="menu"
|
||||
@@ -37,19 +30,32 @@
|
||||
<span aria-hidden="true"></span>
|
||||
<span aria-hidden="true"></span>
|
||||
<span aria-hidden="true"></span>
|
||||
</a>
|
||||
</button>
|
||||
</div>
|
||||
<div id="mainMenu" class="navbar-menu" class:is-active={active}>
|
||||
<div class="navbar-end">
|
||||
<div class="navbar-item">
|
||||
<div class="buttons">
|
||||
<a class="button" href="/">Home</a>
|
||||
<a class="button" href="/about">About</a>
|
||||
<button on:click={signIn}>
|
||||
<Avatar />
|
||||
</button>
|
||||
</div>
|
||||
<a class="button" href="/">Home</a>
|
||||
</div>
|
||||
<div class="navbar-item">
|
||||
<a class="button" href="/about">About</a>
|
||||
</div>
|
||||
<div class="navbar-item">
|
||||
<button on:click={signIn}>
|
||||
<Avatar />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div id="mobileMenu" class="navbar-menu is-hidden-desktop" class:is-active={active}>
|
||||
<aside class="menu">
|
||||
</aside>
|
||||
</div> -->
|
||||
</nav>
|
||||
|
||||
<style>
|
||||
.nav-menu {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
</style>
|
||||
|
||||
10
src/lib/components/User/UserProfile.svelte
Normal file
10
src/lib/components/User/UserProfile.svelte
Normal 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>
|
||||
@@ -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<NDKUser | null>(null);
|
||||
export const currentUserFollowPubkeys = writable<string[] | undefined>(undefined);
|
||||
export const backgroundBanner = writable<string | null>(null);
|
||||
|
||||
export type ScopeSelection = {
|
||||
label: string;
|
||||
id: string;
|
||||
pubkeys: string[] | undefined;
|
||||
label: string;
|
||||
id: string;
|
||||
pubkeys: string[] | undefined;
|
||||
};
|
||||
export const currentScope = writable<ScopeSelection>({
|
||||
label: 'global',
|
||||
id: 'global',
|
||||
pubkeys: undefined,
|
||||
label: 'global',
|
||||
id: 'global',
|
||||
pubkeys: undefined
|
||||
});
|
||||
|
||||
let zapEvent: any;
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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<LoginState | null>(null);
|
||||
|
||||
// if ($ndk.cacheAdapter?.fetchProfile)
|
||||
|
||||
@@ -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<string, SignerStoreItem>;
|
||||
|
||||
export const signers = writable<SignerItems>(new Map());
|
||||
export const npubSigners = derived(signers, ($signers) => {
|
||||
const npubs = new Map<string, NDKSigner>();
|
||||
const npubs = new Map<string, NDKSigner>();
|
||||
|
||||
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<SignerStoreItem> {
|
||||
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;
|
||||
return item;
|
||||
}
|
||||
@@ -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<NDKUser | null> {
|
||||
export async function login(method: LoginMethod, userPubkey?: string): Promise<NDKUser | null> {
|
||||
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<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 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<NDKUser | null> {
|
||||
@@ -74,12 +81,19 @@ async function nip07Login(ndk: NDK): Promise<NDKUser | null> {
|
||||
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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user