Browse Source

feat(navbar): add nip07 login

- add login function to call nip07 plugin
- add logged_in_user store
master
DanConwayDev 2 years ago
parent
commit
7256f970ab
No known key found for this signature in database
GPG Key ID: 68E15486D73F75E1
  1. 25
      src/lib/components/Navbar.svelte
  2. 61
      src/lib/stores/users.ts

25
src/lib/components/Navbar.svelte

@ -1,7 +1,15 @@ @@ -1,7 +1,15 @@
<script lang="ts">
import {
checkForNip07Plugin,
logged_in_user,
login,
nip07_plugin,
} from "$lib/stores/users";
import { onMount } from "svelte";
import Container from "./Container.svelte";
import UserHeader from "./users/UserHeader.svelte";
export let nip07plugin: boolean = false;
onMount(checkForNip07Plugin);
</script>
<div class="bg-base-400">
@ -16,10 +24,19 @@ @@ -16,10 +24,19 @@
</h4>
</div>
<div class="navbar-end gap-4">
{#if !nip07plugin}
<div class="btn normal-case btn-sm btn-ghost">Sign up</div>
{#if $logged_in_user}
<UserHeader user={$logged_in_user} />
{:else if $nip07_plugin === undefined}
<div class="h-8 skeleton w-20"></div>
{:else if $nip07_plugin}
<button
on:click={() => {
login();
}}
class="btn normal-case btn-sm btn-ghost">Login</button
>
{:else}
<button class="btn normal-case btn-sm btn-ghost">Login</button>
<div class="btn normal-case btn-sm btn-ghost">Sign up</div>
{/if}
</div>
</div>

61
src/lib/stores/users.ts

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
import type { User } from "$lib/components/users/type";
import { NDKUser } from "@nostr-dev-kit/ndk";
import { writable, type Writable } from "svelte/store"
import { defaults as user_defaults, type User } from "$lib/components/users/type";
import { NDKNip07Signer, NDKRelayList } from "@nostr-dev-kit/ndk";
import { get, writable, type Unsubscriber, type Writable } from "svelte/store"
import { ndk } from "./ndk";
export let users: { [hexpubkey: string]: Writable<User>; } = {};
@ -34,3 +34,58 @@ export let ensureUser = (hexpubkey: string): Writable<User> => { @@ -34,3 +34,58 @@ export let ensureUser = (hexpubkey: string): Writable<User> => {
}
return users[hexpubkey];
}
// nip07_plugin is set in Navbar component
export let nip07_plugin: Writable<undefined | boolean> = writable(undefined);
export let checkForNip07Plugin = () => {
if (window.nostr) {
nip07_plugin.set(true);
} else {
let timerId: NodeJS.Timeout;
const intervalId = setInterval(() => {
if (window.nostr) {
clearTimeout(timerId);
clearInterval(intervalId);
nip07_plugin.set(true);
}
}, 100);
timerId = setTimeout(() => {
clearInterval(intervalId);
nip07_plugin.set(false);
}, 5000);
}
};
let signer = new NDKNip07Signer(2000);
export let logged_in_user: Writable<undefined | User> = writable(undefined);
export let login = async (): Promise<void> => {
return new Promise(async (res, rej) => {
let user = get(logged_in_user);
if (user) return res();
if (get(nip07_plugin)) {
try {
let ndk_user = await signer.blockUntilReady();
logged_in_user.set({
...user_defaults,
hexpubkey: ndk_user.pubkey,
});
ndk.signer = signer;
ensureUser(ndk_user.pubkey).subscribe(user => {
logged_in_user.set({ ...user });
});
return res();
}
catch (e) {
alert(e);
rej();
}
}
else {
rej();
}
});
};

Loading…
Cancel
Save