diff options
| author | Adam Soltys <[email protected]> | 2026-07-30 08:51:45 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-07-30 08:51:45 -0700 |
| commit | f884ffabc9afab2d6051379062434fc9e7f61176 (patch) | |
| tree | 5bcfd4ecc7c6cec85e3cd269aecfb4227f406af0 | |
| parent | 2f0e6d052efbca7f695dda942ab7da6221da3aa9 (diff) | |
| download | coinos-ui-f884ffabc9afab2d6051379062434fc9e7f61176.tar.gz coinos-ui-f884ffabc9afab2d6051379062434fc9e7f61176.zip | |
bolt12 zaps: accept offers in send flow, show/publish user offer
- parse lno= from BIP-321 bitcoin: URIs; send page parses offers for
preview now that /parse handles them
- settings/nostr shows the user's standing lno1 offer with copy/QR and a
button to publish it as a kind 10058 offer list for NIP-177 zaps
- new locale strings translated
Co-Authored-By: Claude Fable 5 <[email protected]>
| -rw-r--r-- | src/lib/parse.ts | 4 | ||||
| -rw-r--r-- | src/locales/ar.json | 8 | ||||
| -rw-r--r-- | src/locales/bn.json | 8 | ||||
| -rw-r--r-- | src/locales/de.json | 8 | ||||
| -rw-r--r-- | src/locales/el.json | 8 | ||||
| -rw-r--r-- | src/locales/en.json | 5 | ||||
| -rw-r--r-- | src/locales/es.json | 8 | ||||
| -rw-r--r-- | src/locales/fa.json | 8 | ||||
| -rw-r--r-- | src/locales/fr.json | 8 | ||||
| -rw-r--r-- | src/locales/hi.json | 8 | ||||
| -rw-r--r-- | src/locales/it.json | 8 | ||||
| -rw-r--r-- | src/locales/ja.json | 8 | ||||
| -rw-r--r-- | src/locales/ko.json | 8 | ||||
| -rw-r--r-- | src/locales/nl.json | 10 | ||||
| -rw-r--r-- | src/locales/pl.json | 8 | ||||
| -rw-r--r-- | src/locales/pt.json | 8 | ||||
| -rw-r--r-- | src/locales/ru.json | 8 | ||||
| -rw-r--r-- | src/locales/th.json | 8 | ||||
| -rw-r--r-- | src/locales/tr.json | 8 | ||||
| -rw-r--r-- | src/locales/zh.json | 8 | ||||
| -rw-r--r-- | src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts | 4 | ||||
| -rw-r--r-- | src/routes/(app)/settings/nostr/+page.server.ts | 8 | ||||
| -rw-r--r-- | src/routes/(app)/settings/nostr/+page.svelte | 78 |
23 files changed, 218 insertions, 27 deletions
diff --git a/src/lib/parse.ts b/src/lib/parse.ts index b5b953c2..f41fe78f 100644 --- a/src/lib/parse.ts +++ b/src/lib/parse.ts @@ -14,10 +14,10 @@ export default async (s, host, cookies) => { if (t.startsWith("http")) redirect(307, t); if (t.startsWith(host)) redirect(307, `http://${t}`); - if (t.includes("lightning=")) { + if (t.includes("lightning=") || t.includes("lno=")) { const url = new URL(t); const params = new URLSearchParams(url.search); - t = params.get("lightning"); + t = params.get("lightning") || params.get("lno"); } if (t.startsWith("lightning:")) t = t.replace("lightning:", ""); diff --git a/src/locales/ar.json b/src/locales/ar.json index 8b1e7ddc..c34e142c 100644 --- a/src/locales/ar.json +++ b/src/locales/ar.json @@ -380,7 +380,13 @@ "yourUsername": "إسمك المستخدم", "yourPassword": "وكلمة السر الخاصة بك", "welcome": "مرحباً!", - "clickBelow": "انقروا من هنا لينهيوا حسابكم" + "clickBelow": "انقروا من هنا لينهيوا حسابكم", + "bolt12Offer": "عرض البرق (BOLT12)", + "bolt12OfferDescription": "A reusable payment code for receiving lightning payments and BOLT12 zaps. أضفها إلى قائمة عرض زبونك لـ (بولت 12).", + "continueSettingUp": "إنشاء حساب", + "publishOffer": "النشر إلى نوستر", + "offerPublished": "نُشرت!", + "offerPublishFailed": "عدم نشر العرض" }, "support": { "header": "الدعم", diff --git a/src/locales/bn.json b/src/locales/bn.json index cb262e64..4533dce5 100644 --- a/src/locales/bn.json +++ b/src/locales/bn.json @@ -380,7 +380,13 @@ "yourUsername": "আপনার ব্যবহারকারী নাম", "yourPassword": "আপনার পাসওয়ার্ড হল %s", "welcome": "স্বাগতম!", - "clickBelow": "আপনার অ্যাকাউন্ট সম্পন্ন করার জন্য নীচের ক্লিক করুন" + "clickBelow": "আপনার অ্যাকাউন্ট সম্পন্ন করার জন্য নীচের ক্লিক করুন", + "bolt12Offer": "লাইটিং প্রস্তাব (BO1212)", + "bolt12OfferDescription": "বিদ্যুৎ সরবরাহের জন্য একটি রিসপার কোড এবং BLT12 জিপ। BLTF12 এর জন্য আপনার Nostrer ক্লায়েন্টের তালিকা যোগ করুন।.", + "continueSettingUp": "অ্যাকাউন্ট সেটআপ", + "publishOffer": "চিহ্নিত স্থানে প্রকাশ করুন", + "offerPublished": "প্রকাশিত!", + "offerPublishFailed": "প্রকাশ করতে ব্যর্থ" }, "support": { "header": "সহায়তা", diff --git a/src/locales/de.json b/src/locales/de.json index 03145427..2aaba2f1 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -330,7 +330,13 @@ "yourUsername": "Ihr Benutzername ist", "yourPassword": "und ihr passwort ist", "welcome": "Willkommen!", - "clickBelow": "Klicken Sie unten, um die Einrichtung Ihres Kontos abzuschließen" + "clickBelow": "Klicken Sie unten, um die Einrichtung Ihres Kontos abzuschließen", + "bolt12Offer": "Blitzangebot (BOLT12)", + "bolt12OfferDescription": "Ein wiederverwendbarer Zahlungscode für den Empfang von Blitzzahlungen und BOLT12 Zaps. Fügen Sie es zu der Liste Ihres nostr-Clients hinzu, um über BOLT12 gezappt zu werden.", + "continueSettingUp": "Konto einrichten", + "publishOffer": "Veröffentlichen an nostr", + "offerPublished": "Veröffentlicht!", + "offerPublishFailed": "Das Angebot konnte nicht veröffentlicht werden" }, "support": { "header": "Support", diff --git a/src/locales/el.json b/src/locales/el.json index 8cc3637e..f3ed932e 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -331,7 +331,13 @@ "yourUsername": "Το όνομα χρήστη είναι", "yourPassword": "και ο κωδικός σας είναι", "welcome": "Καλώς ήρθατε!", - "clickBelow": "Κάντε κλικ παρακάτω για να ολοκληρώσετε τη ρύθμιση του λογαριασμού σας" + "clickBelow": "Κάντε κλικ παρακάτω για να ολοκληρώσετε τη ρύθμιση του λογαριασμού σας", + "bolt12Offer": "Προσφορά Lightning (BOLT12)", + "bolt12OfferDescription": "Ένας επαναχρησιμοποιήσιμος κωδικός πληρωμής για τη λήψη αστραπιαίων πληρωμών και BOLT12 zaps. Προσθέστε το στη λίστα προσφοράς του πελάτη σας για να πάρει zapped πάνω από BOLT12.", + "continueSettingUp": "Setup λογαριασμού", + "publishOffer": "Δημοσίευση στη μύτη", + "offerPublished": "Εκδίδεται!", + "offerPublishFailed": "Αποτυχία δημοσίευσης της προσφοράς" }, "support": { "header": "Υποστήριξη", diff --git a/src/locales/en.json b/src/locales/en.json index 2d5ef646..5b369ef7 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -328,6 +328,11 @@ "nostrDescription": "Your nostr secret key is used to sign and decrypt messages, keep it safe or someone may be able to impersonate you.", "nwc": "Nostr wallet connect (NWC)", "nwcDescription": "Enable nostr apps to send payments from your account", + "bolt12Offer": "Lightning offer (BOLT12)", + "bolt12OfferDescription": "A reusable payment code for receiving lightning payments and BOLT12 zaps. Add it to your nostr client's offer list to get zapped over BOLT12.", + "publishOffer": "Publish to nostr", + "offerPublished": "Published!", + "offerPublishFailed": "Failed to publish offer", "seedDescription": "This 12 word seed phrase is used to derive your nostr private key and your self-custodial wallet keys which determine your auto-withdrawal addresses. Back it up and don't let anyone see it.", "emailDescription": "For password resets and payment notifications", "hideNsec": "Hide nostr secret key", diff --git a/src/locales/es.json b/src/locales/es.json index 664c7471..271a7da6 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -319,7 +319,13 @@ "yourUsername": "Tu nombre de usuario es", "yourPassword": "y su contraseña es", "welcome": "¡Bienvenido!", - "clickBelow": "Haga clic a continuación para terminar de configurar su cuenta" + "clickBelow": "Haga clic a continuación para terminar de configurar su cuenta", + "bolt12Offer": "Oferta de relámpago (BOLT12)", + "bolt12OfferDescription": "Un código de pago reutilizable para recibir pagos de rayos y BOLT12 zaps. Añádelo a la lista de ofertas de tu cliente de la nariz para que te den una paliza.", + "continueSettingUp": "Configuración de la cuenta", + "publishOffer": "Publish to nostr", + "offerPublished": "¡Publicado!", + "offerPublishFailed": "Failed to publish offer" }, "support": { "header": "Soporte", diff --git a/src/locales/fa.json b/src/locales/fa.json index 61659e73..9412ecb9 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -319,7 +319,13 @@ "yourUsername": "نام کاربری شما", "yourPassword": "و رمز عبور شما", "welcome": "خوش آمدید!", - "clickBelow": "در زیر کلیک کنید تا حساب خود را تنظیم کنید" + "clickBelow": "در زیر کلیک کنید تا حساب خود را تنظیم کنید", + "bolt12Offer": "پیشنهاد رعد و برق (BOLT12)", + "bolt12OfferDescription": "یک کد پرداخت مجدد برای دریافت پرداخت رعد و برق و BOLT12 zaps آن را به لیست پیشنهادی مشتری نو رشته خود اضافه کنید تا در BOLT12 گرفتار شوید.", + "continueSettingUp": "تنظیم حساب", + "publishOffer": "انتشار به Nostr", + "offerPublished": "منتشر شده!", + "offerPublishFailed": "شکست در انتشار پیشنهاد" }, "support": { "header": "حمایت کردن", diff --git a/src/locales/fr.json b/src/locales/fr.json index 7ae6896b..cdfc44c5 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -288,7 +288,13 @@ "yourUsername": "Votre nom d'utilisateur", "yourPassword": "et votre mot de passe est", "welcome": "Bienvenue !", - "clickBelow": "Cliquez ci-dessous pour terminer la configuration de votre compte" + "clickBelow": "Cliquez ci-dessous pour terminer la configuration de votre compte", + "bolt12Offer": "Offre de foudre (BOLT12)", + "bolt12OfferDescription": "Un code de paiement réutilisable pour recevoir les paiements par foudre et BOLT12 zaps. Ajoutez-le à la liste d'offres de votre client nostra pour vous faire zapper sur BOLT12.", + "continueSettingUp": "Configuration du compte", + "publishOffer": "Publier sur nosr", + "offerPublished": "Publié !", + "offerPublishFailed": "Échec de la publication de l'offre" }, "support": { "header": "Assistance", diff --git a/src/locales/hi.json b/src/locales/hi.json index 5baa6e3a..1b32f421 100644 --- a/src/locales/hi.json +++ b/src/locales/hi.json @@ -380,7 +380,13 @@ "yourUsername": "आपका उपयोगकर्ता नाम है", "yourPassword": "आपका पासवर्ड है", "welcome": "स्वागत!", - "clickBelow": "अपने खाते की स्थापना समाप्त करने के लिए नीचे क्लिक करें" + "clickBelow": "अपने खाते की स्थापना समाप्त करने के लिए नीचे क्लिक करें", + "bolt12Offer": "बिजली की पेशकश (BOLT12)", + "bolt12OfferDescription": "बिजली भुगतान और BOLT12 zaps प्राप्त करने के लिए एक पुन: प्रयोज्य भुगतान कोड। इसे BOLT12 पर Zapped होने के लिए अपने नोस्ट्र क्लाइंट की पेशकश सूची में जोड़ें।.", + "continueSettingUp": "खाता सेटअप", + "publishOffer": "Nostr को प्रकाशित करना", + "offerPublished": "प्रकाशित!", + "offerPublishFailed": "प्रस्ताव को प्रकाशित करने में विफल" }, "support": { "header": "समर्थन", diff --git a/src/locales/it.json b/src/locales/it.json index 5886c3bd..e85d3e92 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -380,7 +380,13 @@ "yourUsername": "Il tuo nome utente è", "yourPassword": "e la tua password è", "welcome": "Benvenuto!", - "clickBelow": "Clicca qui sotto per completare l'impostazione del tuo account" + "clickBelow": "Clicca qui sotto per completare l'impostazione del tuo account", + "bolt12Offer": "Offerta fulmine (BOLT12)", + "bolt12OfferDescription": "Un codice di pagamento riutilizzabile per ricevere pagamenti fulmini e zaps BOLT12. Aggiungilo alla lista di offerta del tuo cliente nostr per ottenere zapped oltre BOLT12.", + "continueSettingUp": "Configurazione account", + "publishOffer": "Pubblica a nostr", + "offerPublished": "Pubblicato!", + "offerPublishFailed": "Non pubblicare l'offerta" }, "support": { "header": "Supporto", diff --git a/src/locales/ja.json b/src/locales/ja.json index 16524a10..96c54217 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -319,7 +319,13 @@ "yourUsername": "あなたのユーザー名は", "yourPassword": "パスワードは", "welcome": "お問い合わせ!", - "clickBelow": "アカウントの設定を完了するには、下記をクリックしてください" + "clickBelow": "アカウントの設定を完了するには、下記をクリックしてください", + "bolt12Offer": "避雷器(BOLT12)", + "bolt12OfferDescription": "落雷支払いとBOLT12 zapsを受信するための再利用可能な支払いコード。 BOLT12 上で zapped を取得するために nostr クライアントのオファーリストに追加します.", + "continueSettingUp": "アカウント設定", + "publishOffer": "Nostr に公開", + "offerPublished": "掲載情報!", + "offerPublishFailed": "オファーを公開できなかった" }, "support": { "header": "サポート", diff --git a/src/locales/ko.json b/src/locales/ko.json index 7e2e25d2..a7a9538c 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -380,7 +380,13 @@ "yourUsername": "사용자 이름", "yourPassword": "비밀번호", "welcome": "제품 정보!", - "clickBelow": "계정 설정하기" + "clickBelow": "계정 설정하기", + "bolt12Offer": "번개 제안 (BOLT12)", + "bolt12OfferDescription": "번개 결제 및 BOLT12 zaps를 수신하기위한 재사용 가능한 지불 코드. nostr 클라이언트의 제안 목록에 추가하여 BOLT12를 통해 zapped를 얻을 수 있습니다.", + "continueSettingUp": "계정 설정", + "publishOffer": "Nostr에 게시", + "offerPublished": "이름 *!", + "offerPublishFailed": "게시 제안에 실패" }, "support": { "header": "지원하다", diff --git a/src/locales/nl.json b/src/locales/nl.json index fcfecf94..65133d4a 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -89,7 +89,7 @@ "header": "Veelgestelde vragen", "cost": { "question": "Wat kost het?", - "answer": "Het ontvangen van betalingen op jouw rekening is gratis. Verzenden naar andere Coinos is gratis. Verzendingen naar externe portemonnees zijn gratis als je hetzelfde netwerk gebruikt waar je van ontvangen hebt. In andere gevallen is er een vergoeding van 0,4% voor Bitcoin en 0,1 voor Lightning of Liquid." + "answer": "Het ontvangen van betalingen op jouw rekening is gratis. Verzenden naar andere Coinos is gratis. Verzendingen naar externe portemonnees zijn gratis als je hetzelfde netwerk gebruikt waar je van ontvangen hebt. In andere gevallen is er een vergoeding van 0,4% voor Bitcoin en 0,1 voor Lightning of Liquid." }, "compatibility": { "question": "Heb ik een speciaal apparaat of software nodig?", @@ -380,7 +380,13 @@ "yourUsername": "Uw gebruikersnaam is:", "yourPassword": "Uw wachtwoord is:", "welcome": "Welkom!", - "clickBelow": "Klik hieronder om het aanmaken van uw account af te ronden" + "clickBelow": "Klik hieronder om het aanmaken van uw account af te ronden", + "bolt12Offer": "Bliksemaanbieding (BOLT12)", + "bolt12OfferDescription": "Een herbruikbare betaalcode voor het ontvangen van bliksem betalingen en BOLT12 zaps. Voeg het toe aan de aanbiedingenlijst van uw nostr-cliënt om over BOLT12 te worden gezapt.", + "continueSettingUp": "Accountinstellingen", + "publishOffer": "Publiceren naar nostr", + "offerPublished": "Gepubliceerd!", + "offerPublishFailed": "Kon aanbod niet publiceren" }, "support": { "header": "Ondersteuning", diff --git a/src/locales/pl.json b/src/locales/pl.json index 05215519..e3529c3d 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -380,7 +380,13 @@ "yourUsername": "Twoja nazwa użytkownika jest", "yourPassword": "twoje hasło jest", "welcome": "Witamy!", - "clickBelow": "Kliknij poniżej, aby skonfigurować konto" + "clickBelow": "Kliknij poniżej, aby skonfigurować konto", + "bolt12Offer": "Oferta błyskawicy (BOLT12)", + "bolt12OfferDescription": "Kod płatności wielokrotnego użytku do otrzymywania płatności błyskawicznych i BOLT12 zaps. Dodaj go do listy ofert klienta nostr, aby dostać zapped nad BOLT12.", + "continueSettingUp": "Konfiguracja konta", + "publishOffer": "Publikuj do nostr", + "offerPublished": "Opublikowane!", + "offerPublishFailed": "Nie udało się opublikować oferty" }, "support": { "header": "Wsparcie", diff --git a/src/locales/pt.json b/src/locales/pt.json index 907498e7..f2ee7deb 100644 --- a/src/locales/pt.json +++ b/src/locales/pt.json @@ -338,7 +338,13 @@ "yourUsername": "Seu nome de usuário é", "yourPassword": "e sua senha é", "welcome": "Bem-vindos!", - "clickBelow": "Clique abaixo para terminar de configurar sua conta" + "clickBelow": "Clique abaixo para terminar de configurar sua conta", + "bolt12Offer": "Oferta relâmpago (BOLT12)", + "bolt12OfferDescription": "Um código de pagamento reutilizável para receber pagamentos relâmpagos e BOLT12 zaps. Adicione-o à lista de ofertas do seu cliente nostr para ser zapped sobre BOLT12.", + "continueSettingUp": "Configuração da conta", + "publishOffer": "Publicar em nostr", + "offerPublished": "Publicado!", + "offerPublishFailed": "Falha ao publicar a oferta" }, "support": { "header": "Suporte", diff --git a/src/locales/ru.json b/src/locales/ru.json index 759d3caf..70e00319 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -319,7 +319,13 @@ "yourUsername": "Ваше имя пользователя", "yourPassword": "ваш пароль является", "welcome": "Добро пожаловать!", - "clickBelow": "Нажмите ниже, чтобы закончить настройку вашей учетной записи" + "clickBelow": "Нажмите ниже, чтобы закончить настройку вашей учетной записи", + "bolt12Offer": "Молния (BOLT12)", + "bolt12OfferDescription": "Код многоразового использования для приема молниеносных платежей и BOLT12 zaps. Добавьте его в список предложений вашего клиента nostr, чтобы получить поверх BOLT12.", + "continueSettingUp": "Настройка аккаунта", + "publishOffer": "Опубликовать в Nostr", + "offerPublished": "Опубликовано!", + "offerPublishFailed": "Не удалось опубликовать предложение" }, "support": { "header": "Поддержка", diff --git a/src/locales/th.json b/src/locales/th.json index 35cedc2c..840e7594 100644 --- a/src/locales/th.json +++ b/src/locales/th.json @@ -380,7 +380,13 @@ "yourUsername": "ชื่อผู้ใช้ของคุณ", "yourPassword": "และรหัสผ่านของคุณ", "welcome": "ยินดีต้อนรับ!", - "clickBelow": "คลิกด้านล่างนี้เพื่อทําบัญชีให้เสร็จ" + "clickBelow": "คลิกด้านล่างนี้เพื่อทําบัญชีให้เสร็จ", + "bolt12Offer": "นําเสนอสายฟ้า (BOLT12)", + "bolt12OfferDescription": "รหัสการชําระหนี้สําหรับ การชําระเงินฟ้าผ่าและ BOLT12 ช็อต เพิ่มมันเข้าไปในรายชื่อลูกค้าของคุณ เพื่อถูกช็อตทับ.", + "continueSettingUp": "ตั้งค่าบัญชีผู้ใช้", + "publishOffer": "เผยแพร่ไปยังโหนด", + "offerPublished": "ตีพิมพ์!", + "offerPublishFailed": "ล้มเหลวในการเผยแพร่ข้อเสนอ" }, "support": { "header": "สนับสนุน", diff --git a/src/locales/tr.json b/src/locales/tr.json index 92a165f6..83aa962a 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -380,7 +380,13 @@ "yourUsername": "Kullanıcınız Kullanıcınızdır", "yourPassword": "ve şifreniziz", "welcome": "Hoşgeldiniz!", - "clickBelow": "Hesabınızı kurmak için aşağıda tıklayın" + "clickBelow": "Hesabınızı kurmak için aşağıda tıklayın", + "bolt12Offer": "Lightning teklifi (BOLT12)", + "bolt12OfferDescription": "Yıldırım ödemeleri ve BOLT12 zaps almak için yeniden kullanılabilir bir ödeme kodu. BOLT12 üzerinden zapt edilmek için Nostr müşterinizin teklif listesine ekleyin.", + "continueSettingUp": "Hesap kurulumu", + "publishOffer": "Nostr", + "offerPublished": "Yayınlanmış!", + "offerPublishFailed": "Yayımlama teklifinde başarısız oldu" }, "support": { "header": "Destek Desteği Destek Desteği", diff --git a/src/locales/zh.json b/src/locales/zh.json index d08ca41d..9f5481d4 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -319,7 +319,13 @@ "yourUsername": "您的用户名是", "yourPassword": "而您的密码是", "welcome": "欢迎光临!", - "clickBelow": "点击下面完成您的账户设置" + "clickBelow": "点击下面完成您的账户设置", + "bolt12Offer": "闪电报价(BOLT12)", + "bolt12OfferDescription": "用于接收闪电支付和BOLT12 zaps的可再用支付代码. 把它添加到你的鼻孔客户端的要约列表里 以获得被ZALT12.", + "continueSettingUp": "账户设置", + "publishOffer": "发布到节点", + "offerPublished": "发表!", + "offerPublishFailed": "发布要约失败" }, "support": { "header": "支持", diff --git a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts index eb324775..2a30defa 100644 --- a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts +++ b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts @@ -6,9 +6,7 @@ export async function load({ cookies, params, parent }) { const { user } = await parent(); let data = { ...params }; const rates = await getRates(); - if (!params.payreq.startsWith("lno")) { - data = { ...data, ...(await post("/parse", params, auth(cookies))) }; - } + data = { ...data, ...(await post("/parse", params, auth(cookies))) }; data.rate = rates[user.currency]; return data; diff --git a/src/routes/(app)/settings/nostr/+page.server.ts b/src/routes/(app)/settings/nostr/+page.server.ts index 1767ebaf..84b3fa27 100644 --- a/src/routes/(app)/settings/nostr/+page.server.ts +++ b/src/routes/(app)/settings/nostr/+page.server.ts @@ -4,7 +4,13 @@ import { auth, get } from "$lib/utils"; export const load = async ({ cookies }) => { const { challenge } = await get("/challenge"); const apps = await get("/apps", auth(cookies)); - return { apps, challenge }; + + let offer; + try { + ({ hash: offer } = await get("/offer", auth(cookies))); + } catch (e) {} + + return { apps, challenge, offer }; }; export const actions = { diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index 7168f4f7..5ba5f636 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -1,7 +1,7 @@ <script> import { untrack } from "svelte"; import { browser } from "$app/environment"; - import { getNsec } from "$lib/nostr"; + import { getNsec, send, sign } from "$lib/nostr"; import { page } from "$app/stores"; import { tick } from "svelte"; import { t } from "$lib/translations"; @@ -13,7 +13,7 @@ import { signer, save } from "$lib/store"; let { data } = $props(); - let { apps, challenge, user } = $derived(data); + let { apps, challenge, offer, user } = $derived(data); let npub = $state(untrack(() => user.npub)); let extensionAvailable = $derived(browser && window.nostr); let { locale } = $derived(user); @@ -41,6 +41,33 @@ await tick(); $save.click(); }; + + let publishing = $state(), + published = $state(); + + // Kind 10058 is the NIP-177 BOLT12 offer list — publishing it lets nostr + // clients (Amethyst v1.13+) zap this user over BOLT12. Replaceable event, + // so republishing just updates it. + let publishOffer = async () => { + try { + publishing = true; + let event = { + kind: 10058, + content: "", + created_at: Math.round(Date.now() / 1000), + tags: [["offer", offer]], + }; + + event = await sign(event, user); + await send(event); + published = true; + } catch (e) { + console.log(e); + fail($t("user.settings.offerPublishFailed")); + } finally { + publishing = false; + } + }; </script> <input type="hidden" name="challenge" value={challenge} /> @@ -145,6 +172,53 @@ </div> </div> +{#if offer} + <div class="space-y-2"> + <h2 class="text-2xl font-bold mb-2"> + {$t("user.settings.bolt12Offer")} + </h2> + <p class="text-secondary mb-4"> + {$t("user.settings.bolt12OfferDescription")} + </p> + + <div class="break-all text-secondary">{offer}</div> + + <div class="flex my-auto gap-1"> + <button + type="button" + class="my-auto btn btn-circle !w-auto grow" + onclick={() => copy(offer)} + aria-label="Copy" + ><iconify-icon noobserver icon="ph:copy-bold" width="32" + ></iconify-icon> {$t("accounts.copy")}</button + > + + <a + href={`/qr/${encodeURIComponent(offer)}`} + class="my-auto btn btn-circle !w-auto grow" + aria-label="QR" + > + <iconify-icon noobserver icon="ph:qr-code-bold" width="32" + ></iconify-icon> + {$t("accounts.qr")} + </a> + + <button + type="button" + class="my-auto btn btn-circle !w-auto grow" + onclick={publishOffer} + disabled={publishing} + aria-label="Publish" + ><iconify-icon noobserver icon="ph:megaphone-bold" width="32" + ></iconify-icon> + {published + ? $t("user.settings.offerPublished") + : $t("user.settings.publishOffer")}</button + > + </div> + </div> +{/if} + {#if revealNwc} <div class="break-all grow"> {nwc} |
