diff --git a/.agents/settings.json b/.agents/settings.json
deleted file mode 100644
index b7cc7ae5..00000000
--- a/.agents/settings.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "hooks": {
- "Stop": [
- {
- "hooks": [
- {
- "type": "command",
- "statusMessage": "Checking added comments",
- "command": "cd \"${CLAUDE_PROJECT_DIR:-.}\" && git diff HEAD -U0 -- src | grep -E '^\\+' | grep -v '^+++' | grep -E '//|/\\*|\\*/|
+
+ {/if}
+ {#if pin.topics().length > 0}
+
+ {#each pin.topics() as topic (topic)}
+ #{topic}
+ {/each}
+
+ {/if}
+
+{/await}
diff --git a/src/app/components/NoteContentThread.svelte b/src/app/components/NoteContentThread.svelte
index ca6ec43b..939c5390 100644
--- a/src/app/components/NoteContentThread.svelte
+++ b/src/app/components/NoteContentThread.svelte
@@ -1,11 +1,11 @@
diff --git a/src/app/components/NoteItem.svelte b/src/app/components/NoteItem.svelte
index e98c2c4d..dc80d5d3 100644
--- a/src/app/components/NoteItem.svelte
+++ b/src/app/components/NoteItem.svelte
@@ -2,16 +2,15 @@
import type {Snippet} from "svelte"
import type {NativeEmoji} from "emoji-picker-element/shared"
import type {TrustedEvent, EventContent} from "@welshman/util"
- import {Router} from "@welshman/router"
+ import {seen} from "@welshman/util"
import SmileCircle from "@assets/icons/smile-circle.svg?dataurl"
import Icon from "@lib/components/Icon.svelte"
import EmojiButton from "@lib/components/EmojiButton.svelte"
import NoteContent from "@app/components/NoteContent.svelte"
+ import {publishReaction, retractReaction} from "@app/reactions"
import NoteCard from "@app/components/NoteCard.svelte"
import ReactionSummary from "@app/components/ReactionSummary.svelte"
- import {publishDelete} from "@app/deletes"
- import {publishReaction} from "@app/reactions"
- import {canEnforceNip70} from "@app/relays"
+ import {router} from "@app/core"
type Props = {
event: TrustedEvent
@@ -21,23 +20,15 @@
const {url, event, children}: Props = $props()
- const relays = url ? [url] : Router.get().Event(event).getUrls()
+ const getRelays = () => (url ? [url] : $router.resolver.relays([seen(event)]))
- const shouldProtect = url ? canEnforceNip70(url) : false
+ const deleteReaction = async (reaction: TrustedEvent) =>
+ retractReaction(reaction, {url, urls: await getRelays()})
- const deleteReaction = async (event: TrustedEvent) =>
- publishDelete({relays, event, protect: await shouldProtect})
+ const createReaction = async (values: EventContent) =>
+ publishReaction(event, values, {url, urls: await getRelays()})
- const createReaction = async (template: EventContent) =>
- publishReaction({...template, event, relays, protect: await shouldProtect})
-
- const onEmoji = async (emoji: NativeEmoji) =>
- publishReaction({
- event,
- relays,
- content: emoji.unicode,
- protect: await shouldProtect,
- })
+ const onEmoji = (emoji: NativeEmoji) => createReaction({content: emoji.unicode, tags: []})
diff --git a/src/app/components/PasswordReset.svelte b/src/app/components/PasswordReset.svelte
index 3f06e3b3..1224febc 100644
--- a/src/app/components/PasswordReset.svelte
+++ b/src/app/components/PasswordReset.svelte
@@ -1,7 +1,5 @@
diff --git a/src/app/components/PinEdit.svelte b/src/app/components/PinEdit.svelte
index a3c17e5f..5822de3d 100644
--- a/src/app/components/PinEdit.svelte
+++ b/src/app/components/PinEdit.svelte
@@ -1,28 +1,30 @@
@@ -32,9 +34,9 @@
action="Save changes"
successMessage="Link updated!"
values={{
- title: pin.title,
- topics: pin.topics,
+ title: pin.title(),
+ topics: pin.topics(),
value: pinToReference(pin),
- content: pin.description,
+ content: pin.content(),
}}
{submit} />
diff --git a/src/app/components/PinItem.svelte b/src/app/components/PinItem.svelte
index cce58999..87e575c0 100644
--- a/src/app/components/PinItem.svelte
+++ b/src/app/components/PinItem.svelte
@@ -2,16 +2,17 @@
import * as nip19 from "nostr-tools/nip19"
import {removeUndefined} from "@welshman/lib"
import {Address} from "@welshman/util"
+ import type {PinReader} from "@welshman/domain"
import Badge from "@lib/components/Badge.svelte"
import MenuButton from "@lib/components/MenuButton.svelte"
import Content from "@app/components/Content.svelte"
import PinContentEvent from "@app/components/PinContentEvent.svelte"
import PinMenu from "@app/components/PinMenu.svelte"
- import {type PublishedPin} from "@app/pinboards"
+ import {pinToReference} from "@app/pinboards"
type Props = {
url: string
- pin: PublishedPin
+ pin: PinReader
minimal?: boolean
class?: string
}
@@ -20,20 +21,20 @@
// Encode nostr references as nostr: entities (i tags are already urls) so
// Content parses them into rich embeds rather than rendering raw ids/coords.
+ const reference = $derived(pin.reference())
+
const content = $derived.by(() => {
- const [type, data = ""] = pin.value
+ if (reference?.type === "event") {
+ return "nostr:" + nip19.neventEncode({id: reference.id, relays: [url]})
+ }
- if (type === "e") return "nostr:" + nip19.neventEncode({id: data, relays: [url]})
-
- if (type === "p") return "nostr:" + nip19.nprofileEncode({pubkey: data, relays: [url]})
-
- if (type === "a") {
- const {kind, pubkey, identifier} = Address.from(data)
+ if (reference?.type === "address") {
+ const {kind, pubkey, identifier} = Address.from(reference.address)
return "nostr:" + nip19.naddrEncode({kind, pubkey, identifier, relays: [url]})
}
- return data
+ return pinToReference(pin)
})
@@ -48,20 +49,23 @@
componentProps={{url, pin}} />
{/if}
- {#if pin.title}
- {pin.title}
+ {#if pin.title()}
+ {pin.title()}
{/if}
- {#if pin.description}
-
+ {#if pin.content()}
+
{/if}
- {#if pin.value[0] === "e" || pin.value[0] === "a"}
-
+ {#if reference?.type === "event" || reference?.type === "address"}
+
{:else}
{/if}
- {#if !minimal && pin.topics.length > 0}
+ {#if !minimal && pin.topics().length > 0}
- {#each pin.topics as topic (topic)}
+ {#each pin.topics() as topic (topic)}
#{topic}
{/each}
diff --git a/src/app/components/PinMenu.svelte b/src/app/components/PinMenu.svelte
index 9798a867..bfa69ea3 100644
--- a/src/app/components/PinMenu.svelte
+++ b/src/app/components/PinMenu.svelte
@@ -1,30 +1,31 @@
- {isNew ? "Create Shelf" : "Edit Shelf"}
+ {board ? "Edit Shelf" : "Create Shelf"}
on
diff --git a/src/app/components/PinboardItem.svelte b/src/app/components/PinboardItem.svelte
index 0f1052b9..aa84961d 100644
--- a/src/app/components/PinboardItem.svelte
+++ b/src/app/components/PinboardItem.svelte
@@ -1,22 +1,24 @@
@@ -29,12 +31,12 @@
componentProps={{url, board}} />
- {board.title || "Untitled shelf"}
- {#if board.description}
- {board.description}
+ {board.title() || "Untitled shelf"}
+ {#if board.description()}
+ {board.description()}
{/if}
- {#each $pins.slice(0, 1) as pin (pin.id)}
+ {#each $pins.slice(0, 1) as pin (pin.id())}
{/each}
diff --git a/src/app/components/PinboardSelect.svelte b/src/app/components/PinboardSelect.svelte
index d13e6ea2..90ed42d9 100644
--- a/src/app/components/PinboardSelect.svelte
+++ b/src/app/components/PinboardSelect.svelte
@@ -1,5 +1,7 @@
@@ -43,14 +49,14 @@
{:else}
- {#each $boards as board (board.address)}
+ {#each $boards as board (board.address())}