import { webln } from "@getalby/sdk"; import { type SendPaymentResponse } from "@getalby/sdk/dist/types"; import { CancelIcon, LoaderIcon, ZapIcon } from "@lume/icons"; import { useStorage } from "@lume/storage"; import { cn, compactNumber, displayNpub } from "@lume/utils"; import * as Dialog from "@radix-ui/react-dialog"; import * as Tooltip from "@radix-ui/react-tooltip"; import { QRCodeSVG } from "qrcode.react"; import { useState } from "react"; import CurrencyInput from "react-currency-input-field"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { useProfile } from "../../../hooks/useProfile"; import { useNoteContext } from "../provider"; export function NoteZap() { const storage = useStorage(); const event = useNoteContext(); const [amount, setAmount] = useState("21"); const [zapMessage, setZapMessage] = useState(""); const [isOpen, setIsOpen] = useState(false); const [isCompleted, setIsCompleted] = useState(false); const [isLoading, setIsLoading] = useState(false); const [invoice, setInvoice] = useState(null); const { t } = useTranslation(); const { user } = useProfile(event.pubkey); const createZapRequest = async (instant?: boolean) => { if (instant && !storage.nwc) return; let nwc: webln.NostrWebLNProvider = undefined; try { // start loading setIsLoading(true); const zapAmount = parseInt(amount) * 1000; const res = await event.zap(zapAmount, zapMessage); if (!storage.nwc) return setInvoice(res); // user connect nwc nwc = new webln.NostrWebLNProvider({ nostrWalletConnectUrl: storage.nwc, }); await nwc.enable(); // send payment via nwc const send: SendPaymentResponse = await nwc.sendPayment(res); if (send) { toast.success( `You've zapped ${compactNumber.format(send.amount)} sats to ${ user?.name || user?.displayName || "anon" }`, ); // reset after 1.5 secs if (!instant) { const timeout = setTimeout(() => setIsCompleted(false), 1500); clearTimeout(timeout); } } // eose nwc.close(); // update state setIsCompleted(true); setIsLoading(false); } catch (e) { nwc?.close(); setIsLoading(false); toast.error(String(e)); } }; if (storage.settings.instantZap) { return ( {t("note.zap.tooltip")} ); } return ( {t("note.zap.tooltip")}
Esc
{t("note.zap.modalTitle")}{" "} {user?.name || user?.displayName || displayNpub(event.pubkey, 16)}
{!invoice ? (
setAmount(value)} className="flex-1 w-full text-4xl font-semibold text-right bg-transparent border-none placeholder:text-neutral-600 focus:outline-none focus:ring-0 dark:text-neutral-400" /> sats
setZapMessage(e.target.value)} spellCheck={false} autoComplete="off" autoCorrect="off" autoCapitalize="off" placeholder={t("note.zap.messagePlaceholder")} className="w-full resize-none rounded-lg border-transparent bg-neutral-100 px-3 py-3 !outline-none placeholder:text-neutral-600 focus:border-blue-500 focus:ring focus:ring-blue-200 dark:bg-neutral-950 dark:text-neutral-400" />
) : (

{t("note.zap.invoiceButton")}

{t("note.zap.invoiceFooter")}
)}
); }