problem: users can't provide email address or npub for notifications

This commit is contained in:
Bob
2024-08-05 22:13:56 +08:00
parent 61c92015ac
commit 31005a9473
5 changed files with 125 additions and 23 deletions

View File

@@ -35,7 +35,6 @@
} }
const e = prepareMeritNoteEvent({ const e = prepareMeritNoteEvent({
ndk, ndk,
author,
merit, merit,
content content
}); });

View File

@@ -1,21 +1,114 @@
<script lang="ts"> <script lang="ts">
import * as Dialog from '$lib/components/ui/dialog/index.js'; import * as Dialog from '$lib/components/ui/dialog/index.js';
import { Badge } from '@/components/ui/badge'; import { Badge } from '@/components/ui/badge';
import Button from '@/components/ui/button/button.svelte';
import Input from '@/components/ui/input/input.svelte';
import Label from '@/components/ui/label/label.svelte';
import Separator from '@/components/ui/separator/separator.svelte';
import { ndk } from '@/ndk';
import { prepareEncryptedDirectMessageEvent } from '@/helpers';
import { currentUser } from '@/stores/session';
import Login from './Login.svelte';
import { NDKPrivateKeySigner, NDKUser } from '@nostr-dev-kit/ndk';
let open = false; let email: string;
$: emailInValid = true;
$: emailError = '';
const emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;
$: if (email) {
if (!emailRegex.test(email)) {
emailInValid = true;
emailError = 'Email is invalid';
} else {
emailInValid = false;
emailError = '';
}
}
async function Subscribe() {
const error = await publishEncryptedDirectMessage(
`Please send me a direct message when Nostrocket updates. (Sent by Nostrocket)`
);
if (error instanceof Error) {
console.error(error);
}
open = false;
}
async function SubmitEmailAndSubscribe() {
const error = await publishEncryptedDirectMessage(
`Please notify me via email when Nostrocket updates. My email address is ${email}. (Sent by Nostrocket)`
);
if (error instanceof Error) {
console.error(error);
}
open = false;
}
async function publishEncryptedDirectMessage(content: string) {
const RECEIVER = new NDKUser({
pubkey: 'd91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075'
});
const originalSigner = $ndk.signer;
if (!$currentUser) {
$ndk.signer = NDKPrivateKeySigner.generate();
}
const event = await prepareEncryptedDirectMessageEvent({
ndk: $ndk,
receiver: RECEIVER,
content
});
if (event instanceof Error) {
return event;
}
const publishResult = await event.publish();
console.log(publishResult);
if (!$currentUser) {
$ndk.signer = originalSigner;
}
}
let open = false;
</script> </script>
<Dialog.Root bind:open> <Dialog.Root bind:open>
<Dialog.Trigger <Dialog.Trigger>
><Badge href="#" variant="nostr" class="flex h-8 shrink-0 items-center justify-center rounded-sm">Nostrocket is sooooo not ready yet but whatever</Badge></Dialog.Trigger <Badge
> href="#"
variant="nostr"
class="flex h-8 shrink-0 items-center justify-center rounded-sm"
>
Tell me via DM when there are updates
</Badge>
</Dialog.Trigger>
<Dialog.Content> <Dialog.Content>
<Dialog.Header> <Dialog.Header>
<Dialog.Title>Nostrocket is a work in progress</Dialog.Title> <Dialog.Title>Subscribe for Updates</Dialog.Title>
<Dialog.Description <Dialog.Description>
>It kind of works, but there's a lot more to do. There will be bugs.</Dialog.Description Receive notifications about Nostrocket updates via Nostr DM or email.
> </Dialog.Description>
<div class="flex flex-col gap-4 py-4">
{#if $currentUser}
<Button on:click={Subscribe}>Reveive DM</Button>
{:else}
<Login />
{/if}
<Separator />
<div class="grid grid-cols-4 items-center gap-4">
<Label for="email" class="text-right">Email</Label>
<Input bind:value={email} id="email" placeholder="Your email" class="col-span-3" />
</div>
{#if emailError}
<div class="ml-4 p-0 text-sm text-red-500">{emailError}</div>
{/if}
</div>
<Button disabled={emailInValid} on:click={SubmitEmailAndSubscribe}>Reveive Email</Button>
</Dialog.Header> </Dialog.Header>
</Dialog.Content> </Dialog.Content>
</Dialog.Root> </Dialog.Root>

View File

@@ -25,7 +25,6 @@
} }
prepareMeritVoteEvent({ prepareMeritVoteEvent({
ndk, ndk,
author,
rocket, rocket,
merit, merit,
direction direction
@@ -35,10 +34,9 @@
console.log(x); console.log(x);
}); });
if (direction === 'ratify') { if (direction === 'ratify') {
let content = `I've voted to ratify your merit request! ${merit.Problem()} \n\n ${merit.Solution()?merit.Solution():""}`; let content = `I've voted to ratify your merit request! ${merit.Problem()} \n\n ${merit.Solution() ? merit.Solution() : ''}`;
prepareMeritNoteEvent({ prepareMeritNoteEvent({
ndk, ndk,
author,
merit, merit,
content content
}) })

View File

@@ -343,14 +343,13 @@ function pubkeyLatestVote(votes: Votes) {
export function prepareMeritNoteEvent(args: { export function prepareMeritNoteEvent(args: {
ndk: NDKSvelte; ndk: NDKSvelte;
author: NDKUser;
merit: MeritRequest; merit: MeritRequest;
content: string; content: string;
}) { }) {
const tags = [ const tags = [
['p', args.merit.Pubkey], ['p', args.merit.Pubkey],
['e', args.merit.ID, "wss://relay.nostrocket.org", 'reply'], ['e', args.merit.ID, 'wss://relay.nostrocket.org', 'reply'],
args.merit.RocketTag?['a', args.merit.RocketTag]:[], args.merit.RocketTag ? ['a', args.merit.RocketTag] : []
]; ];
return prepareNostrEvent({ return prepareNostrEvent({
...args, ...args,
@@ -361,7 +360,6 @@ export function prepareMeritNoteEvent(args: {
export function prepareMeritVoteEvent(args: { export function prepareMeritVoteEvent(args: {
ndk: NDKSvelte; ndk: NDKSvelte;
author: NDKUser;
rocket: Rocket; rocket: Rocket;
merit: MeritRequest; merit: MeritRequest;
direction: string; direction: string;

View File

@@ -1,4 +1,4 @@
import { NDKZap, NDKEvent, type NDKKind, type NDKTag, type NDKUser } from '@nostr-dev-kit/ndk'; import { NDKKind, NDKZap, NDKEvent, NDKUser, type NDKTag } from '@nostr-dev-kit/ndk';
import type NDKSvelte from '@nostr-dev-kit/ndk-svelte'; import type NDKSvelte from '@nostr-dev-kit/ndk-svelte';
import { QrCode } from '$lib/qrcodegen'; import { QrCode } from '$lib/qrcodegen';
@@ -19,8 +19,6 @@ export function getRocketURL(e: NDKEvent): string {
return `${ignitionID}?d=${d}&p=${p}`; return `${ignitionID}?d=${d}&p=${p}`;
} }
export function unixTimeNow() { export function unixTimeNow() {
return Math.floor(new Date().getTime() / 1000); return Math.floor(new Date().getTime() / 1000);
} }
@@ -166,15 +164,12 @@ export async function getAuthorizedZapper(rocket: NDKEvent): Promise<string> {
export function prepareNostrEvent(args: { export function prepareNostrEvent(args: {
ndk: NDKSvelte; ndk: NDKSvelte;
author: NDKUser;
kind: NDKKind; kind: NDKKind;
content: string; content: string;
tags?: NDKTag[]; tags?: NDKTag[];
}) { }) {
let e = new NDKEvent(args.ndk); let e = new NDKEvent(args.ndk);
e.author = args.author;
e.kind = args.kind; e.kind = args.kind;
e.created_at = Math.floor(new Date().getTime() / 1000);
e.content = args.content; e.content = args.content;
if (args.tags) { if (args.tags) {
e.tags = args.tags; e.tags = args.tags;
@@ -183,6 +178,25 @@ export function prepareNostrEvent(args: {
return e; return e;
} }
export async function prepareEncryptedDirectMessageEvent(args: {
ndk: NDKSvelte;
receiver: NDKUser;
content: string;
}) {
const signer = args.ndk.signer;
if (!signer) {
return new Error('no signer');
}
const tags = [['p', args.receiver.pubkey]];
const event = prepareNostrEvent({
...args,
kind: NDKKind.EncryptedDirectMessage,
tags
});
await event.encrypt(args.receiver, signer);
return event;
}
export function drawSvgPath(qr: QrCode, border: number): string { export function drawSvgPath(qr: QrCode, border: number): string {
if (border < 0) throw new RangeError('Border must be non-negative'); if (border < 0) throw new RangeError('Border must be non-negative');
let parts: Array<string> = []; let parts: Array<string> = [];