From fa1211a2fd80d2d5afec444d04252d442cb12a68 Mon Sep 17 00:00:00 2001 From: Jonathan Staab Date: Fri, 21 Apr 2023 11:12:36 -0500 Subject: [PATCH] Factor out NoteZap from NoteActions --- src/app/Modal.svelte | 3 + src/app/shared/Note.svelte | 1 - src/app/shared/NoteActions.svelte | 118 +----------------------------- src/app/views/NoteZap.svelte | 118 ++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+), 116 deletions(-) create mode 100644 src/app/views/NoteZap.svelte diff --git a/src/app/Modal.svelte b/src/app/Modal.svelte index 44f09f0a..5aa04ecc 100644 --- a/src/app/Modal.svelte +++ b/src/app/Modal.svelte @@ -11,6 +11,7 @@ import LoginPubKey from "src/app/views/LoginPubKey.svelte" import Onboarding from "src/app/views/Onboarding.svelte" import NoteCreate from "src/app/views/NoteCreate.svelte" + import NoteZap from "src/app/views/NoteZap.svelte" import NoteDetail from "src/app/views/NoteDetail.svelte" import PersonFeed from "src/app/views/PersonFeed.svelte" import PersonList from "src/app/shared/PersonList.svelte" @@ -39,6 +40,8 @@ {/key} {:else if m.type === "note/create"} + {:else if m.type === "note/zap"} + {:else if m.type === "relay/add"} {:else if m.type === "onboarding"} diff --git a/src/app/shared/Note.svelte b/src/app/shared/Note.svelte index 0788b3a7..06f9da96 100644 --- a/src/app/shared/Note.svelte +++ b/src/app/shared/Note.svelte @@ -111,7 +111,6 @@ return () => { clearInterval(interval) - actions.cleanupZap() } }) diff --git a/src/app/shared/NoteActions.svelte b/src/app/shared/NoteActions.svelte index ff6191cb..3e9d6988 100644 --- a/src/app/shared/NoteActions.svelte +++ b/src/app/shared/NoteActions.svelte @@ -3,29 +3,22 @@ import {nip19} from "nostr-tools" import {tweened} from "svelte/motion" import {find, reject, identity, propEq, pathEq, sum, pluck, sortBy} from "ramda" - import {warn} from "src/util/logger" import {copyToClipboard} from "src/util/html" - import {stringToHue, fetchJson, now, formatSats, hsl} from "src/util/misc" - import {displayRelay, isLike, displayPerson, processZaps} from "src/util/nostr" + import {stringToHue, formatSats, hsl} from "src/util/misc" + import {displayRelay, isLike, processZaps} from "src/util/nostr" import {quantify, first} from "hurdak/lib/hurdak" import {toast, modal} from "src/partials/state" import Popover from "src/partials/Popover.svelte" - import QRCode from "src/partials/QRCode.svelte" import Content from "src/partials/Content.svelte" import Modal from "src/partials/Modal.svelte" - import Anchor from "src/partials/Anchor.svelte" import OverflowMenu from "src/partials/OverflowMenu.svelte" import CopyValue from "src/partials/CopyValue.svelte" import PersonBadge from "src/app/shared/PersonBadge.svelte" - import Input from "src/partials/Input.svelte" - import Textarea from "src/partials/Textarea.svelte" import RelayCard from "src/app/shared/RelayCard.svelte" import {getEventPublishRelays} from "src/agent/relays" import {getPersonWithFallback} from "src/agent/db" - import network from "src/agent/network" import pool from "src/agent/pool" import user from "src/agent/user" - import keys from "src/agent/keys" import cmd from "src/agent/cmd" export let note @@ -66,78 +59,11 @@ } const startZap = () => { - draftZap = { - amount: user.getSetting("defaultZap"), - message: "", - invoice: null, - loading: false, - startedAt: now(), - confirmed: false, - } - } - - const loadZapInvoice = async () => { - draftZap.loading = true - - const {zapper, lnurl} = $author - const amount = draftZap.amount * 1000 - const relays = getEventPublishRelays(note) - const urls = pluck("url", relays) - const publishable = cmd.requestZap(urls, draftZap.message, note.pubkey, note.id, amount, lnurl) - const event = encodeURI(JSON.stringify(await keys.sign(publishable.event))) - const res = await fetchJson(`${zapper.callback}?amount=${amount}&nostr=${event}&lnurl=${lnurl}`) - - // If they closed the dialog before fetch resolved, we're done - if (!draftZap) { - return - } - - if (!res.pr) { - throw new Error(JSON.stringify(res)) - } - - draftZap.invoice = res.pr - draftZap.loading = false - - // Open up alby or whatever - const {webln} = window as {webln?: any} - if (webln) { - await webln.enable() - - try { - webln.sendPayment(draftZap.invoice) - } catch (e) { - warn(e) - } - } - - // Listen for the zap confirmation - draftZap.sub = network.listen({ - relays, - filter: { - kinds: [9735], - authors: [zapper.nostrPubkey], - "#p": [$author.pubkey], - since: draftZap.startedAt - 10, - }, - onChunk: chunk => { - zap = first(chunk) - draftZap.confirmed = true - setTimeout(cleanupZap, 1000) - }, - }) - } - - export const cleanupZap = () => { - if (draftZap) { - draftZap.sub?.then(s => s.unsub()) - draftZap = null - } + modal.push({type: "note/zap", note}) } let like, likes, allLikes, zap, zaps, allZaps let actions = [] - let draftZap = null let showDetails = false $: disableActions = !$canPublish || muted @@ -250,44 +176,6 @@ -{#if draftZap} - - -
-

Send a zap

-

to {displayPerson($author)}

-
- {#if draftZap.confirmed} -
- -

Success! Zap confirmed.

-
- {:else if draftZap.invoice} - -

- Copy or scan using a lightning wallet to pay your zap. -

-
- - Waiting for confirmation... -
- {:else} -