diff --git a/CHANGELOG.md b/CHANGELOG.md index f4692c90..ad54097a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +# 0.2.31 + +- [x] Added the ability to view and write reviews on relays, with ratings + # 0.2.30 - [x] Prefer followed users when mentioning people diff --git a/ROADMAP.md b/ROADMAP.md index a7d07d84..35ee514a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -3,9 +3,6 @@ - [ ] List detail pages with follow all and add all to list - [ ] Use vida to stream development - [ ] Fix connection management stuff. Have GPT help -- [ ] Relay reviews - - Add curated relay list, and an easy way to view content on the relays - - Deploy ontology.coracle.social - [ ] Add preview proxy thing - [ ] White-labeled - [ ] Add invite code registration for relay @@ -21,6 +18,7 @@ # Core +- [ ] Deploy ontology.coracle.social - [ ] Add threads - replies by self get shown at the top of replies? - [ ] Show link previews when posting - [ ] Embedded music players for Spotify, youtube, etc diff --git a/src/agent/network.ts b/src/agent/network.ts index 5cc9ed89..72f2d514 100644 --- a/src/agent/network.ts +++ b/src/agent/network.ts @@ -255,7 +255,7 @@ const loadParents = (notes, opts = {}) => { return load({ relays: sampleRelays(aggregateScores(notesWithParent.map(getRelaysForEventParent)), 0.3), - filter: {kinds: [1], ids: notesWithParent.map(findReplyId)}, + filter: {ids: notesWithParent.map(findReplyId)}, ...opts, }) } @@ -268,7 +268,7 @@ const streamContext = ({notes, onChunk, maxDepth = 2}) => { const loadChunk = (events, depth) => { // Remove anything from the chunk we've already seen - events = events.filter(e => e.kind === 1 && !seen.has(e.id)) + events = events.filter(e => ![7, 9735].includes(e.kind) && !seen.has(e.id)) // If we have no new information, no need to re-subscribe if (events.length === 0) { @@ -333,7 +333,7 @@ const streamContext = ({notes, onChunk, maxDepth = 2}) => { const applyContext = (notes, context) => { context = context.map(assoc("isContext", true)) - const replies = context.filter(propEq("kind", 1)) + const replies = context.filter(e => ![7, 9735].includes(e.kind)) const reactions = context.filter(propEq("kind", 7)) const zaps = context.filter(propEq("kind", 9735)) diff --git a/src/app/shared/Feed.svelte b/src/app/shared/Feed.svelte index 04105d31..b4835b06 100644 --- a/src/app/shared/Feed.svelte +++ b/src/app/shared/Feed.svelte @@ -21,6 +21,7 @@ export let shouldDisplay = always(true) export let parentsTimeout = 500 export let invertColors = false + export let onEvent = null let notes = [] let notesBuffer = [] @@ -90,6 +91,11 @@ // Show replies grouped by parent whenever possible const merged = sortBy(e => -e.created_at, mergeParents(combined)) + // Notify caller if they asked for it + for (const e of merged) { + onEvent?.(e) + } + // Split into notes before and after we started loading const [bottom, top] = partition(e => e.created_at < since, merged) diff --git a/src/app/shared/NoteContent.svelte b/src/app/shared/NoteContent.svelte index 84b57c24..8913f839 100644 --- a/src/app/shared/NoteContent.svelte +++ b/src/app/shared/NoteContent.svelte @@ -1,14 +1,16 @@ diff --git a/src/app/shared/RelayCard.svelte b/src/app/shared/RelayCard.svelte index 234815be..dc560c4c 100644 --- a/src/app/shared/RelayCard.svelte +++ b/src/app/shared/RelayCard.svelte @@ -8,12 +8,14 @@ import {displayRelay} from "src/util/nostr" import {modal} from "src/partials/state" import Toggle from "src/partials/Toggle.svelte" + import Rating from "src/partials/Rating.svelte" import Anchor from "src/partials/Anchor.svelte" import pool from "src/agent/pool" import user from "src/agent/user" import {loadAppData} from "src/app/state" export let relay + export let rating = null export let theme = "gray-8" export let showStatus = false export let hideActions = false @@ -82,6 +84,11 @@ {message}

{/if} + {#if rating} +
+ +
+ {/if} {#if !hideActions} diff --git a/src/app/shared/RelaySearch.svelte b/src/app/shared/RelaySearch.svelte index ec40fcf9..35f25a88 100644 --- a/src/app/shared/RelaySearch.svelte +++ b/src/app/shared/RelaySearch.svelte @@ -1,9 +1,13 @@
@@ -35,7 +57,7 @@ {/if} {#each !q && hideIfEmpty ? [] : search(q).slice(0, limit) as relay (relay.url)} - + {/each} diff --git a/src/app/shared/RelayTitle.svelte b/src/app/shared/RelayTitle.svelte index 7440d998..1e5a33c3 100644 --- a/src/app/shared/RelayTitle.svelte +++ b/src/app/shared/RelayTitle.svelte @@ -4,10 +4,12 @@ import {displayRelay} from "src/util/nostr" import {webSocketURLToPlainOrBase64} from "src/util/misc" import {poll, stringToHue, hsl} from "src/util/misc" + import Rating from "src/partials/Rating.svelte" import Anchor from "src/partials/Anchor.svelte" import pool from "src/agent/pool" export let relay + export let rating = null let quality = null let message = null @@ -47,4 +49,9 @@ class:opacity-1={showStatus}> {message}

+ {#if rating} +
+ +
+ {/if}
diff --git a/src/app/views/NoteDetail.svelte b/src/app/views/NoteDetail.svelte index 3e4c9249..ff541667 100644 --- a/src/app/views/NoteDetail.svelte +++ b/src/app/views/NoteDetail.svelte @@ -34,7 +34,7 @@ if (!displayNote.pubkey) { await network.load({ relays: sampleRelays(relays), - filter: {kinds: [1], ids: [displayNote.id]}, + filter: {ids: [displayNote.id]}, onChunk: events => { displayNote = asDisplayEvent(first(events)) }, diff --git a/src/app/views/RelayDetail.svelte b/src/app/views/RelayDetail.svelte index ed2f7b27..74e6b4de 100644 --- a/src/app/views/RelayDetail.svelte +++ b/src/app/views/RelayDetail.svelte @@ -1,24 +1,33 @@ @@ -27,6 +36,11 @@ + {#if rating} +
+ +
+ {/if} {#if relay.description}

{relay.description}

{/if} @@ -34,9 +48,10 @@ {#if activeTab === "reviews"} diff --git a/src/app/views/RelayReview.svelte b/src/app/views/RelayReview.svelte index de54ba53..1b52d5ea 100644 --- a/src/app/views/RelayReview.svelte +++ b/src/app/views/RelayReview.svelte @@ -4,24 +4,26 @@ import Button from "src/partials/Button.svelte" import Content from "src/partials/Content.svelte" import Heading from "src/partials/Heading.svelte" - import Textarea from "src/partials/Textarea.svelte" + import Compose from "src/partials/Compose.svelte" import Rating from "src/partials/Rating.svelte" import user from "src/agent/user" import cmd from "src/agent/cmd" export let url - let review + let compose let rating const onSubmit = () => { + const review = compose.parse() + cmd .createLabel({ content: review, tagClient: false, tags: [ ["L", "social.coracle.ontology"], - ["l", "review", "social.coracle.ontology"], + ["l", "review/relay", "social.coracle.ontology", JSON.stringify({quality: rating})], ["r", url], ], }) @@ -41,7 +43,11 @@ -