diff --git a/package.json b/package.json index 5b566d9..73117f7 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "flatpickr": "^4.6.13", "laravel-echo": "^1.16.1", "laravel-vite-plugin": "^1.0", + "nostr-login": "^1.6.6", "nostr-tools": "^2.7.2", "postcss": "^8.4.41", "pusher-js": "^8.4.0-rc2", diff --git a/resources/js/nostrLogin.js b/resources/js/nostrLogin.js index 518eebe..53299bc 100644 --- a/resources/js/nostrLogin.js +++ b/resources/js/nostrLogin.js @@ -1,29 +1,48 @@ +import {init as initNostrLogin} from 'nostr-login'; + export default () => ({ openNostrLogin() { window.nostr.getPublicKey(); }, - init() { - // listen for nostr auth events - document.addEventListener('nlAuth', (e) => { - // type is login, signup or logout - if (e.detail.type === 'login' || e.detail.type === 'signup') { - console.log('User logged in'); + async init() { + await initNostrLogin({ + methods: ['connect', 'extension'], + onAuth: async (npub, options) => { + console.log('User logged in', npub, options); + console.log('type', options.method); + if (options.method === 'readOnly') { + console.log('User logged in as read-only'); + return; + } + if (options.method === undefined) { + Alpine.store('nostr', {user: null}); + this.$dispatch('nostrLoggedOut', {}); + return; + } + const pubkey = await window.nostr.getPublicKey(); // fetch profile from /api/nostr/profile/{publicKey} - fetch('/api/nostr/profile/' + e.detail.pubkey) + fetch('/api/nostr/profile/' + pubkey) .then(response => response.json()) .then(data => { console.log('Profile fetched', data); // store the profile in AlpineJS store - Alpine.store('nostr', { user: data }); + Alpine.store('nostr', {user: data}); this.$dispatch('nostrLoggedIn', {pubkey: data.pubkey}); + document.addEventListener('nlAuth', (e) => { + // type is login, signup or logout + if (e.detail.type === 'login' || e.detail.type === 'signup') { + + } else { + console.log('User logged out') + Alpine.store('nostr', {user: null}); + this.$dispatch('nostrLoggedOut', {}); + } + }) }); - } else { - console.log('User logged out') - Alpine.store('nostr', { user: null }); } - }) + }); }, }); diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php index 1f6a12a..bf56771 100644 --- a/resources/views/components/layouts/app.blade.php +++ b/resources/views/components/layouts/app.blade.php @@ -9,8 +9,6 @@ @vite(['resources/js/app.js','resources/css/app.css']) @googlefonts - @wireUiScripts @stack('scripts') diff --git a/resources/views/pages/association/election/[Election:year].blade.php b/resources/views/pages/association/election/[Election:year].blade.php index 8d15deb..cb9c31e 100644 --- a/resources/views/pages/association/election/[Election:year].blade.php +++ b/resources/views/pages/association/election/[Election:year].blade.php @@ -46,6 +46,14 @@ mount(function () { } }); +on([ + 'nostrLoggedOut' => function () { + $this->isAllowed = false; + $this->currentPubkey = null; + $this->currentPleb = null; + }, +]); + on([ 'nostrLoggedIn' => function ($pubkey) { $this->currentPubkey = $pubkey; diff --git a/resources/views/pages/association/election/admin/[Election:year].blade.php b/resources/views/pages/association/election/admin/[Election:year].blade.php index 71f92d7..f5465c1 100644 --- a/resources/views/pages/association/election/admin/[Election:year].blade.php +++ b/resources/views/pages/association/election/admin/[Election:year].blade.php @@ -59,6 +59,13 @@ mount(fn() $this->loadBoardVotes(), ]); +on([ + 'nostrLoggedOut' => function () { + $this->currentPubkey = null; + $this->currentPleb = null; + }, +]); + on([ 'nostrLoggedIn' => fn($pubkey) => [ diff --git a/resources/views/pages/association/election/index.blade.php b/resources/views/pages/association/election/index.blade.php index 4f3f374..b0702d0 100644 --- a/resources/views/pages/association/election/index.blade.php +++ b/resources/views/pages/association/election/index.blade.php @@ -23,6 +23,14 @@ mount(function () { ->toArray(); }); +on([ + 'nostrLoggedOut' => function () { + $this->isAllowed = false; + $this->currentPubkey = null; + $this->currentPleb = null; + }, +]); + on([ 'nostrLoggedIn' => function ($pubkey) { $this->currentPubkey = $pubkey; diff --git a/resources/views/pages/association/members/admin.blade.php b/resources/views/pages/association/members/admin.blade.php index d9a6285..a209192 100644 --- a/resources/views/pages/association/members/admin.blade.php +++ b/resources/views/pages/association/members/admin.blade.php @@ -17,6 +17,13 @@ state(['isAllowed' => false]); state(['currentPubkey' => null]); state(['members' => []]); +on([ + 'nostrLoggedOut' => function () { + $this->isAllowed = false; + $this->currentPubkey = null; + }, +]); + on([ 'nostrLoggedIn' => function ($pubkey) { $this->currentPubkey = $pubkey; @@ -24,7 +31,7 @@ on([ ->where('pubkey', $pubkey)->first(); $allowedPubkeys = [ '0adf67475ccc5ca456fd3022e46f5d526eb0af6284bf85494c0dd7847f3e5033', - '430169631f2f0682c60cebb4f902d68f0c71c498fd1711fd982f052cf1fd4279' + '430169631f2f0682c60cebb4f902d68f0c71c498fd1711fd982f052cf1fd4279', ]; if (!in_array($this->currentPubkey, $allowedPubkeys, true)) { return redirect()->route('association.profile'); diff --git a/resources/views/pages/association/profile.blade.php b/resources/views/pages/association/profile.blade.php index 66dc993..40dcbfb 100644 --- a/resources/views/pages/association/profile.blade.php +++ b/resources/views/pages/association/profile.blade.php @@ -48,6 +48,20 @@ updated([ }, ]); +on([ + 'nostrLoggedOut' => function () { + $this->currentPubkey = null; + $this->currentPleb = null; + $this->yearsPaid = []; + $this->events = []; + $this->payments = []; + $this->invoice = null; + $this->qrCode = null; + $this->amountToPay = config('app.env') === 'production' ? 21000 : 1; + $this->currentYearIsPaid = false; + }, +]); + on([ 'nostrLoggedIn' => function ($pubkey) { $this->currentPubkey = $pubkey; diff --git a/yarn.lock b/yarn.lock index bc648ae..0582b99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -171,11 +171,23 @@ resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== +"@noble/ciphers@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-0.2.0.tgz#a12cda60f3cf1ab5d7c77068c3711d2366649ed7" + integrity sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw== + "@noble/ciphers@^0.5.1": version "0.5.3" resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-0.5.3.tgz#48b536311587125e0d0c1535f73ec8375cd76b23" integrity sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w== +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -183,20 +195,13 @@ dependencies: "@noble/hashes" "1.3.2" -"@noble/curves@^1.4.0": +"@noble/curves@^1.4.0", "@noble/curves@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== dependencies: "@noble/hashes" "1.5.0" -"@noble/curves@~1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" - integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== - dependencies: - "@noble/hashes" "1.3.1" - "@noble/hashes@1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" @@ -207,7 +212,7 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/hashes@1.5.0", "@noble/hashes@^1.3.1": +"@noble/hashes@1.5.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== @@ -217,7 +222,7 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== -"@noble/secp256k1@^2.0.0": +"@noble/secp256k1@^2.0.0", "@noble/secp256k1@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-2.1.0.tgz#71d829a0b8ce84aea137708f82273977eea84597" integrity sha512-XLEQQNdablO0XZOIniFQimiXsZDNwaYgL96dZwC54Q30imSbAOFf3NKtepc+cXyuZf5Q1HCgbqgZ2UFFuHVcEw== @@ -261,6 +266,23 @@ utf8-buffer "^1.0.0" websocket-polyfill "^0.0.3" +"@nostr-dev-kit/ndk@^2.3.1": + version "2.10.1" + resolved "https://registry.yarnpkg.com/@nostr-dev-kit/ndk/-/ndk-2.10.1.tgz#6c5aae304c81ca8515141749c906f43da436a943" + integrity sha512-DE4n+wLL8nzja9rwBC1yuDG+fE5aky/ByWQu9H+b8qsq5/iPokFaB87TUbdTMwSzP45qJTTRNVH95NsuXaoqig== + dependencies: + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + "@noble/secp256k1" "^2.1.0" + "@scure/base" "^1.1.9" + debug "^4.3.6" + light-bolt11-decoder "^3.2.0" + nostr-tools "^2.7.1" + tseep "^1.2.2" + typescript-lru-cache "^2.0.0" + utf8-buffer "^1.0.0" + websocket-polyfill "^0.0.3" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -351,7 +373,7 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== -"@scure/base@^1.1.1", "@scure/base@~1.1.0": +"@scure/base@^1.1.1", "@scure/base@^1.1.9", "@scure/base@~1.1.0": version "1.1.9" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== @@ -590,7 +612,7 @@ debug@^2.2.0: dependencies: ms "2.0.0" -debug@^4.3.4: +debug@^4.3.4, debug@^4.3.6: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -887,7 +909,7 @@ laravel-vite-plugin@^1.0: picocolors "^1.0.0" vite-plugin-full-reload "^1.1.0" -light-bolt11-decoder@^3.0.0: +light-bolt11-decoder@^3.0.0, light-bolt11-decoder@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/light-bolt11-decoder/-/light-bolt11-decoder-3.2.0.tgz#2d48f78386cde526c4131db8f9dfd3250a2d5d4d" integrity sha512-3QEofgiBOP4Ehs9BI+RkZdXZNtSys0nsJ6fyGeSiAGCBsMwHGUDS/JQlY/sTnWs91A2Nh0S9XXfA8Sy9g6QpuQ== @@ -1007,6 +1029,27 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +nostr-login@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/nostr-login/-/nostr-login-1.6.6.tgz#a3af07b4b7179c31c40ab432ea06f0ccca965fb2" + integrity sha512-XOpB9nG3Qgt7iea7gA1zn4TaTfUKCKGdCHKwErqLPtMk/q1Rhkzj5cq/66iU0WqC6mSiwENfTy1p4qaM7HzMtg== + dependencies: + "@nostr-dev-kit/ndk" "^2.3.1" + nostr-tools "^1.17.0" + tseep "^1.2.1" + +nostr-tools@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/nostr-tools/-/nostr-tools-1.17.0.tgz#b6f62e32fedfd9e68ec0a7ce57f74c44fc768e8c" + integrity sha512-LZmR8GEWKZeElbFV5Xte75dOeE9EFUW/QLI1Ncn3JKn0kFddDKEfBbFN8Mu4TMs+L4HR/WTPha2l+PPuRnJcMw== + dependencies: + "@noble/ciphers" "0.2.0" + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/base" "1.1.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + nostr-tools@^2.7.1, nostr-tools@^2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/nostr-tools/-/nostr-tools-2.7.2.tgz#74a6ff543a81da1dcce9563b9317faa17221acce" @@ -1346,7 +1389,7 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tseep@^1.1.1: +tseep@^1.1.1, tseep@^1.2.1, tseep@^1.2.2: version "1.3.1" resolved "https://registry.yarnpkg.com/tseep/-/tseep-1.3.1.tgz#734c5f7ca37cb8af4e4e0a5c205742673562a10e" integrity sha512-ZPtfk1tQnZVyr7BPtbJ93qaAh2lZuIOpTMjhrYa4XctT8xe7t4SAW9LIxrySDuYMsfNNayE51E/WNGrNVgVicQ==