diff --git a/package.json b/package.json index f0861eb6..2695f0c6 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@capacitor/keyboard": "^7.0.0", "@capacitor/push-notifications": "^7.0.1", "@capawesome/capacitor-badge": "^7.0.1", + "@getalby/sdk": "^5.1.0", "@poppanator/sveltekit-svg": "^4.2.1", "@sentry/browser": "^8.35.0", "@sveltejs/adapter-static": "^3.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a9bb837..e635e955 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@capawesome/capacitor-badge': specifier: ^7.0.1 version: 7.0.1(@capacitor/core@7.2.0) + '@getalby/sdk': + specifier: ^5.1.0 + version: 5.1.0(typescript@5.8.3) '@poppanator/sveltekit-svg': specifier: ^4.2.1 version: 4.2.1(rollup@2.79.2)(svelte@5.25.10)(svgo@3.3.2)(vite@5.4.17(@types/node@22.14.0)(terser@5.39.0)) @@ -58,37 +61,37 @@ importers: version: 0.6.8(@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.25.10)(vite@5.4.17(@types/node@22.14.0)(terser@5.39.0)))(svelte@5.25.10)(vite@5.4.17(@types/node@22.14.0)(terser@5.39.0)))(@vite-pwa/assets-generator@0.2.6)(vite-plugin-pwa@0.21.2(@vite-pwa/assets-generator@0.2.6)(vite@5.4.17(@types/node@22.14.0)(terser@5.39.0))(workbox-build@7.3.0)(workbox-window@7.3.0)) '@welshman/app': specifier: ^0.3.8 - version: 0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) + version: 0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) '@welshman/content': specifier: ^0.3.8 - version: 0.3.8(typescript@5.8.3) + version: 0.3.9(typescript@5.8.3) '@welshman/editor': specifier: ^0.3.8 - version: 0.3.8(@tiptap/extension-image@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(@tiptap/extension-link@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0))(linkifyjs@4.3.1)(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.3)(tiptap-markdown@0.8.10(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(typescript@5.8.3) + version: 0.3.9(@tiptap/extension-image@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(@tiptap/extension-link@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0))(linkifyjs@4.3.1)(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.3)(tiptap-markdown@0.8.10(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(typescript@5.8.3) '@welshman/feeds': specifier: ^0.3.8 - version: 0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) + version: 0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) '@welshman/lib': specifier: ^0.3.8 - version: 0.3.8 + version: 0.3.9 '@welshman/net': specifier: ^0.3.8 - version: 0.3.8(typescript@5.8.3)(ws@8.18.3) + version: 0.3.9(typescript@5.8.3)(ws@8.18.3) '@welshman/relay': specifier: ^0.3.8 - version: 0.3.8(typescript@5.8.3) + version: 0.3.9(typescript@5.8.3) '@welshman/router': specifier: ^0.3.8 - version: 0.3.8(typescript@5.8.3) + version: 0.3.9(typescript@5.8.3) '@welshman/signer': specifier: ^0.3.8 - version: 0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) + version: 0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) '@welshman/store': specifier: ^0.3.8 - version: 0.3.8(typescript@5.8.3) + version: 0.3.9(typescript@5.8.3) '@welshman/util': specifier: ^0.3.8 - version: 0.3.8(typescript@5.8.3) + version: 0.3.9(typescript@5.8.3) compressorjs: specifier: ^1.2.1 version: 1.2.1 @@ -944,6 +947,14 @@ packages: resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@getalby/lightning-tools@5.2.0': + resolution: {integrity: sha512-8kBvENBTMh541VjGKhw3I29+549/C02gLSh3AQaMfoMNSZaMxfQW+7dcMcc7vbFaCKEcEe18ST5bUveTRBuXCQ==} + engines: {node: '>=14'} + + '@getalby/sdk@5.1.0': + resolution: {integrity: sha512-0ijo4enzoxZinyhOMFlR4h3qTQ9I0Se+dBkefk0ja5zOcpi61ZqT86n0T+7u94l8SH6/poysFBObdtN61u+6tQ==} + engines: {node: '>=14'} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1383,77 +1394,77 @@ packages: peerDependencies: '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code-block@2.23.0': - resolution: {integrity: sha512-p8iizp5nQBBhYPrIgBVwEqcDnc2fFRAZCXy/xjmAk2kKOhB7NYe3+1yrbFcQKVAdaUFxG+BRj2WxNDeeRt5tJA==} + '@tiptap/extension-code-block@2.24.2': + resolution: {integrity: sha512-zM3skKOZyS9bhnABaSD4dgACNpXm6IjfWdhyIsIE9EcO2p6sMdyFefz0AmMDdoyJq0oSmm+JD6sblEisJOQZ9w==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code@2.23.0': - resolution: {integrity: sha512-Ip/5+kNoqrxYPHLnZMf7i6wfjjRuR5QgfC3IR3Mk1WQM1JGXCLL+uUjTUxKXFUj28hjSJfsmVbTUhoVvgZEWfw==} + '@tiptap/extension-code@2.24.2': + resolution: {integrity: sha512-dK1jOm0Xe0h8SUXVUJPj3AxWb1N4zeBkdPZFoz+iUHacpymMinH1CuukN9UpwmSi0YPfrIMKkCaw5WOEzjV8RA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-document@2.23.0': - resolution: {integrity: sha512-kuRPqH0UdjZ4RcnpPELsu1N8LqeixEin+mv5eaQJI/aZ6rFq+kcY4UZF3C7q56Rat5r9CgHBiZbD0t5l6E3gdA==} + '@tiptap/extension-document@2.24.2': + resolution: {integrity: sha512-w3q1JaWZlwK8aHmF4lrFqalLssNkZoS3rjL/iS0v69q/fTI9t0WmCx5Jx427eUlNITZ5XoCL8zguKmnSPbFovg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-dropcursor@2.23.0': - resolution: {integrity: sha512-m2LzkJpipHLPEllD3MXZQMssu7Xng7YJOJ8ZNDkF0uUkXljwh7G0ROjGNKUlV8/dqoCVmJIZIyF6t9saQwTTbA==} + '@tiptap/extension-dropcursor@2.24.2': + resolution: {integrity: sha512-yJyQeM05LBVG54ShyzJ0M9I2zALcjMrg9Kc/b6O73EWSIGLlYPhGBY/VujZFZ4OIC5i+yrKRr3nzoj68iIzwcw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-gapcursor@2.23.0': - resolution: {integrity: sha512-SpYsDtMiVwqcSB84g714PrnHo985R5UiIaGngef6iMNy/0xjKcO0tj/feu0WwJDuSj22Opzlnb/Ld/D4Va27Ng==} + '@tiptap/extension-gapcursor@2.24.2': + resolution: {integrity: sha512-bp0BBw4pzjHnbjWSFaeYcffXL6Bvs8bSLRDz56qP9j/6WH6ngLBQQMmRKsJeYnzb895MZj767tB4EtgC6kzwMg==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-hard-break@2.23.0': - resolution: {integrity: sha512-OpNBEYv9HDUPo8SgvmI5oPd0b+xmdadtFyL7t4lxhYar8n5NDYubaXYgbKcdJfXvUxEeGwdc3ePnTFpsF0mrYw==} + '@tiptap/extension-hard-break@2.24.2': + resolution: {integrity: sha512-6TB9GBUTp3DIOptQubEVvL6BVKhxfLzAJwWYXjw0EkZHrK8TQPB3QIjLV/uZy29Ruji2k97ytxuxfrGoQXoXtA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-history@2.23.0': - resolution: {integrity: sha512-W+2bZ/02nm56g/wmEaSx9QcdZ8mHjoFyc8MKf54Mrzi+nIdNjsNreKrn1yCp683CGEPd8DLadDFkz0o13N+rxA==} + '@tiptap/extension-history@2.24.2': + resolution: {integrity: sha512-D2nom9y/X62wdP0XQluo58QIPzGjEag8mI/KXiJumLOiXCBXGsubBsZWdOMi5K+4YHfsLrZnCfEDE773Y5Pgng==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-image@2.23.0': - resolution: {integrity: sha512-/rW2+a21VBGBv5c/78CVW8XA7bThSqE3FqcBtWyq8IxZoe8Hj9+Jac7FcB2YR3aY0BeHwso474e1RuVr1iYBKQ==} + '@tiptap/extension-image@2.24.2': + resolution: {integrity: sha512-fiv6TSH8tkjT8C18jR3wU9Bq1Z50hXxtymDHeqnpIDtpxjIgktc8ngkuys11gUTK28UBGUbdBmJcd3oPXFKhZg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-link@2.23.0': - resolution: {integrity: sha512-D+ethAE8+2f7RH7kqS+//EsC2wNblhmssJYVE0hCXM5BKIBixjs8eCOAvLbJsw0u/5LqFYjsyAimTqa4hD5uvg==} + '@tiptap/extension-link@2.24.2': + resolution: {integrity: sha512-wsK1hqrQaJEoawsWFOdbhlaQRLtbuElAuIzGo2nOXAA3eur+fu/fTV6NebDyIroP6JUb04DMIW3w/ETYGCz0Lw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-paragraph@2.23.0': - resolution: {integrity: sha512-MXhRkb741UOcJp2evG/H0MY3WJQnX7z8PsejmJbJXOHBrS/Esxq0AlrDAjuFhbfAnJwYiWQ1lk6ucvKV6DhFuQ==} + '@tiptap/extension-paragraph@2.24.2': + resolution: {integrity: sha512-u10UFm3WifUGf60/UGLucJjw1U01nDS4qYWDI9pGvdYdi00nvQaONj6cUK4/v/yrrzbWi94nf82/xXpH0qWIKA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-placeholder@2.23.0': - resolution: {integrity: sha512-I5RQk0qn6nj7l7z4mWKIxjO2nluvKsm00W2CbC75b4YcScBfsMInHQdjN2s+W8xuF0zquhwVITxA+Bmn4zynqg==} + '@tiptap/extension-placeholder@2.24.2': + resolution: {integrity: sha512-eZ45yakla1WAKGT5qNWBzAvONySFtbNowMBqY28QfBKRp1FLh3Px/EP+gJiKjApJecc6TAd+CrNDLrWBk6EQeQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-text@2.23.0': - resolution: {integrity: sha512-hF+CU1H4B4UgqjBXXPPaACVZdSGuMH0TDYTd7h403qUAIBKkYbjuan7laQpiT0qnF0Dg+sGgvmGcd4H1tTBM8g==} + '@tiptap/extension-text@2.24.2': + resolution: {integrity: sha512-spccJxacijTf+pdBNgyzIfxDScLKjtcpvACEw/5isYzlZ0vLyC7QhWQe8jeYEM6K9yYixIuoayV8QWRd3tzG9w==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm@2.12.0': resolution: {integrity: sha512-TNzVwpeNzFfHAcYTOKqX9iU4fRxliyoZrCnERR+RRzeg7gWrXrCLubQt1WEx0sojMAfznshSL3M5HGsYjEbYwA==} - '@tiptap/suggestion@2.23.0': - resolution: {integrity: sha512-WUUGADu8ZezXZ4hXZWdfGcfoitB5tiBrc2u1oXqqL8VmJJedhY4MdWUPYqgh3359tAI2yJWmv+gPabX361gBEA==} + '@tiptap/suggestion@2.24.2': + resolution: {integrity: sha512-4gP4WQ0CCeYbu7MV+j7FE0GRbmHzJb/iahdN+Z7/Y9uXam+dPdSNN9cUQqREY/cJP+ACzuD+BJvVqpwNV6m/RA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 @@ -1609,41 +1620,41 @@ packages: '@vite-pwa/assets-generator': optional: true - '@welshman/app@0.3.8': - resolution: {integrity: sha512-WmvqB8Z/qPN0dJerf3QTp5MniZQGXToNXJWorEFA3LQwBJWAovPFfdq8xoNGe9tWwYl0m9Rt/ObZf3gFlX28Cw==} + '@welshman/app@0.3.9': + resolution: {integrity: sha512-Dabw3GZNcsCTMPVWWSeO+xJNEEdkQkKaMN60KNhPQQb3UzR0GfPKPjIQZSnL+vZwyZHGjwBBmcPNRnaLfu2kPA==} - '@welshman/content@0.3.8': - resolution: {integrity: sha512-ic7imQR0cpolUlwnWVfUqiIo9zkOt6DS2M92BD4Y/mCLGrUMzlUw0/NE5TzBJ6dSywVh8/aBBOTWotzpmbttKg==} + '@welshman/content@0.3.9': + resolution: {integrity: sha512-MkaagcZKYZEZCyIlrMmq4+dwFWF3a6F5T6TyFmWC6NaJy/GsgWLa2GPeN6xaZ8aYX95KjvnQ40KTF1O2msykyA==} - '@welshman/editor@0.3.8': - resolution: {integrity: sha512-XZ/cXEM3MIwhR7CZvboH2askm9dZJ9cH7/CS4Asd3Q/OaaPUrCTCoacEpR1z3raMMOz0TiDn+BgjGqrHYU/58Q==} + '@welshman/editor@0.3.9': + resolution: {integrity: sha512-DRU2UQdxfzjZm3UZH4hwnML0MtnFE66W0aLTOY3CHQIEHy0oWMwxoaX8q5WwQ38B/XhH10WFEWgD2flMtwzhAA==} - '@welshman/feeds@0.3.8': - resolution: {integrity: sha512-Rjf36Eng22PMY9p1yepMDfXH2dlCPg5yBVidu8WArFWLgxSv67DCxAsDlHkRd/mJD5DARFDob1WZP9bUsljJBw==} + '@welshman/feeds@0.3.9': + resolution: {integrity: sha512-+maapgquzBRQdwc7QlTvTBcFxYNVW6es4Da+HC+GKz+HPza0hvrq89UQJQLqoBtAKElCRrpDipVq12Y2y98U4A==} - '@welshman/lib@0.3.8': - resolution: {integrity: sha512-fbq94UkyoC7kieAlWsDzH6zgZt+GVhkh1RiFvtE4iGug3bIPxh1QmmvO70EHlFkiEDcYAFEEHd9OMm6/JRc97Q==} + '@welshman/lib@0.3.9': + resolution: {integrity: sha512-bwrimda66m5MxVBmWhsotawDv12nh8YGy+684GlB5SX3PEnGG3LUaquejh9Ml4Bm0Gj9SwoMDPug6uNYdo1w0Q==} engines: {node: '>=12.0.0'} - '@welshman/net@0.3.8': - resolution: {integrity: sha512-DWNL+BGmOGCfXdYOnpd3IJ7IuCskftUfXnjBo8F0rkHWUWAE6Q1zTJmdJG3kDVDoWl3X4XBfxkl4WGckF9pSkw==} + '@welshman/net@0.3.9': + resolution: {integrity: sha512-x63UQ/tzdv6BgjPQaiPdlY9giEqRJWU1uKbH4khWlqO8MTFNdj+j3Di3M7v43xCfNpW4cLk3YIVoN+aVFzrx5A==} - '@welshman/relay@0.3.8': - resolution: {integrity: sha512-vWUOxvG4WV0+EsC/BYoCF9L2W/qml4TIAnGHmWpDt9jTS82kIQt3cu2+3uJs9IZli+etRJ3xYJLVvfzfQqBaig==} + '@welshman/relay@0.3.9': + resolution: {integrity: sha512-RFkjgvTjftmW25/QlFPt2v8+2WBtbmaWW/QWkGa5lTnQvL9tkor7KuffU0Ss0NzCb/8cefVzas/leYHmEsrPog==} - '@welshman/router@0.3.8': - resolution: {integrity: sha512-3Gn3yjMbQ9sQ8qsX5bjUtTSKkwdOREqGVzcQiBq1FRATh42ih06Opu5/t8ujcMRMhV3w/02ckfZJ46DF34ozWQ==} + '@welshman/router@0.3.9': + resolution: {integrity: sha512-umV7krvjGOCpaCtbsPilL4rWK7XQhiejge3SiQAC6fOLkqzlfJ4uRBmxJHhtf8yt7w/KkUP1G2ZFTXWtaQd9DA==} - '@welshman/signer@0.3.8': - resolution: {integrity: sha512-L3hAJlS0smS4uSC5b1xskHDbrkuCykXr5b6Z9aNV9MJjczbb5pCuYjHf9lCvcmqaz4NN4kcksXlLZgxMbE/5Jg==} + '@welshman/signer@0.3.9': + resolution: {integrity: sha512-NLYtZJNvXDwspWK0ISTnvJu89+IGWnASjFTfLdwWbty115OLS/LGz6Jenxqtmzh+Yz7svrpksk+UJW+B8lbKLw==} peerDependencies: nostr-signer-capacitor-plugin: ~0.0.4 - '@welshman/store@0.3.8': - resolution: {integrity: sha512-SHKF9RjcvoqcduHDleKSjhubrS10f5XmcU2kBPFy/U9G7hi4M5f4HQa46Kt7Mf4OHuofnjRw+4RLopkqjFL3ow==} + '@welshman/store@0.3.9': + resolution: {integrity: sha512-GmgXnC/yEKxPi4k4kfv3i4ZNqdlsDVIq4QHBSVrj5qQmB9ePy76QH5ty9rVpukQu/rnOiT5OFQREE2qC1u3Qpg==} - '@welshman/util@0.3.8': - resolution: {integrity: sha512-+doowqtIjUChPGdmGNopO6bAvC/0LkF2zKaEKPHnIfDAsw4gAJyuAvIlS/PUv8tY6scXORGeGMnoBC0Htd3Ovg==} + '@welshman/util@0.3.9': + resolution: {integrity: sha512-ew21oiotQxMnaqtuH0awvrG3zViQlG1cSVpTxuRD9a1Z7jh/t3dh6bbQRGcZAEL1f2kd3a4Mc9Gf24SFTAY+Jg==} '@xml-tools/parser@1.0.11': resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} @@ -3412,6 +3423,14 @@ packages: peerDependencies: '@capacitor/core': ^7.0.0 + nostr-tools@2.12.0: + resolution: {integrity: sha512-pUWEb020gTvt1XZvTa8AKNIHWFapjsv2NKyk43Ez2nnvz6WSXsrTFE0XtkNLSRBjPn6EpxumKeNiVzLz74jNSA==} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + nostr-tools@2.14.2: resolution: {integrity: sha512-YOIOn5EdJ2Kq5sQW5Zh4wOcqzR6kUyrCDHG4+mVD2szzthsyOTpiWX0yrwaRZGlHJG6q83vkhg95qc2W201XTQ==} peerDependencies: @@ -5689,6 +5708,15 @@ snapshots: '@eslint/core': 0.13.0 levn: 0.4.1 + '@getalby/lightning-tools@5.2.0': {} + + '@getalby/sdk@5.1.0(typescript@5.8.3)': + dependencies: + '@getalby/lightning-tools': 5.2.0 + nostr-tools: 2.12.0(typescript@5.8.3) + transitivePeerDependencies: + - typescript + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -6169,58 +6197,58 @@ snapshots: dependencies: '@tiptap/pm': 2.12.0 - '@tiptap/extension-code-block@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': + '@tiptap/extension-code-block@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) '@tiptap/pm': 2.12.0 - '@tiptap/extension-code@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': + '@tiptap/extension-code@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) - '@tiptap/extension-document@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': + '@tiptap/extension-document@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) - '@tiptap/extension-dropcursor@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': + '@tiptap/extension-dropcursor@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) '@tiptap/pm': 2.12.0 - '@tiptap/extension-gapcursor@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': + '@tiptap/extension-gapcursor@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) '@tiptap/pm': 2.12.0 - '@tiptap/extension-hard-break@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': + '@tiptap/extension-hard-break@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) - '@tiptap/extension-history@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': + '@tiptap/extension-history@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) '@tiptap/pm': 2.12.0 - '@tiptap/extension-image@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': + '@tiptap/extension-image@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) - '@tiptap/extension-link@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': + '@tiptap/extension-link@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) '@tiptap/pm': 2.12.0 linkifyjs: 4.3.1 - '@tiptap/extension-paragraph@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': + '@tiptap/extension-paragraph@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) - '@tiptap/extension-placeholder@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': + '@tiptap/extension-placeholder@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) '@tiptap/pm': 2.12.0 - '@tiptap/extension-text@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': + '@tiptap/extension-text@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) @@ -6245,7 +6273,7 @@ snapshots: prosemirror-transform: 1.10.4 prosemirror-view: 1.39.3 - '@tiptap/suggestion@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': + '@tiptap/suggestion@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) '@tiptap/pm': 2.12.0 @@ -6454,17 +6482,17 @@ snapshots: optionalDependencies: '@vite-pwa/assets-generator': 0.2.6 - '@welshman/app@0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3)': + '@welshman/app@0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3)': dependencies: '@types/throttle-debounce': 5.0.2 - '@welshman/feeds': 0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) - '@welshman/lib': 0.3.8 - '@welshman/net': 0.3.8(typescript@5.8.3)(ws@8.18.3) - '@welshman/relay': 0.3.8(typescript@5.8.3) - '@welshman/router': 0.3.8(typescript@5.8.3) - '@welshman/signer': 0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) - '@welshman/store': 0.3.8(typescript@5.8.3) - '@welshman/util': 0.3.8(typescript@5.8.3) + '@welshman/feeds': 0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) + '@welshman/lib': 0.3.9 + '@welshman/net': 0.3.9(typescript@5.8.3)(ws@8.18.3) + '@welshman/relay': 0.3.9(typescript@5.8.3) + '@welshman/router': 0.3.9(typescript@5.8.3) + '@welshman/signer': 0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) + '@welshman/store': 0.3.9(typescript@5.8.3) + '@welshman/util': 0.3.9(typescript@5.8.3) fuse.js: 7.1.0 idb: 8.0.2 svelte: 4.2.20 @@ -6474,31 +6502,31 @@ snapshots: - typescript - ws - '@welshman/content@0.3.8(typescript@5.8.3)': + '@welshman/content@0.3.9(typescript@5.8.3)': dependencies: '@braintree/sanitize-url': 7.1.1 nostr-tools: 2.14.2(typescript@5.8.3) transitivePeerDependencies: - typescript - '@welshman/editor@0.3.8(@tiptap/extension-image@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(@tiptap/extension-link@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0))(linkifyjs@4.3.1)(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.3)(tiptap-markdown@0.8.10(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(typescript@5.8.3)': + '@welshman/editor@0.3.9(@tiptap/extension-image@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(@tiptap/extension-link@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0))(linkifyjs@4.3.1)(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.3)(tiptap-markdown@0.8.10(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(typescript@5.8.3)': dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) - '@tiptap/extension-code': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) - '@tiptap/extension-code-block': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) - '@tiptap/extension-document': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) - '@tiptap/extension-dropcursor': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) - '@tiptap/extension-gapcursor': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) - '@tiptap/extension-hard-break': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) - '@tiptap/extension-history': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) - '@tiptap/extension-paragraph': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) - '@tiptap/extension-placeholder': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) - '@tiptap/extension-text': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) + '@tiptap/extension-code': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) + '@tiptap/extension-code-block': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) + '@tiptap/extension-document': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) + '@tiptap/extension-dropcursor': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) + '@tiptap/extension-gapcursor': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) + '@tiptap/extension-hard-break': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) + '@tiptap/extension-history': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) + '@tiptap/extension-paragraph': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) + '@tiptap/extension-placeholder': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) + '@tiptap/extension-text': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) '@tiptap/pm': 2.12.0 - '@tiptap/suggestion': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) - '@welshman/lib': 0.3.8 - '@welshman/util': 0.3.8(typescript@5.8.3) - nostr-editor: 1.0.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/extension-image@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(@tiptap/extension-link@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)(linkifyjs@4.3.1)(nostr-tools@2.14.2(typescript@5.8.3))(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.3)(tiptap-markdown@0.8.10(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))) + '@tiptap/suggestion': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) + '@welshman/lib': 0.3.9 + '@welshman/util': 0.3.9(typescript@5.8.3) + nostr-editor: 1.0.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/extension-image@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(@tiptap/extension-link@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)(linkifyjs@4.3.1)(nostr-tools@2.14.2(typescript@5.8.3))(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.3)(tiptap-markdown@0.8.10(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))) nostr-tools: 2.14.2(typescript@5.8.3) tippy.js: 6.3.7 transitivePeerDependencies: @@ -6512,78 +6540,78 @@ snapshots: - tiptap-markdown - typescript - '@welshman/feeds@0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3)': + '@welshman/feeds@0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3)': dependencies: - '@welshman/lib': 0.3.8 - '@welshman/net': 0.3.8(typescript@5.8.3)(ws@8.18.3) - '@welshman/relay': 0.3.8(typescript@5.8.3) - '@welshman/router': 0.3.8(typescript@5.8.3) - '@welshman/signer': 0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) - '@welshman/util': 0.3.8(typescript@5.8.3) + '@welshman/lib': 0.3.9 + '@welshman/net': 0.3.9(typescript@5.8.3)(ws@8.18.3) + '@welshman/relay': 0.3.9(typescript@5.8.3) + '@welshman/router': 0.3.9(typescript@5.8.3) + '@welshman/signer': 0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3) + '@welshman/util': 0.3.9(typescript@5.8.3) trava: 1.2.1 transitivePeerDependencies: - nostr-signer-capacitor-plugin - typescript - ws - '@welshman/lib@0.3.8': + '@welshman/lib@0.3.9': dependencies: '@scure/base': 1.2.6 '@types/events': 3.0.3 events: 3.3.0 - '@welshman/net@0.3.8(typescript@5.8.3)(ws@8.18.3)': + '@welshman/net@0.3.9(typescript@5.8.3)(ws@8.18.3)': dependencies: - '@welshman/lib': 0.3.8 - '@welshman/relay': 0.3.8(typescript@5.8.3) - '@welshman/util': 0.3.8(typescript@5.8.3) + '@welshman/lib': 0.3.9 + '@welshman/relay': 0.3.9(typescript@5.8.3) + '@welshman/util': 0.3.9(typescript@5.8.3) events: 3.3.0 isomorphic-ws: 5.0.0(ws@8.18.3) transitivePeerDependencies: - typescript - ws - '@welshman/relay@0.3.8(typescript@5.8.3)': + '@welshman/relay@0.3.9(typescript@5.8.3)': dependencies: - '@welshman/lib': 0.3.8 - '@welshman/util': 0.3.8(typescript@5.8.3) + '@welshman/lib': 0.3.9 + '@welshman/util': 0.3.9(typescript@5.8.3) transitivePeerDependencies: - typescript - '@welshman/router@0.3.8(typescript@5.8.3)': + '@welshman/router@0.3.9(typescript@5.8.3)': dependencies: - '@welshman/lib': 0.3.8 - '@welshman/relay': 0.3.8(typescript@5.8.3) - '@welshman/util': 0.3.8(typescript@5.8.3) + '@welshman/lib': 0.3.9 + '@welshman/relay': 0.3.9(typescript@5.8.3) + '@welshman/util': 0.3.9(typescript@5.8.3) transitivePeerDependencies: - typescript - '@welshman/signer@0.3.8(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3)': + '@welshman/signer@0.3.9(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.2.0))(typescript@5.8.3)(ws@8.18.3)': dependencies: '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 - '@welshman/lib': 0.3.8 - '@welshman/net': 0.3.8(typescript@5.8.3)(ws@8.18.3) - '@welshman/util': 0.3.8(typescript@5.8.3) + '@welshman/lib': 0.3.9 + '@welshman/net': 0.3.9(typescript@5.8.3)(ws@8.18.3) + '@welshman/util': 0.3.9(typescript@5.8.3) nostr-signer-capacitor-plugin: 0.0.4(@capacitor/core@7.2.0) nostr-tools: 2.14.2(typescript@5.8.3) transitivePeerDependencies: - typescript - ws - '@welshman/store@0.3.8(typescript@5.8.3)': + '@welshman/store@0.3.9(typescript@5.8.3)': dependencies: - '@welshman/lib': 0.3.8 - '@welshman/relay': 0.3.8(typescript@5.8.3) - '@welshman/util': 0.3.8(typescript@5.8.3) + '@welshman/lib': 0.3.9 + '@welshman/relay': 0.3.9(typescript@5.8.3) + '@welshman/util': 0.3.9(typescript@5.8.3) svelte: 4.2.20 transitivePeerDependencies: - typescript - '@welshman/util@0.3.8(typescript@5.8.3)': + '@welshman/util@0.3.9(typescript@5.8.3)': dependencies: '@types/ws': 8.18.1 - '@welshman/lib': 0.3.8 + '@welshman/lib': 0.3.9 js-base64: 3.7.7 nostr-tools: 2.14.2(typescript@5.8.3) nostr-wasm: 0.1.0 @@ -8415,11 +8443,11 @@ snapshots: normalize-range@0.1.2: {} - nostr-editor@1.0.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/extension-image@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(@tiptap/extension-link@2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)(linkifyjs@4.3.1)(nostr-tools@2.14.2(typescript@5.8.3))(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.3)(tiptap-markdown@0.8.10(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))): + nostr-editor@1.0.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/extension-image@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)))(@tiptap/extension-link@2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0)(linkifyjs@4.3.1)(nostr-tools@2.14.2(typescript@5.8.3))(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.3)(tiptap-markdown@0.8.10(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))): dependencies: '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) - '@tiptap/extension-image': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) - '@tiptap/extension-link': 2.23.0(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) + '@tiptap/extension-image': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0)) + '@tiptap/extension-link': 2.24.2(@tiptap/core@2.12.0(@tiptap/pm@2.12.0))(@tiptap/pm@2.12.0) '@tiptap/pm': 2.12.0 js-base64: 3.7.7 light-bolt11-decoder: 3.2.0 @@ -8435,6 +8463,18 @@ snapshots: dependencies: '@capacitor/core': 7.2.0 + nostr-tools@2.12.0(typescript@5.8.3): + dependencies: + '@noble/ciphers': 0.5.3 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + optionalDependencies: + nostr-wasm: 0.1.0 + typescript: 5.8.3 + nostr-tools@2.14.2(typescript@5.8.3): dependencies: '@noble/ciphers': 0.5.3 diff --git a/src/app/commands.ts b/src/app/commands.ts index cb013437..173fa3b6 100644 --- a/src/app/commands.ts +++ b/src/app/commands.ts @@ -1,3 +1,4 @@ +import {nwc} from "@getalby/sdk" import * as nip19 from "nostr-tools/nip19" import {get} from "svelte/store" import {randomId, flatten, poll, uniq, equals, TIMEZONE, LOCALE} from "@welshman/lib" @@ -55,6 +56,8 @@ import { getThunkError, } from "@welshman/app" import { + wallet, + getWebLn, PROTECTED, userMembership, INDEXER_RELAYS, @@ -443,3 +446,19 @@ export const makeAlert = async (params: AlertParams) => { export const publishAlert = async (params: AlertParams) => publishThunk({event: await makeAlert(params), relays: [NOTIFIER_RELAY]}) + +export const payInvoice = async (invoice: string) => { + const $wallet = get(wallet) + + if (!$wallet) { + throw new Error("No wallet is connected") + } + + if ($wallet.type === "nwc") { + return new nwc.NWCClient($wallet.info).payInvoice({invoice}) + } else if ($wallet.type === "webln") { + return getWebLn() + .enable() + .then(() => getWebLn().sendPayment(invoice)) + } +} diff --git a/src/app/components/ChannelMessage.svelte b/src/app/components/ChannelMessage.svelte index fa03213e..1d9da7ce 100644 --- a/src/app/components/ChannelMessage.svelte +++ b/src/app/components/ChannelMessage.svelte @@ -11,6 +11,7 @@ import ThunkStatus from "@app/components/ThunkStatus.svelte" import ProfileDetail from "@app/components/ProfileDetail.svelte" import ReactionSummary from "@app/components/ReactionSummary.svelte" + import ChannelMessageZapButton from "@app/components/ChannelMessageZapButton.svelte" import ChannelMessageEmojiButton from "@app/components/ChannelMessageEmojiButton.svelte" import ChannelMessageMenuButton from "@app/components/ChannelMessageMenuButton.svelte" import ChannelMessageMenuMobile from "@app/components/ChannelMessageMenuMobile.svelte" @@ -94,6 +95,7 @@ +{/if} diff --git a/src/app/components/ProfileLink.svelte b/src/app/components/ProfileLink.svelte index 5279abae..b9cbd66d 100644 --- a/src/app/components/ProfileLink.svelte +++ b/src/app/components/ProfileLink.svelte @@ -9,14 +9,15 @@ type Props = { pubkey: string url?: string + class?: string unstyled?: boolean } - const {pubkey, url, unstyled}: Props = $props() + const {pubkey, url, unstyled, ...props}: Props = $props() const openProfile = () => pushModal(ProfileDetail, {pubkey, url}) - diff --git a/src/app/components/ReactionSummary.svelte b/src/app/components/ReactionSummary.svelte index 14fac6ed..e4e263f7 100644 --- a/src/app/components/ReactionSummary.svelte +++ b/src/app/components/ReactionSummary.svelte @@ -1,9 +1,10 @@ -{#if $reactions.length > 0 || $reports.length > 0} +{#if $reactions.length > 0 || $zaps.length || $reports.length > 0}
{#if url && $reports.length > 0} {/if} + {#each groupedZaps.entries() as [key, zaps]} + {@const amount = sum(zaps.map(zap => zap.invoiceAmount))} + {@const pubkeys = zaps.map(zap => zap.request.pubkey)} + {@const isOwn = $pubkey && pubkeys.includes($pubkey)} + {@const info = displayList(pubkeys.map(pubkey => displayProfileByPubkey(pubkey)))} + {@const tooltip = `${info} zapped`} + + {/each} {#each groupedReactions.entries() as [key, events]} {@const pubkeys = events.map(e => e.pubkey)} {@const isOwn = $pubkey && pubkeys.includes($pubkey)} diff --git a/src/app/components/WalletConnect.svelte b/src/app/components/WalletConnect.svelte new file mode 100644 index 00000000..b52385e0 --- /dev/null +++ b/src/app/components/WalletConnect.svelte @@ -0,0 +1,155 @@ + + +
+ + {#snippet title()} +
Connect a Wallet
+ {/snippet} + {#snippet info()} + Use Nostr Wallet Connect to send Bitcoin payments over Lightning. + {/snippet} +
+ {#if getWebLn()} + + Or + {/if} + + {#snippet label()} + Connection Secret* + {/snippet} + {#snippet input()} + + {/snippet} + {#snippet info()} + You can find this in any wallet that supports + Nostr Wallet Connect. + {/snippet} + + + + + +
diff --git a/src/app/components/WalletDisconnect.svelte b/src/app/components/WalletDisconnect.svelte new file mode 100644 index 00000000..16835d09 --- /dev/null +++ b/src/app/components/WalletDisconnect.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/app/components/Zap.svelte b/src/app/components/Zap.svelte new file mode 100644 index 00000000..3f4218ae --- /dev/null +++ b/src/app/components/Zap.svelte @@ -0,0 +1,167 @@ + + +
+ + {#snippet title()} +
Send a Zap
+ {/snippet} + {#snippet info()} +
To
+ {/snippet} +
+ + {#snippet label()} + Emoji Reaction + {/snippet} + {#snippet input()} +
+ + {content} + +
+ {/snippet} +
+ + {#snippet label()} + Amount + {/snippet} + {#snippet input()} +
+ +
+ {/snippet} +
+ + + + + +
diff --git a/src/app/state.ts b/src/app/state.ts index 57610a52..50010cc2 100644 --- a/src/app/state.ts +++ b/src/app/state.ts @@ -37,6 +37,7 @@ import { CLIENT_AUTH, AUTH_JOIN, REACTION, + ZAP_REQUEST, ZAP_RESPONSE, DIRECT_MESSAGE, DIRECT_MESSAGE_FILE, @@ -134,7 +135,7 @@ export const REACTION_KINDS = [REACTION, ZAP_RESPONSE] export const NIP46_PERMS = "nip44_encrypt,nip44_decrypt," + - [CLIENT_AUTH, AUTH_JOIN, MESSAGE, THREAD, COMMENT, ROOMS, WRAP, REACTION] + [CLIENT_AUTH, AUTH_JOIN, MESSAGE, THREAD, COMMENT, ROOMS, WRAP, REACTION, ZAP_REQUEST] .map(k => `sign_event:${k}`) .join(",") @@ -346,6 +347,39 @@ export const { load: makeOutboxLoader(SETTINGS), }) +// Wallets + +export type WebLNInfo = { + methods?: string[] + supports?: string[] + version?: string + node?: { + alias: string + } +} + +export type NWCInfo = { + lud16: string + secret: string + relayUrl: string + walletPubkey: string + nostrWalletConnectUrl: string +} + +export type Wallet = + | { + type: "webln" + info: WebLNInfo + } + | { + type: "nwc" + info: NWCInfo + } + +export const wallet = synced("wallet", undefined) + +export const getWebLn = () => (window as any).webln + // Alerts export type Alert = { diff --git a/src/assets/icons/QR Code.svg b/src/assets/icons/QR Code.svg new file mode 100644 index 00000000..6eb3412d --- /dev/null +++ b/src/assets/icons/QR Code.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/Wallet.svg b/src/assets/icons/Wallet.svg new file mode 100644 index 00000000..a8b57f70 --- /dev/null +++ b/src/assets/icons/Wallet.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/lib/components/EmojiButton.svelte b/src/lib/components/EmojiButton.svelte index 4e931f2f..714c3933 100644 --- a/src/lib/components/EmojiButton.svelte +++ b/src/lib/components/EmojiButton.svelte @@ -20,7 +20,7 @@ if (popover) { const {x, y, width, height} = popover.popper.getBoundingClientRect() - if (!between([x, x + width], clientX) || !between([y - 30, y + height + 30], clientY)) { + if (!between([x, x + width], clientX) || !between([y - 100, y + height + 100], clientY)) { popover.hide() } } diff --git a/src/lib/components/Icon.svelte b/src/lib/components/Icon.svelte index 39321de0..518986a0 100644 --- a/src/lib/components/Icon.svelte +++ b/src/lib/components/Icon.svelte @@ -68,6 +68,7 @@ import Pallete2 from "@assets/icons/Pallete 2.svg?dataurl" import Paperclip from "@assets/icons/Paperclip.svg?dataurl" import Plain from "@assets/icons/Plain.svg?dataurl" + import QRCode from "@assets/icons/QR Code.svg?dataurl" import QuestionSquare from "@assets/icons/Question Square.svg?dataurl" import RemoteControllerMinimalistic from "@assets/icons/Remote Controller Minimalistic.svg?dataurl" import Rocket2 from "@assets/icons/Rocket 2.svg?dataurl" @@ -90,6 +91,7 @@ import UserHeart from "@assets/icons/User Heart.svg?dataurl" import UserCircle from "@assets/icons/User Circle.svg?dataurl" import UserRounded from "@assets/icons/User Rounded.svg?dataurl" + import Wallet from "@assets/icons/Wallet.svg?dataurl" import Widget from "@assets/icons/Widget.svg?dataurl" import WidgetAdd from "@assets/icons/Widget Add.svg?dataurl" import WiFiRouterRound from "@assets/icons/Wi-Fi Router Round.svg?dataurl" @@ -168,6 +170,7 @@ "pallete-2": Pallete2, paperclip: Paperclip, plain: Plain, + "qr-code": QRCode, "question-square": QuestionSquare, reply: Reply, "remote-controller-minimalistic": RemoteControllerMinimalistic, @@ -190,6 +193,7 @@ "user-heart": UserHeart, "user-circle": UserCircle, "user-rounded": UserRounded, + wallet: Wallet, widget: Widget, "widget-add": WidgetAdd, "wifi-router-round": WiFiRouterRound, diff --git a/src/routes/settings/+layout.svelte b/src/routes/settings/+layout.svelte index 2f7f753c..00da258c 100644 --- a/src/routes/settings/+layout.svelte +++ b/src/routes/settings/+layout.svelte @@ -28,6 +28,11 @@ Profile
+
+ + Wallet + +
Relays diff --git a/src/routes/settings/wallet/+page.svelte b/src/routes/settings/wallet/+page.svelte new file mode 100644 index 00000000..15bd9300 --- /dev/null +++ b/src/routes/settings/wallet/+page.svelte @@ -0,0 +1,87 @@ + + +
+
+
+ + + Wallet + + {#if $wallet} +
+ + Connected +
+ {:else} + + {/if} +
+
+ {#if $wallet} + {#if $wallet?.type === "webln"} + {@const {node, version} = $wallet.info} +
+

+ Connected to {node?.alias || version || "unknown wallet"} + via {$wallet.type} +

+

+ Balance: + {#await getWebLn() + ?.enable() + .then(() => getWebLn().getBalance())} + + {:then res} + {new Intl.NumberFormat(LOCALE).format(res?.balance || 0)} + {:catch} + [unknown] + {/await} + sats +

+
+ {:else if $wallet.type === "nwc"} + {@const {lud16, relayUrl, nostrWalletConnectUrl} = $wallet.info} +
+

+ Connected to {lud16} via {displayRelayUrl(relayUrl)} +

+

+ Balance: + {#await new nwc.NWCClient({nostrWalletConnectUrl}).getBalance()} + + {:then res} + {new Intl.NumberFormat(LOCALE).format(res?.balance || 0)} + {:catch} + [unknown] + {/await} + sats +

+
+ {/if} + + {:else} +

No wallet connected

+ {/if} +
+
+
diff --git a/src/routes/spaces/[relay]/[room]/+page.svelte b/src/routes/spaces/[relay]/[room]/+page.svelte index 0555183a..5a3ff0f8 100644 --- a/src/routes/spaces/[relay]/[room]/+page.svelte +++ b/src/routes/spaces/[relay]/[room]/+page.svelte @@ -13,6 +13,7 @@ MESSAGE, DELETE, REACTION, + ZAP_RESPONSE, ROOM_ADD_USER, ROOM_REMOVE_USER, } from "@welshman/util" @@ -226,7 +227,9 @@ element: element!, relays: [url], feedFilters: [filter], - subscriptionFilters: [{kinds: [DELETE, REACTION, MESSAGE], "#h": [room], since: now()}], + subscriptionFilters: [ + {kinds: [DELETE, REACTION, ZAP_RESPONSE, MESSAGE], "#h": [room], since: now()}, + ], initialEvents: getEventsForUrl(url, [{...filter, limit: 20}]), onExhausted: () => { loadingEvents = false diff --git a/src/routes/spaces/[relay]/calendar/+page.svelte b/src/routes/spaces/[relay]/calendar/+page.svelte index 773d1a84..c07b739a 100644 --- a/src/routes/spaces/[relay]/calendar/+page.svelte +++ b/src/routes/spaces/[relay]/calendar/+page.svelte @@ -5,7 +5,7 @@ import {page} from "$app/stores" import {now, last, formatTimestampAsDate} from "@welshman/lib" import type {TrustedEvent} from "@welshman/util" - import {REACTION, DELETE, EVENT_TIME, getTagValue} from "@welshman/util" + import {REACTION, ZAP_RESPONSE, DELETE, EVENT_TIME, getTagValue} from "@welshman/util" import {fly} from "@lib/transition" import Icon from "@lib/components/Icon.svelte" import Button from "@lib/components/Button.svelte" @@ -93,7 +93,9 @@ onMount(() => { const feedFilters = [{kinds: [EVENT_TIME]}] - const subscriptionFilters = [{kinds: [DELETE, REACTION, EVENT_TIME], since: now()}] + const subscriptionFilters = [ + {kinds: [DELETE, REACTION, ZAP_RESPONSE, EVENT_TIME], since: now()}, + ] ;({events, cleanup} = makeCalendarFeed({ element: element!, diff --git a/src/routes/spaces/[relay]/chat/+page.svelte b/src/routes/spaces/[relay]/chat/+page.svelte index d5610946..183a1574 100644 --- a/src/routes/spaces/[relay]/chat/+page.svelte +++ b/src/routes/spaces/[relay]/chat/+page.svelte @@ -5,7 +5,7 @@ import type {Readable} from "svelte/store" import {now, formatTimestampAsDate} from "@welshman/lib" import type {TrustedEvent, EventContent} from "@welshman/util" - import {makeEvent, MESSAGE, DELETE, REACTION} from "@welshman/util" + import {makeEvent, MESSAGE, DELETE, REACTION, ZAP_RESPONSE} from "@welshman/util" import {pubkey, publishThunk} from "@welshman/app" import {slide, fade, fly} from "@lib/transition" import Icon from "@lib/components/Icon.svelte" @@ -174,7 +174,7 @@ element: element!, relays: [url], feedFilters: [filter], - subscriptionFilters: [{kinds: [DELETE, REACTION, MESSAGE], since: now()}], + subscriptionFilters: [{kinds: [DELETE, REACTION, ZAP_RESPONSE, MESSAGE], since: now()}], initialEvents: getEventsForUrl(url, [{...filter, limit: 20}]), onExhausted: () => { loadingEvents = false diff --git a/src/routes/spaces/[relay]/threads/+page.svelte b/src/routes/spaces/[relay]/threads/+page.svelte index 684144dd..695f35e8 100644 --- a/src/routes/spaces/[relay]/threads/+page.svelte +++ b/src/routes/spaces/[relay]/threads/+page.svelte @@ -3,7 +3,15 @@ import {page} from "$app/stores" import {sortBy, max, nthEq} from "@welshman/lib" import type {TrustedEvent} from "@welshman/util" - import {THREAD, REACTION, DELETE, COMMENT, getListTags, getPubkeyTagValues} from "@welshman/util" + import { + THREAD, + REACTION, + ZAP_RESPONSE, + DELETE, + COMMENT, + getListTags, + getPubkeyTagValues, + } from "@welshman/util" import {userMutes} from "@welshman/app" import {fly} from "@lib/transition" import Icon from "@lib/components/Icon.svelte" @@ -49,7 +57,7 @@ relays: [url], feedFilters: [{kinds: [THREAD, COMMENT]}], subscriptionFilters: [ - {kinds: [THREAD, REACTION, DELETE]}, + {kinds: [THREAD, REACTION, ZAP_RESPONSE, DELETE]}, {kinds: [COMMENT], "#K": [String(THREAD)]}, ], initialEvents: getEventsForUrl(url, [{kinds: [THREAD, COMMENT], limit: 10}]),