diff --git a/README.md b/README.md index f15806e7..c4063f2c 100644 --- a/README.md +++ b/README.md @@ -34,18 +34,7 @@ Coracle is currently in _alpha_ - expect bugs, slow loading times, and rough edg # Current update -- [ ] Re-implement muffle - - Don't store muffled events, when muffle changes delete them -- [ ] Delete old events -- [ ] Make sure login/out, no user usage works -- [ ] Add a re-sync/clear cache button -- [ ] Note detail context not showing when navigating between note details (e.g. to parent) -- [ ] Show reply to on feed - [ ] Write blog post -- https://vitejs.dev/guide/features.html#web-workers -- https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers -- https://web.dev/module-workers/ - - [x] Sync user - [x] Based on petnames, sync network to 2 or 3 degrees of separation - When a user is added/removed, sync them and add to or remove from network diff --git a/src/App.svelte b/src/App.svelte index 935c3475..ea2f807e 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -162,12 +162,12 @@ {/if} - {/if}
  • Search
  • + {/if}
  • Notes diff --git a/src/partials/Note.svelte b/src/partials/Note.svelte index 5710d513..4491b16e 100644 --- a/src/partials/Note.svelte +++ b/src/partials/Note.svelte @@ -16,7 +16,6 @@ export let note export let depth = 0 export let anchorId = null - export let showParent = false export let invertColors = false let reply = null @@ -118,7 +117,7 @@

    {formatTimestamp(note.created_at)}

    - {#if findReply(note) && showParent} + {#if findReply(note)} Reply to {findReply(note).slice(0, 8)} diff --git a/src/partials/Notes.svelte b/src/partials/Notes.svelte index d730a529..e3124944 100644 --- a/src/partials/Notes.svelte +++ b/src/partials/Notes.svelte @@ -6,7 +6,6 @@ import relay from 'src/relay' export let loadNotes - export let showParent = false let notes let limit = 0 @@ -25,7 +24,7 @@ {#if notes}
      {#each ($notes || []) as n (n.id)} -
    • +
    • {/each}
    {/if} diff --git a/src/relay/db.js b/src/relay/db.js index ec7214b1..1f2e5a11 100644 --- a/src/relay/db.js +++ b/src/relay/db.js @@ -2,15 +2,15 @@ import Dexie from 'dexie' import {writable, get} from 'svelte/store' import {groupBy, prop, flatten, pick} from 'ramda' import {ensurePlural, switcherFn} from 'hurdak/lib/hurdak' -import {now, getLocalJson, setLocalJson} from 'src/util/misc' +import {now, timedelta, getLocalJson, setLocalJson} from 'src/util/misc' import {filterTags, findReply, findRoot} from 'src/util/nostr' export const db = new Dexie('coracle/relay') -db.version(4).stores({ +db.version(5).stores({ relays: '++url, name', events: '++id, pubkey, created_at, kind, content, reply, root', - tags: '++key, event, value', + tags: '++key, event, value, created_at', }) window.db = db @@ -39,7 +39,7 @@ db.events.process = async events => { // Persist notes and reactions if (notesAndReactions.length > 0) { const persistentEvents = notesAndReactions - .map(e => ({...e, root: findRoot(e), reply: findReply(e), added_at: now()})) + .map(e => ({...e, root: findRoot(e), reply: findReply(e), created_at: now()})) db.events.bulkPut(persistentEvents) @@ -54,6 +54,7 @@ db.events.process = async events => { value: tag[1], relay: tag[2], mark: tag[3], + created_at: e.created_at, }) ) ) @@ -102,3 +103,9 @@ db.events.process = async events => { return $people }) } + +// On initial load, delete old event data +const threshold = now() - timedelta(30, 'days') + +db.events.where('created_at').below(threshold).delete() +db.tags.where('created_at').below(threshold).delete() diff --git a/src/relay/index.js b/src/relay/index.js index f8ccea1b..9669bae3 100644 --- a/src/relay/index.js +++ b/src/relay/index.js @@ -1,6 +1,6 @@ import {liveQuery} from 'dexie' import {get} from 'svelte/store' -import {pluck, take, uniqBy, groupBy, concat, without, prop, isNil, identity} from 'ramda' +import {pluck, uniq, take, uniqBy, groupBy, concat, without, prop, isNil, identity} from 'ramda' import {ensurePlural, createMap, ellipsize} from 'hurdak/lib/hurdak' import {escapeHtml} from 'src/util/html' import {filterTags, findReply, findRoot} from 'src/util/nostr' @@ -216,9 +216,17 @@ const loadNoteContext = async (note, {loadParent = false} = {}) => { filter.push({kinds: [0], authors: [note.pubkey]}) } - await pool.loadEvents(filter) - const replyId = findReply(note) + // Load the events + const events = await pool.loadEvents(filter) + // Load any related people we're missing + const $people = get(people) + await pool.loadPeople( + uniq(pluck('pubkey', events)).filter(k => !$people[k]) + ) + + // Load the note's parent + const replyId = findReply(note) if (loadParent && replyId) { await getOrLoadNote(replyId) } diff --git a/src/relay/pool.js b/src/relay/pool.js index 4d556119..90302d45 100644 --- a/src/relay/pool.js +++ b/src/relay/pool.js @@ -207,5 +207,5 @@ const syncNetwork = async () => { export default { getPubkey, getRelays, addRelay, removeRelay, setPrivateKey, setPublicKey, - publishEvent, loadEvents, listenForEvents, syncNetwork, + publishEvent, loadEvents, listenForEvents, syncNetwork, loadPeople, } diff --git a/src/routes/Alerts.svelte b/src/routes/Alerts.svelte index e5a62505..4e2383f9 100644 --- a/src/routes/Alerts.svelte +++ b/src/routes/Alerts.svelte @@ -103,7 +103,7 @@ {#if e.people}
  • {:else} -
  • +
  • {/if} {/each} diff --git a/src/routes/Login.svelte b/src/routes/Login.svelte index 9e208e8d..c2f4a338 100644 --- a/src/routes/Login.svelte +++ b/src/routes/Login.svelte @@ -63,15 +63,17 @@
    +{:else} +
    +
    + Don't have an account? Click here to join the nostr network. +
    +
    + {/if} diff --git a/src/routes/Person.svelte b/src/routes/Person.svelte index d9be7bd0..57734bc7 100644 --- a/src/routes/Person.svelte +++ b/src/routes/Person.svelte @@ -111,7 +111,7 @@ {#if activeTab === 'notes'} - + {:else if activeTab === 'likes'} {:else if activeTab === 'network'} diff --git a/src/util/misc.js b/src/util/misc.js index d1403a02..bc420cf4 100644 --- a/src/util/misc.js +++ b/src/util/misc.js @@ -100,7 +100,7 @@ export const getLastSync = (k, fallback) => { export class Cursor { constructor(since, delta) { - this.since = since || now() - delta, + this.since = (since || now()) - delta, this.delta = delta } step() { diff --git a/src/views/NoteDetail.svelte b/src/views/NoteDetail.svelte index 2584b182..d7c79e2b 100644 --- a/src/views/NoteDetail.svelte +++ b/src/views/NoteDetail.svelte @@ -47,7 +47,7 @@ {:else if $observable}
    - +
    {:else} diff --git a/src/views/PersonSettings.svelte b/src/views/PersonSettings.svelte index 8bd64a47..9f379eb3 100644 --- a/src/views/PersonSettings.svelte +++ b/src/views/PersonSettings.svelte @@ -4,7 +4,6 @@ import {fly} from 'svelte/transition' import Button from "src/partials/Button.svelte" import SelectButton from "src/partials/SelectButton.svelte" - import {getTagValues} from "src/util/nostr" import {modal} from "src/state/app" import relay, {user} from 'src/relay' diff --git a/src/views/notes/Global.svelte b/src/views/notes/Global.svelte index de0d5167..11e08573 100644 --- a/src/views/notes/Global.svelte +++ b/src/views/notes/Global.svelte @@ -3,6 +3,7 @@ import {onMount, onDestroy} from 'svelte' import Notes from "src/partials/Notes.svelte" import {timedelta, Cursor, getLastSync} from 'src/util/misc' + import {getTagValues} from 'src/util/nostr' import relay, {user} from 'src/relay' let sub diff --git a/src/views/notes/Network.svelte b/src/views/notes/Network.svelte index 8d86e043..94f77840 100644 --- a/src/views/notes/Network.svelte +++ b/src/views/notes/Network.svelte @@ -3,24 +3,33 @@ import {onMount, onDestroy} from 'svelte' import Notes from "src/partials/Notes.svelte" import {timedelta, Cursor, getLastSync} from 'src/util/misc' + import {getTagValues} from 'src/util/nostr' import relay, {user, network} from 'src/relay' let sub + let networkUnsub const cursor = new Cursor( getLastSync('views/notes/Network'), timedelta(1, 'hours') ) - onMount(async () => { - sub = await relay.pool.listenForEvents( - 'views/notes/Network', - [{kinds: [1, 5, 7], authors: $network, since: cursor.since}], - when(propEq('kind', 1), relay.loadNoteContext) - ) + onMount(() => { + // We need to re-create the sub when network changes, since this is where + // we land when we first log in, but before network is loaded, leading to + // a forever spinner. + networkUnsub = network.subscribe(async $network => { + sub = await relay.pool.listenForEvents( + 'views/notes/Network', + [{kinds: [1, 5, 7], authors: $network, since: cursor.since}], + when(propEq('kind', 1), relay.loadNoteContext) + ) + }) }) onDestroy(() => { + networkUnsub() + if (sub) { sub.unsub() } @@ -46,4 +55,7 @@ } + +{#key $network.map(n => n[0]).join('')} +{/key}