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 @@
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'),