From d6f19deb80dc182025d3aa1c286b92810c103a92 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Fri, 29 Nov 2024 15:52:46 +0100 Subject: [PATCH 1/9] hide `open with` for kind 1 and change the icon --- src/app/shared/NoteActions.svelte | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/app/shared/NoteActions.svelte b/src/app/shared/NoteActions.svelte index a41f5cce1..5f1956a83 100644 --- a/src/app/shared/NoteActions.svelte +++ b/src/app/shared/NoteActions.svelte @@ -167,15 +167,17 @@ $: canZap = zapper?.allowsNostr && note.pubkey !== $sessionWithMeta?.pubkey $: reply = replies.find(e => e.pubkey === $sessionWithMeta?.pubkey) $: $repliesCount = replies.length - $: handlers = $kindHandlers.filter( - h => - h.name.toLowerCase() !== "coracle" && - h.event.tags.some( - t => - ["web", os].includes(t[0]) && - (t.length === 2 || ["note", "nevent", ""].includes(last(t))), - ), - ) + $: handlers = + note.kind != 1 && + $kindHandlers.filter( + h => + h.name.toLowerCase() !== "coracle" && + h.event.tags.some( + t => + ["web", os].includes(t[0]) && + (t.length == 2 || ["note", "nevent", ""].includes(last(t))), + ), + ) $: { actions = [] @@ -269,8 +271,8 @@
From c5fb0903ef614d7d1e6d5b59e40bbbb2ef4a97d9 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Thu, 5 Dec 2024 17:48:05 +0100 Subject: [PATCH 2/9] refactor note thread --- src/app/shared/Feed.svelte | 6 +- src/app/shared/FeedCard.svelte | 5 +- src/app/shared/Note.svelte | 32 +-- src/app/shared/NoteActions.svelte | 412 ++++++++++++++++-------------- src/app/shared/NoteContent.svelte | 3 +- src/app/shared/NoteHeader.svelte | 80 ++++++ src/app/shared/NoteKind.svelte | 167 ++++++++++++ src/app/shared/NotePending.svelte | 6 +- src/app/shared/Thread.svelte | 238 +++++++++++++++++ src/app/views/NoteDetail.svelte | 4 +- 10 files changed, 719 insertions(+), 234 deletions(-) create mode 100644 src/app/shared/NoteHeader.svelte create mode 100644 src/app/shared/NoteKind.svelte create mode 100644 src/app/shared/Thread.svelte diff --git a/src/app/shared/Feed.svelte b/src/app/shared/Feed.svelte index f3f63adbc..4c364e0e8 100644 --- a/src/app/shared/Feed.svelte +++ b/src/app/shared/Feed.svelte @@ -39,7 +39,6 @@ import Card from "src/partials/Card.svelte" import Spinner from "src/partials/Spinner.svelte" import FlexColumn from "src/partials/FlexColumn.svelte" - import Note from "src/app/shared/Note.svelte" import FeedControls from "src/app/shared/FeedControls.svelte" import {router} from "src/app/util" import type {Feed} from "src/domain" @@ -51,6 +50,7 @@ isEventMuted, unwrapRepost, } from "src/engine" + import Thread from "src/app/shared/Thread.svelte" export let feed: Feed export let anchor = null @@ -241,10 +241,10 @@ {/if} - + {#each events as note, i (note.id)}
- +
{#if i > 20 && parseInt(hash(note.id)) % 100 === 0 && $promptDismissed < ago(WEEK)} diff --git a/src/app/shared/FeedCard.svelte b/src/app/shared/FeedCard.svelte index b794b0aaa..c4447d53f 100644 --- a/src/app/shared/FeedCard.svelte +++ b/src/app/shared/FeedCard.svelte @@ -12,7 +12,6 @@ import {slide} from "src/util/transition" import {boolCtrl} from "src/partials/utils" import FlexColumn from "src/partials/FlexColumn.svelte" - import Card from "src/partials/Card.svelte" import Chip from "src/partials/Chip.svelte" import Anchor from "src/partials/Anchor.svelte" import CopyValueSimple from "src/partials/CopyValueSimple.svelte" @@ -49,7 +48,7 @@ ) - +
@@ -116,4 +115,4 @@ )} {/if} - +
diff --git a/src/app/shared/Note.svelte b/src/app/shared/Note.svelte index 27dd21cac..587aa3ba9 100644 --- a/src/app/shared/Note.svelte +++ b/src/app/shared/Note.svelte @@ -1,25 +1,22 @@ - - {#if env.ENABLE_ZAPS && noteActions.includes("zaps")} - - {/if} - {#if noteActions.includes("reactions")} +{#if drafts.has(event.id) || event.created_at < $timestamp1 - 45} + - {/if} - {#if handlers.length > 0 && noteActions.includes("recommended_apps")} - + {#if env.ENABLE_ZAPS && noteActions.includes("zaps")} -
- - Open with: - {#each handlers as handler} - openWithHandler(handler)}> -
- - {handler.name} -
- {#if handler.recommendations.length > 0} - - {/if} -
- {/each} -
-
-
- {/if} -
-
- {#if note.wrap} -
- - -
- {/if} - {#if $seenOn?.length > 0 && (env.PLATFORM_RELAYS.length === 0 || env.PLATFORM_RELAYS.length > 1)} - - {/if} - -
- - -{#if view} - setView(null)}> - {#if view === "info"} - {#if zaps.length > 0} -

Zapped By

-
- {#each zaps as zap} -
- - {formatSats(zap.invoiceAmount / 1000)} sats -
- {/each} -
{/if} - {#if likes.length > 0} -

Liked By

-
- {#each likes as like} - - {/each} -
+ {#if noteActions.includes("reactions")} + {/if} - {#if $seenOn?.length > 0 && (env.PLATFORM_RELAYS.length === 0 || env.PLATFORM_RELAYS.length > 1)} -

Relays

-

This note was found on {quantify($seenOn.length, "relay")} below.

-
- {#each $seenOn as url} - - {/each} + {#if handlers.length > 0 && noteActions.includes("recommended_apps")} + + +
+ + Open with: + {#each handlers as handler} + openWithHandler(handler)}> +
+ + {handler.name} +
+ {#if handler.recommendations.length > 0} + + {/if} +
+ {/each} +
+
+
+ {/if} +
+
+ {#if event.wrap} +
+ +
{/if} - {#if mentions.length > 0} -

In this conversation

-

{quantify(mentions.length, "person is", "people are")} tagged in this note.

-
- {#each mentions as pubkey} - - {/each} + {#if $seenOn?.length > 0 && (env.PLATFORM_RELAYS.length === 0 || env.PLATFORM_RELAYS.length > 1)} + {/if} - {#if handlers.length > 0 || handlerEvent} -

Apps

- {#if handlerEvent} - {@const [handler] = readHandlers(handlerEvent)} - {#if handler} -

This note was published using {displayHandler(handler)}.

- - {/if} + +
+ + + {#if view} + setView(null)}> + {#if view === "info"} + {#if zaps.length > 0} +

Zapped By

+
+ {#each zaps as zap} +
+ + {formatSats(zap.invoiceAmount / 1000)} sats +
+ {/each} +
{/if} - {#if handlers.length > 0} -
-

- This note can also be viewed using {quantify(handlers.length, "other nostr app")}. -

- {#if handlersShown} - Hide apps - {:else} - Show apps - {/if} + {#if likes.length > 0} +

Liked By

+
+ {#each likes as like} + + {/each}
- {#if handlersShown} -
- - {#each handlers as handler (getHandlerKey(handler))} - - {/each} - + {/if} + {#if $seenOn?.length > 0 && (env.PLATFORM_RELAYS.length === 0 || env.PLATFORM_RELAYS.length > 1)} +

Relays

+

This note was found on {quantify($seenOn.length, "relay")} below.

+
+ {#each $seenOn as url} + + {/each} +
+ {/if} + {#if mentions.length > 0} +

In this conversation

+

{quantify(mentions.length, "person is", "people are")} tagged in this note.

+
+ {#each mentions as pubkey} + + {/each} +
+ {/if} + {#if handlers.length > 0 || handlerEvent} +

Apps

+ {#if handlerEvent} + {@const [handler] = readHandlers(handlerEvent)} + {#if handler} +

This note was published using {displayHandler(handler)}.

+ + {/if} + {/if} + {#if handlers.length > 0} +
+

+ This note can also be viewed using {quantify(handlers.length, "other nostr app")}. +

+ {#if handlersShown} + Hide apps + {:else} + Show apps + {/if}
+ {#if handlersShown} +
+ + {#each handlers as handler (getHandlerKey(handler))} + + {/each} + +
+ {/if} {/if} {/if} +

Details

+ + + {/if} -

Details

- - - - {/if} - + + {/if} +{:else} + {/if} diff --git a/src/app/shared/NoteContent.svelte b/src/app/shared/NoteContent.svelte index eea2a77e6..4899aeb01 100644 --- a/src/app/shared/NoteContent.svelte +++ b/src/app/shared/NoteContent.svelte @@ -27,7 +27,6 @@ export let note export let depth = 0 export let showEntire = false - export let expandable = true export let showMedia = getSetting("show_media") let warning = getSetting("hide_sensitive") ? getContentWarning(note) : null @@ -85,7 +84,7 @@ {:else if CUSTOM_LIST_KINDS.includes(note.kind)} {:else} - +
diff --git a/src/app/shared/NoteHeader.svelte b/src/app/shared/NoteHeader.svelte new file mode 100644 index 000000000..eb15ee0c7 --- /dev/null +++ b/src/app/shared/NoteHeader.svelte @@ -0,0 +1,80 @@ + + +
+
+ + + +
+
+
+ + + +
+ + {formatTimestamp(event.created_at)} + +
+
+
+
+ {#if showReply} + + + View Parent + + {/if} + {#if showRoot} + + + View Thread + + {/if} +
+
+
+
diff --git a/src/app/shared/NoteKind.svelte b/src/app/shared/NoteKind.svelte new file mode 100644 index 000000000..6d29842eb --- /dev/null +++ b/src/app/shared/NoteKind.svelte @@ -0,0 +1,167 @@ + + +
+ + + {#if hidden && !showHidden} +

+ You have hidden this note. + { + showHidden = true + }}>Show +

+ {:else} +
+ {#if warning} +
+ +

+ This note has been flagged by the author as "{warning}".
+ Show anyway +

+
+ {:else if note.kind === 0} + + {:else if note.kind === 3} + + {:else if [40, 41].includes(note.kind)} + + {:else if note.kind === 1808} + + {:else if note.kind === 1985} + + {:else if note.kind === 9735} + + {:else if note.kind === 1986} + + {:else if note.kind === 9802} + + {:else if note.kind === 1063} + + {:else if note.kind === 10002} + + {:else if note.kind === 30009} + + {:else if note.kind === 30023} + + {:else if note.kind === 30311} + + {:else if note.kind === 30402} + + {:else if note.kind === 31337} + + {:else if note.kind === 31890} + + {:else if note.kind === 31923} + + {:else if note.kind === 32123} + + {:else if CUSTOM_LIST_KINDS.includes(note.kind)} + + {:else} + +
+ +
+
+ {/if} +
+
+ +
+ {/if} +
+
diff --git a/src/app/shared/NotePending.svelte b/src/app/shared/NotePending.svelte index 8b74a7ee6..2467d1f2e 100644 --- a/src/app/shared/NotePending.svelte +++ b/src/app/shared/NotePending.svelte @@ -18,7 +18,7 @@ import {thunks, type Thunk} from "@welshman/app" import {PublishStatus} from "@welshman/net" import {now} from "@welshman/signer" - import {LOCAL_RELAY_URL, type SignedEvent} from "@welshman/util" + import {LOCAL_RELAY_URL, type TrustedEvent} from "@welshman/util" import {tweened} from "svelte/motion" import {userSettings} from "src/engine" import Anchor from "src/partials/Anchor.svelte" @@ -26,7 +26,7 @@ const rendered = now() - export let event: SignedEvent + export let event: TrustedEvent export let removeDraft: () => void $: thunk = $thunks[event.id] as Thunk @@ -42,7 +42,7 @@ ).length $: timeout = statuses.filter(s => s.status === PublishStatus.Timeout).length $: success = statuses.filter(s => s.status === PublishStatus.Success).length - $: total = relays.length || 0 + $: total = relays?.length || 0 const completed = tweened(0) diff --git a/src/app/shared/Thread.svelte b/src/app/shared/Thread.svelte new file mode 100644 index 000000000..39c46c8dc --- /dev/null +++ b/src/app/shared/Thread.svelte @@ -0,0 +1,238 @@ + + +{#if ready} +
+ +
+ {#if !showParent && !topLevel} + + + + + + + {#if isLastReply} + + {:else} + + {/if} + {/if} + + {#if !replyIsActive && (visibleReplies.length > 0 || collapsed) && !showEntire && depth > 0} +
+ { + collapsed = !collapsed + }}> + +
+ +
+
+ {collapsed ? "Show replies" : "Hide replies"} +
+
+
+
+ {/if} + + 0} + bind:this={replyCtrl} + on:start={() => { + replyIsActive = true + }} + on:reset={() => { + replyIsActive = false + }} /> + + {#if visibleReplies.length > 0 || hiddenReplies.length > 0 || mutedReplies.length > 0} +
+ {#if hiddenReplies.length > 0} + + {#if visibleReplies.length > 0} + + {/if} + {:else if visibleReplies.length > 0} + + {/if} + {#if visibleReplies.length} + {#key showHiddenReplies} +
+ {#each visibleReplies as r, i (r.id)} + + {/each} +
+ {/key} + {/if} + {#if showHiddenReplies && mutedReplies.length > 0} + + {/if} +
+ {/if} +
+
+{:else if showLoading} + +{/if} diff --git a/src/app/views/NoteDetail.svelte b/src/app/views/NoteDetail.svelte index 044935d57..d91d23066 100644 --- a/src/app/views/NoteDetail.svelte +++ b/src/app/views/NoteDetail.svelte @@ -3,7 +3,7 @@ import {fly} from "src/util/transition" import {getIdOrAddress} from "@welshman/util" import Spinner from "src/partials/Spinner.svelte" - import Note from "src/app/shared/Note.svelte" + import Thread from "src/app/shared/Thread.svelte" import {deriveEvent} from "src/engine" export let id = null @@ -16,7 +16,7 @@ {#if $event}
- +
{:else} From 9ce0223259ce45b4dd47cdd2940bd458935e8188 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Mon, 9 Dec 2024 18:03:13 +0100 Subject: [PATCH 3/9] - Rename Thread to FeedItem - Refactor reply state --- src/app/shared/Feed.svelte | 4 +- .../shared/{Thread.svelte => FeedItem.svelte} | 43 +- src/app/shared/Note.svelte | 381 ------------------ src/app/shared/NoteActions.svelte | 42 +- src/app/shared/NoteHeader.svelte | 4 +- src/app/shared/NoteKind.svelte | 141 +------ src/app/shared/NotePending.svelte | 11 +- src/app/shared/NoteReply.svelte | 85 ++-- src/app/shared/PersonCollections.svelte | 4 +- src/app/state.ts | 2 + src/app/views/NoteDetail.svelte | 2 +- src/app/views/NotificationMention.svelte | 4 +- src/app/views/NotificationReplies.svelte | 4 +- src/app/views/RelayList.svelte | 4 +- src/app/views/ReportCreate.svelte | 4 +- src/app/views/ThreadDetail.svelte | 10 +- 16 files changed, 118 insertions(+), 627 deletions(-) rename src/app/shared/{Thread.svelte => FeedItem.svelte} (86%) delete mode 100644 src/app/shared/Note.svelte diff --git a/src/app/shared/Feed.svelte b/src/app/shared/Feed.svelte index 4c364e0e8..670e7c29f 100644 --- a/src/app/shared/Feed.svelte +++ b/src/app/shared/Feed.svelte @@ -50,7 +50,7 @@ isEventMuted, unwrapRepost, } from "src/engine" - import Thread from "src/app/shared/Thread.svelte" + import FeedItem from "src/app/shared/FeedItem.svelte" export let feed: Feed export let anchor = null @@ -244,7 +244,7 @@ {#each events as note, i (note.id)}
- +
{#if i > 20 && parseInt(hash(note.id)) % 100 === 0 && $promptDismissed < ago(WEEK)} diff --git a/src/app/shared/Thread.svelte b/src/app/shared/FeedItem.svelte similarity index 86% rename from src/app/shared/Thread.svelte rename to src/app/shared/FeedItem.svelte index 39c46c8dc..899f2587c 100644 --- a/src/app/shared/Thread.svelte +++ b/src/app/shared/FeedItem.svelte @@ -3,18 +3,17 @@ import {ctx} from "@welshman/lib" import {deriveEvents} from "@welshman/store" import {getIdOrAddress, getReplyFilters, isChildOf, matchFilters} from "@welshman/util" - import {quantify, sleep} from "hurdak" + import {quantify} from "hurdak" import {onMount} from "svelte" import NoteMeta from "src/app/shared/NoteMeta.svelte" - import NoteReply from "src/app/shared/NoteReply.svelte" import NoteKind from "src/app/shared/NoteKind.svelte" - import {drafts} from "src/app/state" - import {ensureUnwrapped, isEventMuted, loadEvent, sortEventsDesc} from "src/engine" + import {ensureUnwrapped, getSetting, isEventMuted, loadEvent, sortEventsDesc} from "src/engine" import AltColor from "src/partials/AltColor.svelte" import Popover from "src/partials/Popover.svelte" import Spinner from "src/partials/Spinner.svelte" import {replyKinds} from "src/util/nostr" import {fly, slide} from "src/util/transition" + import {openReplies} from "src/app/state" export let note export let relays = [] @@ -26,34 +25,22 @@ export let isLastReply = false export let showParent = true export let showLoading = false + export let showMedia = getSetting("show_media") let ready = false let event = note - let replyCtrl = null - let replyIsActive = false let showMutedReplies = false let collapsed = depth === 0 let showHiddenReplies = anchor === getIdOrAddress(event) let draftEventId: string - let removeDraft: () => void const showEntire = showHiddenReplies - const addDraftToContext = (event, cb) => { - draftEventId = event.id - removeDraft = () => { - cb() - drafts.set(note.id, event.content) - sleep(10).then(() => { - replyCtrl?.start() - }) - } - } - const context = deriveEvents(repository, {filters: getReplyFilters([event])}) $: children = $context.filter(e => isChildOf(e, event)) $: replies = sortEventsDesc(children.filter(e => replyKinds.includes(e.kind))) + $: replyIsActive = $openReplies[event.id] let mutedReplies, hiddenReplies, visibleReplies @@ -100,7 +87,6 @@ } onMount(async () => { - console.log("THREAD") if (!event.pubkey) { event = await loadEvent(event.id, { relays: ctx.app.router.FromRelays(relays).getUrls(), @@ -113,8 +99,6 @@ ready = true } }) - - $: console.log(ready) {#if ready} @@ -122,7 +106,6 @@
{#if !showParent && !topLevel} - {/if} {/if} - + {#if !replyIsActive && (visibleReplies.length > 0 || collapsed) && !showEntire && depth > 0}
{/if} - 0} - bind:this={replyCtrl} - on:start={() => { - replyIsActive = true - }} - on:reset={() => { - replyIsActive = false - }} /> - {#if visibleReplies.length > 0 || hiddenReplies.length > 0 || mutedReplies.length > 0}
- import {ctx} from "@welshman/lib" - import { - isChildOf, - getReplyFilters, - getIdOrAddress, - matchFilters, - NOTE, - REACTION, - ZAP_RESPONSE, - getAncestorTagValues, - } from "@welshman/util" - import {repository} from "@welshman/app" - import {deriveEvents} from "@welshman/store" - import {sleep} from "hurdak" - import {onMount} from "svelte" - import {quantify} from "hurdak" - import {fly, slide} from "src/util/transition" - import {replyKinds} from "src/util/nostr" - import {formatTimestamp, timestamp1} from "src/util/misc" - import Popover from "src/partials/Popover.svelte" - import AltColor from "src/partials/AltColor.svelte" - import Spinner from "src/partials/Spinner.svelte" - import Anchor from "src/partials/Anchor.svelte" - import Card from "src/partials/Card.svelte" - import NoteMeta from "src/app/shared/NoteMeta.svelte" - import PersonCircle from "src/app/shared/PersonCircle.svelte" - import PersonName from "src/app/shared/PersonName.svelte" - import NoteReply from "src/app/shared/NoteReply.svelte" - import NoteActions from "src/app/shared/NoteActions.svelte" - import NoteContent from "src/app/shared/NoteContent.svelte" - import NotePending from "src/app/shared/NotePending.svelte" - import {drafts} from "src/app/state" - import {router} from "src/app/util/router" - import { - env, - load, - loadEvent, - ensureUnwrapped, - isEventMuted, - getSetting, - sortEventsDesc, - } from "src/engine" - - export let note - export let relays = [] - export let filters = null - export let reposts = new Map() - export let depth = 0 - export let anchor = null - export let topLevel = false - export let isLastReply = false - export let isDraft = false - export let removeDraftCb = null - export let showParent = true - export let showLoading = false - export let showHidden = false - export let showMedia = getSetting("show_media") - - let ready = false - let event = note - let replyCtrl = null - let replyIsActive = false - let showMutedReplies = false - let collapsed = depth === 0 - let showHiddenReplies = anchor === getIdOrAddress(event) - let draftEventId: string - let removeDraft: () => void - - const showEntire = showHiddenReplies - const interactive = !anchor || !showEntire - - const addDraftToContext = (event, cb) => { - draftEventId = event.id - removeDraft = () => { - cb() - drafts.set(note.id, event.content) - sleep(10).then(() => { - replyCtrl?.start() - }) - } - } - - const onClick = e => { - const target = (e.detail?.target || e.target) as HTMLElement - - if (interactive && !["I"].includes(target.tagName) && !target.closest("a")) { - router - .at("notes") - .of(getIdOrAddress(event), {relays: ctx.app.router.Event(event).getUrls()}) - .open() - } - } - - const showPerson = () => router.at("people").of(event.pubkey).open() - - const goToDetail = () => - router - .at("notes") - .of(getIdOrAddress(event), {relays: ctx.app.router.Event(event).getUrls()}) - .push() - - const goToParent = () => - router - .at("notes") - .of(reply, {relays: ctx.app.router.EventParents(event).getUrls()}) - .open() - - const goToThread = () => - router - .at("notes") - .of(getIdOrAddress(event), {relays: ctx.app.router.EventRoots(event).getUrls()}) - .at("thread") - .open() - - const context = deriveEvents(repository, {filters: getReplyFilters([event])}) - - $: ancestors = getAncestorTagValues(event.tags || []) - $: reply = ancestors.replies[0] - $: root = ancestors.roots[0] - $: hidden = $isEventMuted(event, true) - $: children = $context.filter(e => isChildOf(e, event)) - $: replies = sortEventsDesc(children.filter(e => e.kind === NOTE)) - - let mutedReplies, hiddenReplies, visibleReplies - - $: { - mutedReplies = [] - hiddenReplies = [] - visibleReplies = [] - - for (const e of replies) { - if ($isEventMuted(e)) { - mutedReplies.push(e) - } else if (collapsed) { - hiddenReplies.push(e) - } else if ( - !showHiddenReplies && - filters && - !matchFilters(filters, e) && - draftEventId !== e.id - ) { - hiddenReplies.push(e) - } else { - visibleReplies.push(e) - } - } - - if (depth === 0) { - mutedReplies.splice(0) - hiddenReplies.splice(0) - } - - if (!showHiddenReplies && visibleReplies.length === 0) { - mutedReplies.splice(0) - hiddenReplies.splice(0) - } - - if (showMutedReplies) { - visibleReplies = visibleReplies.concat(mutedReplies.splice(0)) - } - - if (!showHiddenReplies) { - hiddenReplies = hiddenReplies.concat(visibleReplies.slice(3)) - visibleReplies = visibleReplies.slice(0, 3) - } - } - - onMount(async () => { - if (!event.pubkey) { - event = await loadEvent(event.id, { - relays: ctx.app.router.FromRelays(relays).getUrls(), - }) - } - - event = await ensureUnwrapped(event) - - if (event.pubkey) { - ready = true - - const actions = getSetting("note_actions") - const kinds = [] - - if (actions.includes("replies")) { - kinds.push(NOTE) - } - - if (actions.includes("reactions")) { - kinds.push(REACTION) - } - - if (env.ENABLE_ZAPS && actions.includes("zaps")) { - kinds.push(ZAP_RESPONSE) - } - - load({ - relays: ctx.app.router.Replies(event).getUrls(), - filters: getReplyFilters([event], {kinds}), - }) - } - }) - - -{#if ready} - {@const showReply = reply && !ancestors.replies.includes(anchor) && showParent} - {@const showRoot = root && !ancestors.roots.includes(anchor) && root !== reply && showParent} -
- -
- {#if !showParent && !topLevel} - - - - - - {#if isLastReply} - - {:else} - - {/if} - {/if} -
- -
- - - -
-
-
- - - -
- - {formatTimestamp(event.created_at)} - -
-
-
-
- {#if showReply} - - - View Parent - - {/if} - {#if showRoot} - - - View Thread - - {/if} -
- {#if hidden && !showHidden} -

- You have hidden this note. - { - showHidden = true - }}>Show -

- {:else} - - {/if} -
- {#if !isDraft || event.created_at < $timestamp1 - 45} - - {:else} - - {/if} -
-
- -
- - {#if !replyIsActive && (visibleReplies.length > 0 || collapsed) && !showEntire && depth > 0} -
- { - collapsed = !collapsed - }}> - -
- -
-
- {collapsed ? "Show replies" : "Hide replies"} -
-
-
-
- {/if} - - 0} - bind:this={replyCtrl} - on:start={() => { - replyIsActive = true - }} - on:reset={() => { - replyIsActive = false - }} /> - - {#if visibleReplies.length > 0 || hiddenReplies.length > 0 || mutedReplies.length > 0} -
- {#if hiddenReplies.length > 0} - - {#if visibleReplies.length > 0} - - {/if} - {:else if visibleReplies.length > 0} - - {/if} - {#if visibleReplies.length} - {#key showHiddenReplies} -
- {#each visibleReplies as r, i (r.id)} - - {/each} -
- {/key} - {/if} - {#if showHiddenReplies && mutedReplies.length > 0} - - {/if} -
- {/if} -
-
-{:else if showLoading} - -{/if} diff --git a/src/app/shared/NoteActions.svelte b/src/app/shared/NoteActions.svelte index 57bb06ff2..f7944a6dc 100644 --- a/src/app/shared/NoteActions.svelte +++ b/src/app/shared/NoteActions.svelte @@ -17,6 +17,11 @@ getPubkeyTagValues, getLnUrl, zapFromEvent, + NOTE, + REACTION, + ZAP_RESPONSE, + getReplyFilters, + isChildOf, } from "@welshman/util" import {fly} from "src/util/transition" import {formatSats, timestamp1} from "src/util/misc" @@ -54,11 +59,10 @@ sortEventsDesc, } from "src/engine" import {getHandlerKey, readHandlers, displayHandler} from "src/domain" - import {drafts} from "src/app/state" + import {drafts, openReplies} from "src/app/state" import {isLike, replyKinds} from "src/util/nostr" export let event: TrustedEvent - export let children: TrustedEvent[] = [] export let showHidden = false const signedEvent = asSignedEvent(event as any) @@ -160,6 +164,10 @@ window.open(templateTag[1].replace("", entity)) } + const context = deriveEvents(repository, {filters: getReplyFilters([event])}) + + $: children = $context.filter(e => isChildOf(e, event)) + let view let actions = [] let handlersShown = false @@ -239,10 +247,32 @@ onMount(() => { loadPubkeys(event.tags.filter(nthEq(0, "zap")).map(nth(1))) + + const actions = getSetting("note_actions") + const kinds = [] + + if (actions.includes("replies")) { + kinds.push(NOTE) + } + + if (actions.includes("reactions")) { + kinds.push(REACTION) + } + + if (env.ENABLE_ZAPS && actions.includes("zaps")) { + kinds.push(ZAP_RESPONSE) + } + + load({ + relays: ctx.app.router.Replies(event).getUrls(), + filters: getReplyFilters([event], {kinds}), + }) }) -{#if drafts.has(event.id) || event.created_at < $timestamp1 - 45} +{#if event.created_at > $timestamp1 - 45 && event.pubkey === $session?.pubkey} + +{:else} + on:click={() => { + thunk.controller.abort() + $openReplies[parent] = true + }}>Cancel {/if}
diff --git a/src/app/shared/NoteReply.svelte b/src/app/shared/NoteReply.svelte index f28a514e6..4b604f0b8 100644 --- a/src/app/shared/NoteReply.svelte +++ b/src/app/shared/NoteReply.svelte @@ -1,45 +1,37 @@ @@ -163,14 +142,10 @@ class="relative transition-colors" class:opacity-50={loading} class:pointer-events-none={loading}> - {#if showBorder} + +
@@ -213,9 +188,7 @@
{/if} -{#if showOptions} - -{/if} + {#if $nsecWarning} nsecWarning.set(null)} onBypass={bypassNsecWarning} /> diff --git a/src/app/shared/PersonCollections.svelte b/src/app/shared/PersonCollections.svelte index 77fd76b8f..17b0ac9b6 100644 --- a/src/app/shared/PersonCollections.svelte +++ b/src/app/shared/PersonCollections.svelte @@ -1,7 +1,7 @@ - + {#if icon === "bolt"} + {:else if icon == "openwith"} + {/if} From 289bae0c2ada18a142e4810fe213ca2e9125e54e Mon Sep 17 00:00:00 2001 From: Ticruz Date: Thu, 12 Dec 2024 14:13:46 +0100 Subject: [PATCH 5/9] rename NoteKind to Note --- src/app/shared/FeedItem.svelte | 2 +- src/app/shared/{NoteKind.svelte => Note.svelte} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/app/shared/{NoteKind.svelte => Note.svelte} (100%) diff --git a/src/app/shared/FeedItem.svelte b/src/app/shared/FeedItem.svelte index 899f2587c..13c7a06b3 100644 --- a/src/app/shared/FeedItem.svelte +++ b/src/app/shared/FeedItem.svelte @@ -6,7 +6,7 @@ import {quantify} from "hurdak" import {onMount} from "svelte" import NoteMeta from "src/app/shared/NoteMeta.svelte" - import NoteKind from "src/app/shared/NoteKind.svelte" + import NoteKind from "src/app/shared/Note.svelte" import {ensureUnwrapped, getSetting, isEventMuted, loadEvent, sortEventsDesc} from "src/engine" import AltColor from "src/partials/AltColor.svelte" import Popover from "src/partials/Popover.svelte" diff --git a/src/app/shared/NoteKind.svelte b/src/app/shared/Note.svelte similarity index 100% rename from src/app/shared/NoteKind.svelte rename to src/app/shared/Note.svelte From 3de0abac215cc69561c4c1d77cc10286b63dec91 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Thu, 12 Dec 2024 14:17:38 +0100 Subject: [PATCH 6/9] fine tune the padding for feed note --- src/app/shared/FeedItem.svelte | 9 ++++----- src/app/shared/Note.svelte | 4 ++-- src/app/shared/NoteActions.svelte | 15 ++++++++++++--- src/app/shared/NoteReply.svelte | 29 ++++++++++++++++------------- src/partials/Modal.svelte | 2 +- 5 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/app/shared/FeedItem.svelte b/src/app/shared/FeedItem.svelte index 13c7a06b3..0e0dfcdba 100644 --- a/src/app/shared/FeedItem.svelte +++ b/src/app/shared/FeedItem.svelte @@ -2,16 +2,15 @@ import {repository} from "@welshman/app" import {ctx} from "@welshman/lib" import {deriveEvents} from "@welshman/store" - import {getIdOrAddress, getReplyFilters, isChildOf, matchFilters} from "@welshman/util" + import {getIdOrAddress, getReplyFilters, isChildOf, matchFilters, NOTE} from "@welshman/util" import {quantify} from "hurdak" import {onMount} from "svelte" import NoteMeta from "src/app/shared/NoteMeta.svelte" - import NoteKind from "src/app/shared/Note.svelte" + import Note from "src/app/shared/Note.svelte" import {ensureUnwrapped, getSetting, isEventMuted, loadEvent, sortEventsDesc} from "src/engine" import AltColor from "src/partials/AltColor.svelte" import Popover from "src/partials/Popover.svelte" import Spinner from "src/partials/Spinner.svelte" - import {replyKinds} from "src/util/nostr" import {fly, slide} from "src/util/transition" import {openReplies} from "src/app/state" @@ -39,7 +38,7 @@ const context = deriveEvents(repository, {filters: getReplyFilters([event])}) $: children = $context.filter(e => isChildOf(e, event)) - $: replies = sortEventsDesc(children.filter(e => replyKinds.includes(e.kind))) + $: replies = sortEventsDesc(children.filter(e => e.kind == NOTE)) $: replyIsActive = $openReplies[event.id] let mutedReplies, hiddenReplies, visibleReplies @@ -126,7 +125,7 @@ {/if} {/if} - + {#if !replyIsActive && (visibleReplies.length > 0 || collapsed) && !showEntire && depth > 0}
Show

{:else} -
+
-
+
{/if} diff --git a/src/app/shared/NoteActions.svelte b/src/app/shared/NoteActions.svelte index 4f95c633a..f6e9bfd9d 100644 --- a/src/app/shared/NoteActions.svelte +++ b/src/app/shared/NoteActions.svelte @@ -6,7 +6,16 @@ import {tweened} from "svelte/motion" import {derived} from "svelte/store" import {ctx, nth, nthEq, remove, last, sortBy} from "@welshman/lib" - import {repository, signer, tagReactionTo, tagZapSplit, mute, unmute} from "@welshman/app" + import { + deriveZapper, + deriveZapperForPubkey, + repository, + signer, + tagReactionTo, + tagZapSplit, + mute, + unmute, + } from "@welshman/app" import type {TrustedEvent, SignedEvent} from "@welshman/util" import {deriveEvents} from "@welshman/store" import { @@ -61,7 +70,7 @@ } from "src/engine" import {getHandlerKey, readHandlers, displayHandler} from "src/domain" import {drafts, openReplies} from "src/app/state" - import {isLike, replyKinds} from "src/util/nostr" + import {isLike} from "src/util/nostr" export let event: TrustedEvent export let showHidden = false @@ -184,7 +193,7 @@ .filter(e => e.kind === 9735) .map(e => ($zapper ? zapFromEvent(e, $zapper) : null)) .filter(identity) - $: replies = sortEventsDesc(children.filter(e => replyKinds.includes(e.kind))) + $: replies = sortEventsDesc(children.filter(e => e.kind == NOTE)) $: disableActions = !$signer || (muted && !showHidden) $: liked = likes.find(e => e.pubkey === $sessionWithMeta?.pubkey) diff --git a/src/app/shared/NoteReply.svelte b/src/app/shared/NoteReply.svelte index b4ee34de6..c007f704d 100644 --- a/src/app/shared/NoteReply.svelte +++ b/src/app/shared/NoteReply.svelte @@ -1,7 +1,7 @@ -{#if event.created_at > $timestamp1 - 45 && event.pubkey === $session?.pubkey} +{#if event.created_at > $timestamp1 - 45 && event.pubkey === $pubkey} {:else}