diff --git a/src/app/commands.ts b/src/app/commands.ts index f351250b..64d42377 100644 --- a/src/app/commands.ts +++ b/src/app/commands.ts @@ -466,27 +466,34 @@ export type AlertParams = { email: string relay: string filters: Filter[] + bunker: string + secret: string } -export const makeAlert = async ({cron, email, relay, filters}: AlertParams) => { - const handler = - "31990:97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322:1737058597050" - const handlerRelay = "wss://relay.nostr.band/" +export const makeAlert = async ({cron, email, relay, filters, bunker, secret}: AlertParams) => { + const tags = [ + ["cron", cron], + ["email", email], + ["relay", relay], + ["channel", "email"], + [ + "handler", + "31990:97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322:1737058597050", + "wss://relay.nostr.band/", + "web", + ], + ] + + for (const filter of unionFilters(filters)) { + tags.push(["filter", JSON.stringify(filter)]) + } + + if (bunker) { + tags.push(["nip46", secret, bunker]) + } return createEvent(ALERT, { - content: await signer - .get() - .nip44.encrypt( - NOTIFIER_PUBKEY, - JSON.stringify([ - ["cron", cron], - ["email", email], - ["relay", relay], - ["channel", "email"], - ["handler", handler, handlerRelay, "web"], - ...unionFilters(filters).map(filter => ["filter", JSON.stringify(filter)]), - ]), - ), + content: await signer.get().nip44.encrypt(NOTIFIER_PUBKEY, JSON.stringify(tags)), tags: [ ["d", randomId()], ["p", NOTIFIER_PUBKEY], diff --git a/src/app/components/AlertAdd.svelte b/src/app/components/AlertAdd.svelte index 53b6ef70..8f313c89 100644 --- a/src/app/components/AlertAdd.svelte +++ b/src/app/components/AlertAdd.svelte @@ -3,6 +3,7 @@ import {randomInt} from "@welshman/lib" import {displayRelayUrl, THREAD, MESSAGE, EVENT_TIME, COMMENT} from "@welshman/util" import type {Filter} from "@welshman/util" + import type {Nip46ResponseWithResult} from "@welshman/signer" import {pubkey} from "@welshman/app" import Icon from "@lib/components/Icon.svelte" import Button from "@lib/components/Button.svelte" @@ -10,11 +11,13 @@ import Spinner from "@lib/components/Spinner.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" + import InfoBunker from "@app/components/InfoBunker.svelte" + import BunkerConnect, {BunkerConnectController} from "@app/components/BunkerConnect.svelte" import {GENERAL, getMembershipUrls, getMembershipRoomsByUrl, userMembership} from "@app/state" import {loadAlertStatuses} from "@app/requests" import {publishAlert} from "@app/commands" import {pushToast} from "@app/toast" - + import {pushModal} from "@app/modal" const timezone = new Date() .toString() .match(/GMT[^\s]+/)![0] @@ -29,12 +32,36 @@ let cron = WEEKLY let email = "" let relay = "" + let bunker = "" + let secret = "" let notifyThreads = true let notifyCalendar = true let notifyChat = false + let showBunker = false const back = () => history.back() + const controller = new BunkerConnectController({ + onNostrConnect: (response: Nip46ResponseWithResult) => { + bunker = controller.broker.getBunkerUrl() + secret = controller.broker.params.clientSecret + showBunker = false + }, + }) + + const connectBunker = () => { + showBunker = true + } + + const hideBunker = () => { + showBunker = false + } + + const clearBunker = () => { + bunker = "" + secret = "" + } + const submit = async () => { if (!email.includes("@")) { return pushToast({ @@ -79,7 +106,7 @@ loading = true try { - const thunk = await publishAlert({cron, email, relay, filters}) + const thunk = await publishAlert({cron, email, relay, filters, bunker, secret}) await thunk.result await loadAlertStatuses($pubkey!) @@ -98,67 +125,100 @@ Add an Alert {/snippet} - - {#snippet label()} -

Email Address*

- {/snippet} - {#snippet input()} - - {/snippet} -
- - {#snippet label()} -

Frequency*

- {/snippet} - {#snippet input()} - - {/snippet} -
- - {#snippet label()} -

Space*

- {/snippet} - {#snippet input()} - - {/snippet} -
- - {#snippet label()} -

Notifications*

- {/snippet} - {#snippet input()} -
- - - Threads - - - - Calendar - - - - Chat + {#if showBunker} +
+

Scan using a nostr signer, or click to copy.

+ + +
+ {:else} + + {#snippet label()} +

Email Address*

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ + {#snippet label()} +

Frequency*

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ + {#snippet label()} +

Space*

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ + {#snippet label()} +

Notifications*

+ {/snippet} + {#snippet input()} +
+ + + Threads + + + + Calendar + + + + Chat + +
+ {/snippet} +
+
+
+ Connect a Bunker + + {#if bunker} + + Connected + {:else} + + Not Connected + {/if}
- {/snippet} - +

+ Required for receiving alerts about spaces with access controls. You can get one from your + . +

+ {#if bunker} + + {:else} + + {/if} +
+ {/if} - diff --git a/src/app/components/Alerts.svelte b/src/app/components/Alerts.svelte index 75e80e49..69da8795 100644 --- a/src/app/components/Alerts.svelte +++ b/src/app/components/Alerts.svelte @@ -1,12 +1,20 @@
diff --git a/src/app/components/BunkerConnect.svelte b/src/app/components/BunkerConnect.svelte new file mode 100644 index 00000000..def39b50 --- /dev/null +++ b/src/app/components/BunkerConnect.svelte @@ -0,0 +1,78 @@ + + + + +{#if controller.url} +
+ +
+{/if} diff --git a/src/app/components/BunkerUrl.svelte b/src/app/components/BunkerUrl.svelte new file mode 100644 index 00000000..2d5fd0ca --- /dev/null +++ b/src/app/components/BunkerUrl.svelte @@ -0,0 +1,32 @@ + + + + {#snippet label()} +

Bunker Link*

+ {/snippet} + {#snippet input()} + + {/snippet} + {#snippet info()} +

+ A login link provided by a nostr signing app. + +

+ {/snippet} +
diff --git a/src/app/components/LogInBunker.svelte b/src/app/components/LogInBunker.svelte index 365f9b80..5c152cc7 100644 --- a/src/app/components/LogInBunker.svelte +++ b/src/app/components/LogInBunker.svelte @@ -1,112 +1,34 @@ @@ -132,35 +92,18 @@
Connect your signer by scanning the QR code below or pasting a bunker link.
{/snippet} - {#if !loading && url} -
- -
- {/if} - - {#snippet label()} -

Bunker Link*

- {/snippet} - {#snippet input()} - - {/snippet} - {#snippet info()} -

- A login link provided by a nostr signing app. - -

- {/snippet} -
+ + - -