From e6b0cc78fd579aff9396487a3cfd4eec528abdc0 Mon Sep 17 00:00:00 2001 From: Jonathan Staab Date: Sat, 26 Nov 2022 21:38:25 -0800 Subject: [PATCH] Load account during initial setup --- .gitignore | 1 + README.md | 1 + src/routes/AddRelay.svelte | 11 +++++++++-- src/routes/Keys.svelte | 4 +--- src/routes/RelayList.svelte | 10 +++++----- src/state/app.js | 37 +++++++++++++++++++------------------ src/state/dispatch.js | 17 ++++++++++++----- vite.config.js | 4 ---- 8 files changed, 48 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index a547bf36..b6f33f9e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ dist-ssr *.njsproj *.sln *.sw? +ssl diff --git a/README.md b/README.md index df08cd66..7850a407 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ Bugs +- [ ] Pagination - [ ] Memoize room list, currently every time the user switches chat rooms it pulls the full list - [ ] Fix toast, it gets in the way. Make it smaller and dismissable. diff --git a/src/routes/AddRelay.svelte b/src/routes/AddRelay.svelte index ae3307c7..c70cd131 100644 --- a/src/routes/AddRelay.svelte +++ b/src/routes/AddRelay.svelte @@ -2,7 +2,9 @@ import {fly} from 'svelte/transition' import {registerRelay} from 'src/state/nostr' import toast from 'src/state/toast' - import {modal} from 'src/state/app' + import {user} from 'src/state/user' + import {modal, ensureAccounts} from 'src/state/app' + import {dispatch} from 'src/state/dispatch' import Input from 'src/partials/Input.svelte' import Button from 'src/partials/Button.svelte' @@ -16,7 +18,12 @@ } registerRelay(url) + dispatch("relay/join", url) modal.set(null) + + if ($user) { + ensureAccounts([$user.pubkey], {force: true}) + } } @@ -28,7 +35,7 @@
Relay URL - +

diff --git a/src/routes/Keys.svelte b/src/routes/Keys.svelte index 2b69d6cb..dc1d5c4e 100644 --- a/src/routes/Keys.svelte +++ b/src/routes/Keys.svelte @@ -6,14 +6,13 @@ import Input from "src/partials/Input.svelte" import Anchor from "src/partials/Anchor.svelte" import {user} from "src/state/user" - import {logout} from "src/state/app" import toast from "src/state/toast" const keypairUrl = 'https://www.cloudflare.com/learning/ssl/how-does-public-key-encryption-work/' const delegationUrl = 'https://github.com/nostr-protocol/nips/blob/b62aa418dee13aac1899ea7c6946a0f55dd7ee84/26.md' const copyKey = type => { - copyToClipboard(type === 'private' ? $user.privKey : $user.pubkey) + copyToClipboard(type === 'private' ? $user.privkey : $user.pubkey) toast.show("info", `Your ${type} key has been copied to the clipboard.`) } @@ -58,7 +57,6 @@ using delegation keys instead.

- Log Out
diff --git a/src/routes/RelayList.svelte b/src/routes/RelayList.svelte index fd6a9c2e..f880eb57 100644 --- a/src/routes/RelayList.svelte +++ b/src/routes/RelayList.svelte @@ -4,17 +4,17 @@ import Input from "src/partials/Input.svelte" import Anchor from "src/partials/Anchor.svelte" import {dispatch} from "src/state/dispatch" - import {modal} from "src/state/app" import {relays, knownRelays} from "src/state/nostr" + import {modal} from "src/state/app" let q = "" let search $: search = fuzzy($knownRelays || [], {keys: ["name", "description", "url"]}) - const toggle = (url, value) => { - dispatch(value ? "relay/join" : "relay/leave", url) - } + const join = url => dispatch("relay/join", url) + + const leave = url => dispatch("relay/leave", url)
@@ -41,7 +41,7 @@
toggle(relay.url, !$relays.includes(relay.url))}> + on:click={() => $relays.includes(relay.url) ? leave(relay.url) : join(relay.url)}> {$relays.includes(relay.url) ? "Leave" : "Join"} diff --git a/src/state/app.js b/src/state/app.js index 29c3b770..987c364f 100644 --- a/src/state/app.js +++ b/src/state/app.js @@ -32,32 +32,33 @@ export const logout = () => { // Utils -export const ensureAccounts = async pubkeys => { +export const ensureAccounts = async (pubkeys, {force = false} = {}) => { const $accounts = get(accounts) // Don't request accounts we recently updated pubkeys = pubkeys.filter( - k => !$accounts[k] || $accounts[k].refreshed < now() - timedelta(10, 'minutes') + k => force || !$accounts[k] || $accounts[k].refreshed < now() - timedelta(10, 'minutes') ) - if (!pubkeys.length) { - return + if (pubkeys.length) { + const events = await channels.getter.all({kinds: [0], authors: pubkeys}) + + await accounts.update($accounts => { + events.forEach(e => { + $accounts[e.pubkey] = { + pubkey: e.pubkey, + ...$accounts[e.pubkey], + ...JSON.parse(e.content), + refreshed: now(), + } + }) + + return $accounts + }) } - const events = await channels.getter.all({kinds: [0], authors: pubkeys}) - - accounts.update($accounts => { - events.forEach(e => { - $accounts[e.pubkey] = { - pubkey: e.pubkey, - ...$accounts[e.pubkey], - ...JSON.parse(e.content), - refreshed: now(), - } - }) - - return $accounts - }) + // Keep our user in sync + user.update($user => ({...$user, ...get(accounts)[$user.pubkey]})) } export const findNotes = (filters, cb) => { diff --git a/src/state/dispatch.js b/src/state/dispatch.js index bc84a25a..57ea9bb7 100644 --- a/src/state/dispatch.js +++ b/src/state/dispatch.js @@ -3,7 +3,8 @@ import {getPublicKey} from 'nostr-tools' import {get} from 'svelte/store' import {first, defmulti} from "hurdak/lib/hurdak" import {user} from "src/state/user" -import {nostr, channels, relays} from 'src/state/nostr' +import {nostr, relays} from 'src/state/nostr' +import {ensureAccounts} from 'src/state/app' // Commands are processed in two layers: // - App-oriented commands are created via dispatch @@ -19,11 +20,11 @@ dispatch.addMethod("account/init", async (topic, privkey) => { // Set what we know about the user to our store user.set({name: pubkey.slice(0, 8), privkey, pubkey}) - // Attempt to refresh user data from the network - const found = Boolean(await channels.getter.first({authors: [pubkey]})) + // Make sure we have data for this user + await ensureAccounts([pubkey], {force: true}) // Tell the caller whether this user was found - return {found} + return {found: Boolean(get(user).name)} }) dispatch.addMethod("account/update", async (topic, updates) => { @@ -34,8 +35,14 @@ dispatch.addMethod("account/update", async (topic, updates) => { await nostr.publish(nostr.event(0, JSON.stringify(updates))) }) -dispatch.addMethod("relay/join", (topic, url) => { +dispatch.addMethod("relay/join", async (topic, url) => { + const $user = get(user) + relays.update(r => r.concat(url)) + + if ($user) { + await ensureAccounts([$user.pubkey], {force: true}) + } }) dispatch.addMethod("relay/leave", (topic, url) => { diff --git a/vite.config.js b/vite.config.js index b50dd083..e12503be 100644 --- a/vite.config.js +++ b/vite.config.js @@ -3,11 +3,7 @@ import { defineConfig } from 'vite' import { svelte } from '@sveltejs/vite-plugin-svelte' import { nodePolyfills } from 'vite-plugin-node-polyfills' -// https://vitejs.dev/config/ export default defineConfig({ - define: { - global: {}, - }, resolve: { alias: { src: path.resolve(__dirname, 'src'),