From 5110f21e5cc3bded942b7333ade022af15c54f4a Mon Sep 17 00:00:00 2001 From: Ticruz Date: Thu, 31 Oct 2024 10:16:04 +0100 Subject: [PATCH 01/20] add cancelable delay to reply and create note --- src/app/shared/Note.svelte | 68 +++++++++++++++++++++-------- src/app/shared/NoteReply.svelte | 34 +++++++++------ src/app/shared/PersonCircles.svelte | 3 +- src/app/views/NoteCreate.svelte | 24 ++++++---- src/app/views/UserSettings.svelte | 6 +++ src/engine/state.ts | 8 +++- src/partials/Toast.svelte | 21 ++++++++- src/util/misc.ts | 8 +++- 8 files changed, 128 insertions(+), 44 deletions(-) diff --git a/src/app/shared/Note.svelte b/src/app/shared/Note.svelte index efaddcdfe..444fd8f63 100644 --- a/src/app/shared/Note.svelte +++ b/src/app/shared/Note.svelte @@ -12,13 +12,13 @@ ZAP_RESPONSE, getAncestorTagValues, } from "@welshman/util" - import {repository, deriveZapperForPubkey, deriveZapper} from "@welshman/app" + import {repository, deriveZapperForPubkey, deriveZapper, session} from "@welshman/app" import {identity, reject, whereEq, uniqBy, prop} from "ramda" - import {onMount} from "svelte" + import {onDestroy, onMount} from "svelte" import {quantify, batch} from "hurdak" import {fly, slide} from "src/util/transition" import {replyKinds, isLike} from "src/util/nostr" - import {formatTimestamp} from "src/util/misc" + 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" @@ -40,7 +40,9 @@ userMutes, getSetting, sortEventsDesc, + type Pub, } from "src/engine" + import {writable} from "svelte/store" export let note export let relays = [] @@ -105,9 +107,23 @@ } const addToContext = events => { + console.log("add to context", events) + // add an ephemeral status to the events + events.status = "loaded" context = context.concat(events) } + const addDraftStatus = (pub: Pub) => { + console.log("add draft status", pub) + context = context.map(c => { + if (c.id === "draft") { + return {...c, pub} + } else { + return c + } + }) + } + $: ancestors = getAncestorTagValues(event.tags || []) $: reply = ancestors.replies[0] $: root = ancestors.roots[0] @@ -118,10 +134,11 @@ // Find children in our context $: children = context.filter(e => isChildOf(e, event)) - // Sort our replies $: replies = sortEventsDesc(children.filter(e => replyKinds.includes(e.kind))) + $: console.log(children, replies) + let mutedReplies, hiddenReplies, visibleReplies $: { @@ -134,13 +151,15 @@ mutedReplies.push(e) } else if (collapsed) { hiddenReplies.push(e) - } else if (!showHiddenReplies && filters && !matchFilters(filters, e)) { + } else if (!showHiddenReplies && filters && !matchFilters(filters, e) && e.id !== "draft") { hiddenReplies.push(e) } else { visibleReplies.push(e) } } + console.log(mutedReplies, hiddenReplies, visibleReplies) + if (depth === 0) { mutedReplies.splice(0) hiddenReplies.splice(0) @@ -284,18 +303,32 @@ {/if}
- + {#if event.status != "loaded"} + + {:else} +
+ {#if event.pub} + Publishiiiing + {:else} + Sending reply in {event.created_at + 5 - $timestamp1} seconds + + + {/if} +
+ {/if}
@@ -328,6 +361,7 @@ 0} bind:this={replyCtrl} diff --git a/src/app/shared/NoteReply.svelte b/src/app/shared/NoteReply.svelte index 732829a8c..5412e5f8e 100644 --- a/src/app/shared/NoteReply.svelte +++ b/src/app/shared/NoteReply.svelte @@ -1,10 +1,11 @@
- {#each pubkeys.slice(0, 15) as pubkey (pubkey)} + {#each uniq(pubkeys).slice(0, 15) as pubkey (pubkey)}
diff --git a/src/app/views/NoteCreate.svelte b/src/app/views/NoteCreate.svelte index d0834a649..7c8bd5c3f 100644 --- a/src/app/views/NoteCreate.svelte +++ b/src/app/views/NoteCreate.svelte @@ -1,11 +1,14 @@ {#if $toast} @@ -97,6 +110,12 @@ )}> {#if $toast.type === "text"} {$toast.message} + {:else if $toast.type === "delay"} + Sending in {timeLeft} seconds... + $toast.onCancel() && toast.set(null)}>Cancel {:else if $toast.type === "publish"} {@const {status, request} = $toast.pub} {@const total = request.relays.length} diff --git a/src/util/misc.ts b/src/util/misc.ts index 4d002d574..bd372a45d 100644 --- a/src/util/misc.ts +++ b/src/util/misc.ts @@ -1,11 +1,17 @@ import {throttle} from "throttle-debounce" -import {writable} from "svelte/store" +import {derived, writable, type Readable} from "svelte/store" import {now, stripProtocol, isPojo, first, sleep} from "@welshman/lib" import {pluck, fromPairs, last, identity, sum, is} from "ramda" import {Storage, ensurePlural, seconds, tryFunc, round} from "hurdak" import Fuse from "fuse.js" import logger from "src/util/logger" +export const timestamp1: Readable = derived([], (_, set) => { + setInterval(() => { + set(Math.floor(Date.now() / 1000)) + }, 1000) +}) + export const secondsToDate = ts => new Date(parseInt(ts) * 1000) export const dateToSeconds = date => Math.round(date.valueOf() / 1000) From 77b23a4f30bed5c588f1f7ea5ad565b6b0a9cd4b Mon Sep 17 00:00:00 2001 From: Ticruz Date: Thu, 31 Oct 2024 16:35:55 +0100 Subject: [PATCH 02/20] final tweaks --- src/app/shared/Note.svelte | 56 ++++++++------------- src/app/shared/NotePending.svelte | 83 +++++++++++++++++++++++++++++++ src/app/shared/NoteReply.svelte | 9 ++-- src/app/views/NoteCreate.svelte | 1 + 4 files changed, 110 insertions(+), 39 deletions(-) create mode 100644 src/app/shared/NotePending.svelte diff --git a/src/app/shared/Note.svelte b/src/app/shared/Note.svelte index 444fd8f63..d03d16343 100644 --- a/src/app/shared/Note.svelte +++ b/src/app/shared/Note.svelte @@ -14,7 +14,7 @@ } from "@welshman/util" import {repository, deriveZapperForPubkey, deriveZapper, session} from "@welshman/app" import {identity, reject, whereEq, uniqBy, prop} from "ramda" - import {onDestroy, onMount} from "svelte" + import {onMount} from "svelte" import {quantify, batch} from "hurdak" import {fly, slide} from "src/util/transition" import {replyKinds, isLike} from "src/util/nostr" @@ -40,9 +40,9 @@ userMutes, getSetting, sortEventsDesc, - type Pub, } from "src/engine" - import {writable} from "svelte/store" + + import NotePending from "./NotePending.svelte" export let note export let relays = [] @@ -103,25 +103,21 @@ .open() const removeFromContext = e => { + console.log("remove from context", e) context = reject(whereEq({id: e.id}), context) } - const addToContext = events => { - console.log("add to context", events) - // add an ephemeral status to the events - events.status = "loaded" - context = context.concat(events) + const addDraftToContext = (event, cb) => { + event.status = "draft" + event.remove = () => { + cb() + removeFromContext(event) + } + context = context.concat(event) } - const addDraftStatus = (pub: Pub) => { - console.log("add draft status", pub) - context = context.map(c => { - if (c.id === "draft") { - return {...c, pub} - } else { - return c - } - }) + const addToContext = (event, cb) => { + context = context.concat(event) } $: ancestors = getAncestorTagValues(event.tags || []) @@ -151,15 +147,18 @@ mutedReplies.push(e) } else if (collapsed) { hiddenReplies.push(e) - } else if (!showHiddenReplies && filters && !matchFilters(filters, e) && e.id !== "draft") { + } else if ( + !showHiddenReplies && + filters && + !matchFilters(filters, e) && + e.status !== "draft" + ) { hiddenReplies.push(e) } else { visibleReplies.push(e) } } - console.log(mutedReplies, hiddenReplies, visibleReplies) - if (depth === 0) { mutedReplies.splice(0) hiddenReplies.splice(0) @@ -303,7 +302,7 @@ {/if}
- {#if event.status != "loaded"} + {#if event.status !== "draft" || event.created_at < $timestamp1 - 45} {:else} -
- {#if event.pub} - Publishiiiing - {:else} - Sending reply in {event.created_at + 5 - $timestamp1} seconds - - - {/if} -
+ {/if}
@@ -360,8 +349,7 @@ {/if} 0} bind:this={replyCtrl} diff --git a/src/app/shared/NotePending.svelte b/src/app/shared/NotePending.svelte new file mode 100644 index 000000000..5d5f5054a --- /dev/null +++ b/src/app/shared/NotePending.svelte @@ -0,0 +1,83 @@ + + + + +
+ {#if pub} +
+ {#if isPending} + Publishing... + {total - pendings} of {total} relays + {:else} + Published to {success}/{total} ({failed} failed, {timeout} timed out) + See details + {/if} + {:else} + Sending reply in {event.created_at + $userSettings.undo_delay - $timestamp1} seconds + + + {/if} +
diff --git a/src/app/shared/NoteReply.svelte b/src/app/shared/NoteReply.svelte index 5412e5f8e..77510e0fc 100644 --- a/src/app/shared/NoteReply.svelte +++ b/src/app/shared/NoteReply.svelte @@ -18,8 +18,7 @@ import {publish, tagsFromContent, getClientTags, signAndPublish} from "src/engine" export let parent - export let addToContext - export let addDraftStatus + export let addDraftToContext export let showBorder = false export let forceOpen = false @@ -105,8 +104,8 @@ const template = createEvent(1, {content, tags}) const event = await sign(template, {anonymous: false}) - console.log("event", event) - addToContext({...event, id: "draft"}) + let canceled = false + addDraftToContext(event, () => (canceled = true)) isOpen = false setTimeout(async () => { const {pubs, events} = await signAndPublish(template, opts) @@ -117,7 +116,7 @@ // showPublishInfo(pubs[0]) clearDraft() reset() - }, 5000) + }, $userSettings.undo_delay * 1000) } const onBodyClick = e => { diff --git a/src/app/views/NoteCreate.svelte b/src/app/views/NoteCreate.svelte index 7c8bd5c3f..839945b91 100644 --- a/src/app/views/NoteCreate.svelte +++ b/src/app/views/NoteCreate.svelte @@ -144,6 +144,7 @@ showInfo("", {type: "delay", onCancel: () => (cancel = true)}) + router.clearModals() setTimeout(async () => { if (cancel) return const pub = await signAndPublish(template, opts) From d7a6777cf4a73749a1fff46bc70d5fef0f62b491 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Wed, 6 Nov 2024 12:09:55 +0100 Subject: [PATCH 03/20] remove note state from event object --- src/app/shared/Note.svelte | 25 ++++++++++++------------- src/app/shared/NotePending.svelte | 8 +++----- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/app/shared/Note.svelte b/src/app/shared/Note.svelte index d03d16343..6897aee7f 100644 --- a/src/app/shared/Note.svelte +++ b/src/app/shared/Note.svelte @@ -30,6 +30,7 @@ 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 {router} from "src/app/util/router" import { env, @@ -42,8 +43,6 @@ sortEventsDesc, } from "src/engine" - import NotePending from "./NotePending.svelte" - export let note export let relays = [] export let filters = null @@ -52,6 +51,8 @@ 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 @@ -66,6 +67,8 @@ let collapsed = depth === 0 let context = repository.query([{"#e": [event.id]}]).filter(e => isChildOf(e, event)) let showHiddenReplies = anchor === getIdOrAddress(event) + let draftEventId: string + let removeDraft: () => void const showEntire = showHiddenReplies const interactive = !anchor || !showEntire @@ -103,16 +106,12 @@ .open() const removeFromContext = e => { - console.log("remove from context", e) context = reject(whereEq({id: e.id}), context) } const addDraftToContext = (event, cb) => { - event.status = "draft" - event.remove = () => { - cb() - removeFromContext(event) - } + draftEventId = event.id + removeDraft = () => cb() && removeFromContext(event) context = context.concat(event) } @@ -133,8 +132,6 @@ // Sort our replies $: replies = sortEventsDesc(children.filter(e => replyKinds.includes(e.kind))) - $: console.log(children, replies) - let mutedReplies, hiddenReplies, visibleReplies $: { @@ -151,7 +148,7 @@ !showHiddenReplies && filters && !matchFilters(filters, e) && - e.status !== "draft" + draftEventId !== e.id ) { hiddenReplies.push(e) } else { @@ -302,7 +299,7 @@ {/if}
- {#if event.status !== "draft" || event.created_at < $timestamp1 - 45} + {#if !isDraft || event.created_at < $timestamp1 - 45} {:else} - + {/if}
@@ -391,6 +388,8 @@ isLastReply={i === visibleReplies.length - 1} showParent={false} showHidden + isDraft={r.id === draftEventId} + removeDraftCb={removeDraft} note={r} depth={depth - 1} {filters} diff --git a/src/app/shared/NotePending.svelte b/src/app/shared/NotePending.svelte index 5d5f5054a..fe028c345 100644 --- a/src/app/shared/NotePending.svelte +++ b/src/app/shared/NotePending.svelte @@ -28,10 +28,8 @@ import {timestamp1} from "src/util/misc" import {spring} from "svelte/motion" - export let event: SignedEvent & { - status: string - remove: () => void - } + export let event: SignedEvent + export let removeDraft: () => void $: pub = Object.values($publishes).find(p => p.request.event.id === event.id) @@ -77,7 +75,7 @@ {/if} From 5c925294e8ba209ded4eb26cba29b982cb3c5b13 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Wed, 6 Nov 2024 12:10:15 +0100 Subject: [PATCH 04/20] clearInterval on store --- src/util/misc.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/util/misc.ts b/src/util/misc.ts index bd372a45d..04350a592 100644 --- a/src/util/misc.ts +++ b/src/util/misc.ts @@ -7,9 +7,10 @@ import Fuse from "fuse.js" import logger from "src/util/logger" export const timestamp1: Readable = derived([], (_, set) => { - setInterval(() => { + const interval = setInterval(() => { set(Math.floor(Date.now() / 1000)) }, 1000) + return () => clearInterval(interval) }) export const secondsToDate = ts => new Date(parseInt(ts) * 1000) From a08831908aea9bad0dd2e9174147ad9571654f3b Mon Sep 17 00:00:00 2001 From: Ticruz Date: Wed, 6 Nov 2024 16:26:16 +0100 Subject: [PATCH 05/20] format and check --- .husky/pre-commit | 2 +- src/app/shared/Note.svelte | 2 +- src/app/shared/NotePending.svelte | 4 ++-- src/partials/Toast.svelte | 6 +----- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 0ad376d97..ae18f3c86 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -npm run check +npm run format && npm run check diff --git a/src/app/shared/Note.svelte b/src/app/shared/Note.svelte index 6897aee7f..2906d9278 100644 --- a/src/app/shared/Note.svelte +++ b/src/app/shared/Note.svelte @@ -12,7 +12,7 @@ ZAP_RESPONSE, getAncestorTagValues, } from "@welshman/util" - import {repository, deriveZapperForPubkey, deriveZapper, session} from "@welshman/app" + import {repository, deriveZapperForPubkey, deriveZapper} from "@welshman/app" import {identity, reject, whereEq, uniqBy, prop} from "ramda" import {onMount} from "svelte" import {quantify, batch} from "hurdak" diff --git a/src/app/shared/NotePending.svelte b/src/app/shared/NotePending.svelte index fe028c345..9c66149bd 100644 --- a/src/app/shared/NotePending.svelte +++ b/src/app/shared/NotePending.svelte @@ -23,7 +23,7 @@ + +
+ Published to {total - pending}/{total} relays. + View details +
diff --git a/src/partials/Toast.svelte b/src/partials/Toast.svelte index c92da02fd..a7205bc28 100644 --- a/src/partials/Toast.svelte +++ b/src/partials/Toast.svelte @@ -1,6 +1,6 @@ {#if $toast} - {#key "key"} + {#key $toast.id}
$toast.onCancel() && toast.set(null)}>Cancel {:else if $toast.type === "publish"} - {@const {status, request} = $toast.pub} - {@const total = request.relays.length} - {@const pending = Array.from(status.values()).filter(s => s === "pending").length} - Published to {total - pending}/{total} relays. - View details + {/if}
toast.set(null)}> From c901f533e79836f33d1c0064190b36a87909f6b3 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Mon, 11 Nov 2024 19:25:08 +0100 Subject: [PATCH 09/20] use thunks in replies --- src/app/shared/NotePending.svelte | 26 +++++++++++++++----------- src/app/shared/NoteReply.svelte | 17 ++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/app/shared/NotePending.svelte b/src/app/shared/NotePending.svelte index 9c66149bd..1f93cd1bc 100644 --- a/src/app/shared/NotePending.svelte +++ b/src/app/shared/NotePending.svelte @@ -22,8 +22,9 @@
- {#if pub} + {#if thunk && (isPending || isCompleted)}
{#if isPending} Publishing... diff --git a/src/app/shared/NoteReply.svelte b/src/app/shared/NoteReply.svelte index 77510e0fc..287d8adae 100644 --- a/src/app/shared/NoteReply.svelte +++ b/src/app/shared/NoteReply.svelte @@ -104,19 +104,18 @@ const template = createEvent(1, {content, tags}) const event = await sign(template, {anonymous: false}) - let canceled = false - addDraftToContext(event, () => (canceled = true)) + const thunk = publish({ + event, + relays: ctx.app.router.PublishEvent(event).getUrls(), + delay: $userSettings.undo_delay * 1000, + }) + addDraftToContext(event, () => thunk.controller.abort()) isOpen = false - setTimeout(async () => { - const {pubs, events} = await signAndPublish(template, opts) - console.log("pubs", pubs, events) - addDraftStatus(events[0]) - // Only track one event/pub to avoid apprent duplicates - // showPublishInfo(pubs[0]) + thunk.result.then(() => { clearDraft() reset() - }, $userSettings.undo_delay * 1000) + }) } const onBodyClick = e => { From 85566a58be936cfd9b7bd200896e4a6867fb3703 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Mon, 11 Nov 2024 21:32:08 +0100 Subject: [PATCH 10/20] migrate from publishes --- src/app/MenuDesktop.svelte | 12 ++++---- src/app/shared/PublishCard.svelte | 49 ++++++++++++++++++------------- src/app/views/Publishes.svelte | 31 +++++++++---------- src/engine/state.ts | 2 +- 4 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/app/MenuDesktop.svelte b/src/app/MenuDesktop.svelte index 3c7b9459c..40b55a760 100644 --- a/src/app/MenuDesktop.svelte +++ b/src/app/MenuDesktop.svelte @@ -1,6 +1,6 @@ {#await promise} @@ -50,7 +57,7 @@
- Kind {event.kind}, published {formatTimestamp(pub.created_at)} + Kind {event.kind}, published {formatTimestamp(thunk.event.created_at)} open(event)}>View Note
diff --git a/src/app/views/Publishes.svelte b/src/app/views/Publishes.svelte index a1b944d18..8c5155ad8 100644 --- a/src/app/views/Publishes.svelte +++ b/src/app/views/Publishes.svelte @@ -1,36 +1,37 @@ diff --git a/src/partials/Toast.svelte b/src/partials/Toast.svelte index a7205bc28..8126782a6 100644 --- a/src/partials/Toast.svelte +++ b/src/partials/Toast.svelte @@ -1,6 +1,6 @@
From 48fca1ab760ba8c14ebd102319cffacb0cd846af Mon Sep 17 00:00:00 2001 From: Ticruz Date: Tue, 19 Nov 2024 15:13:32 +0100 Subject: [PATCH 17/20] sign event before sending --- src/app/views/NoteCreate.svelte | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app/views/NoteCreate.svelte b/src/app/views/NoteCreate.svelte index b46566090..b06218ab0 100644 --- a/src/app/views/NoteCreate.svelte +++ b/src/app/views/NoteCreate.svelte @@ -31,7 +31,7 @@ import {router} from "src/app/util/router" import {dateToSeconds} from "src/util/misc" import {currencyOptions} from "src/util/i18n" - import {getClientTags, publish, tagsFromContent, userSettings} from "src/engine" + import {getClientTags, publish, sign, tagsFromContent, userSettings} from "src/engine" export let type = "note" export let quote = null @@ -140,11 +140,15 @@ ], }), }) + + const signedTemplate = await sign(template) + const thunk = publish({ - event: template, + event: signedTemplate, relays: ctx.app.router.PublishEvent(template).getUrls(), delay: $userSettings.send_delay, }) + if ($userSettings.send_delay > 0) { showToast({ type: "delay", From 46f17962d259d15c46141978d8419ea1c26f9e1f Mon Sep 17 00:00:00 2001 From: Ticruz Date: Tue, 19 Nov 2024 15:14:30 +0100 Subject: [PATCH 18/20] delay configuration in seconds --- src/app/views/UserSettings.svelte | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/app/views/UserSettings.svelte b/src/app/views/UserSettings.svelte index a4edb2dc0..e042bffe7 100644 --- a/src/app/views/UserSettings.svelte +++ b/src/app/views/UserSettings.svelte @@ -13,11 +13,12 @@ import SearchSelect from "src/partials/SearchSelect.svelte" import {fuzzy} from "src/util/misc" import Select from "src/partials/Select.svelte" + import {pluralize} from "hurdak" - const values = {...$userSettings} + const values = {...$userSettings, send_delay: $userSettings.send_delay / 1000} const submit = () => { - publishSettings(values) + publishSettings({...values, send_delay: values.send_delay * 1000}) showInfo("Your settings have been saved!") } @@ -58,9 +59,9 @@
Send Delay -
{values.send_delay} ms
+
{values.send_delay} {pluralize(values.send_delay, "second")}
- +

A delay period allowing you to cancel a reply or note creation, in seconds.

From 75457aeee02862a5764faac927b04ba12daa7990 Mon Sep 17 00:00:00 2001 From: Ticruz Date: Tue, 19 Nov 2024 15:16:02 +0100 Subject: [PATCH 19/20] remove grouphints store --- src/engine/state.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/engine/state.ts b/src/engine/state.ts index 8a40ad94d..7519fbc59 100644 --- a/src/engine/state.ts +++ b/src/engine/state.ts @@ -158,7 +158,6 @@ export const hasNip44 = derived(signer, $signer => Boolean($signer?.nip44)) // Base state export const anonymous = withGetter(writable({follows: [], relays: []})) -export const groupHints = withGetter(writable>({})) export const projections = new Worker({ getKey: prop("kind"), From 1ea380cf1cb26157fd811a9cf221ae8437fa425e Mon Sep 17 00:00:00 2001 From: Ticruz Date: Tue, 19 Nov 2024 15:36:32 +0100 Subject: [PATCH 20/20] loading indicator until event is signed --- src/app/views/NoteCreate.svelte | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/app/views/NoteCreate.svelte b/src/app/views/NoteCreate.svelte index b06218ab0..f46742948 100644 --- a/src/app/views/NoteCreate.svelte +++ b/src/app/views/NoteCreate.svelte @@ -41,6 +41,7 @@ let charCount: Writable let wordCount: Writable let showPreview = false + let signaturePending = false let editor: Editor let element: HTMLElement @@ -70,6 +71,7 @@ } const onSubmit = async ({skipNsecWarning = false} = {}) => { + signaturePending = true // prevent sending before media are uploaded and tags are correctly set if ($loading) return @@ -143,6 +145,8 @@ const signedTemplate = await sign(template) + signaturePending = false + const thunk = publish({ event: signedTemplate, relays: ctx.app.router.PublishEvent(template).getUrls(), @@ -313,8 +317,18 @@
- Send + + {#if signaturePending} + + {:else} + Send + {/if} +