Files
einundzwanzig-verein/resources/js/nostrZap.js

79 lines
2.4 KiB
JavaScript

import NDK, {NDKEvent} from "@nostr-dev-kit/ndk";
import {
nip57,
} from "nostr-tools";
export default (livewireComponent) => ({
invoice: livewireComponent.entangle('invoice', true),
async zap(message, sender, amountToPay, env) {
const config = {
production: {
relayUrl: 'wss://simple-relay.codingarena.top',
},
staging: {
relayUrl: 'wss://simple-test-relay.codingarena.top',
},
local: {
relayUrl: 'wss://simple-test-relay.codingarena.top',
},
};
const relayUrl = config[env]?.relayUrl || config['local'].relayUrl;
const ndk = new NDK({
explicitRelayUrls: [
relayUrl
],
enableOutboxModel: false,
});
// Now connect to specified relays
await ndk.connect();
const event = await ndk.fetchEvent({
kinds: [32121],
authors: ['daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6']
});
const amount = amountToPay * 1000;
console.log('event', event);
// Fetch the callback URL
const callbackResponse = await fetch('https://pay.einundzwanzig.space/BTC/UILNURL/pay/lnaddress/verein');
const callbackData = await callbackResponse.json();
const zapEndpoint = callbackData.callback;
livewireComponent.call('updateZapEndpoint', zapEndpoint);
const zapEvent = nip57.makeZapRequest({
profile: sender,
event: event.id,
amount: amount,
relays: [relayUrl],
comment: message,
});
console.log('zapEvent', zapEvent);
const signedEvent = await window.nostr.signEvent(zapEvent);
console.log('signedEvent', signedEvent);
let url = `${zapEndpoint}?amount=${amount}&nostr=${encodeURIComponent(
JSON.stringify(signedEvent)
)}`;
url = `${url}&comment=${encodeURIComponent(message)}`;
console.log('url', url);
const res = await fetch(url);
const { pr: invoice, reason, status } = await res.json();
if (invoice) {
console.log('invoice', invoice);
this.invoice = invoice;
} else if (status === "ERROR") {
throw new Error(reason ?? "Unable to fetch invoice");
} else {
throw new Error("Other error");
}
},
});