add basic views for groups

This commit is contained in:
hzrd149 2025-01-23 16:05:43 -06:00
parent 54a9c26901
commit c88e2df5f0
16 changed files with 361 additions and 169 deletions

View File

@ -55,7 +55,7 @@
"applesauce-factory": "next",
"applesauce-lists": "next",
"applesauce-loaders": "next",
"applesauce-net": "next",
"applesauce-net": "^0.10.0",
"applesauce-react": "next",
"applesauce-signer": "next",
"bech32": "^2.0.0",
@ -75,7 +75,7 @@
"framer-motion": "^10.18.0",
"gif-picker-react": "^1.4.0",
"handlebars": "^4.7.8",
"hls.js": "^1.5.19",
"hls.js": "^1.5.20",
"i18n-iso-countries": "^7.13.0",
"idb": "^8.0.1",
"identicon.js": "^2.3.3",
@ -164,7 +164,7 @@
"camelcase": "^8.0.0",
"eventemitter3": "^5.0.1",
"typescript": "^5.7.3",
"vite": "^5.4.12",
"vite": "^5.4.14",
"vite-plugin-pwa": "^0.21.1",
"vite-tsconfig-paths": "^5.1.4",
"workbox-build": "^7.3.0",

300
pnpm-lock.yaml generated
View File

@ -104,31 +104,31 @@ importers:
version: 0.7.2
applesauce-channel:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
version: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-content:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
version: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-core:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
version: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-factory:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
version: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-lists:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
version: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-loaders:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
version: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-net:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
specifier: ^0.10.0
version: 0.10.0(typescript@5.7.3)
applesauce-react:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
version: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-signer:
specifier: next
version: 0.0.0-next-20250120191411(typescript@5.7.3)
version: 0.0.0-next-20250123215242(typescript@5.7.3)
bech32:
specifier: ^2.0.0
version: 2.0.0
@ -181,8 +181,8 @@ importers:
specifier: ^4.7.8
version: 4.7.8
hls.js:
specifier: ^1.5.19
version: 1.5.19
specifier: ^1.5.20
version: 1.5.20
i18n-iso-countries:
specifier: ^7.13.0
version: 7.13.0
@ -269,7 +269,7 @@ importers:
version: 9.0.3(@types/react@18.3.18)(react@19.0.0)
react-mosaic-component:
specifier: ^6.1.1
version: 6.1.1(@types/node@22.10.7)(@types/react@18.3.18)(dnd-core@16.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
version: 6.1.1(@types/node@22.10.10)(@types/react@18.3.18)(dnd-core@16.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-photo-album:
specifier: ^2.4.1
version: 2.4.1(react@19.0.0)
@ -363,7 +363,7 @@ importers:
version: 6.0.2(@capacitor/core@6.2.0)
'@capacitor/assets':
specifier: ^3.0.5
version: 3.0.5(@types/node@22.10.7)(typescript@5.7.3)
version: 3.0.5(@types/node@22.10.10)(typescript@5.7.3)
'@capacitor/cli':
specifier: ^6.2.0
version: 6.2.0
@ -432,7 +432,7 @@ importers:
version: 0.8.7
'@vitejs/plugin-react':
specifier: ^4.3.4
version: 4.3.4(vite@5.4.12(@types/node@22.10.7)(terser@5.37.0))
version: 4.3.4(vite@5.4.14(@types/node@22.10.10)(terser@5.37.0))
camelcase:
specifier: ^8.0.0
version: 8.0.0
@ -443,14 +443,14 @@ importers:
specifier: ^5.7.3
version: 5.7.3
vite:
specifier: ^5.4.12
version: 5.4.12(@types/node@22.10.7)(terser@5.37.0)
specifier: ^5.4.14
version: 5.4.14(@types/node@22.10.10)(terser@5.37.0)
vite-plugin-pwa:
specifier: ^0.21.1
version: 0.21.1(vite@5.4.12(@types/node@22.10.7)(terser@5.37.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0)
version: 0.21.1(vite@5.4.14(@types/node@22.10.10)(terser@5.37.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0)
vite-tsconfig-paths:
specifier: ^5.1.4
version: 5.1.4(typescript@5.7.3)(vite@5.4.12(@types/node@22.10.7)(terser@5.37.0))
version: 5.1.4(typescript@5.7.3)(vite@5.4.14(@types/node@22.10.10)(terser@5.37.0))
workbox-build:
specifier: ^7.3.0
version: 7.3.0(@types/babel__core@7.20.5)
@ -1954,8 +1954,8 @@ packages:
'@types/fs-extra@8.1.5':
resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==}
'@types/geojson@7946.0.15':
resolution: {integrity: sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==}
'@types/geojson@7946.0.16':
resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
@ -2005,8 +2005,8 @@ packages:
'@types/node@12.20.55':
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
'@types/node@22.10.7':
resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==}
'@types/node@22.10.10':
resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==}
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@ -2096,8 +2096,8 @@ packages:
react: '>=16.8.0'
react-dom: '>=16.8.0'
'@ungap/structured-clone@1.2.1':
resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==}
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
'@vitejs/plugin-react@4.3.4':
resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
@ -2195,32 +2195,35 @@ packages:
engines: {node: '>=8.0.0'}
hasBin: true
applesauce-channel@0.0.0-next-20250120191411:
resolution: {integrity: sha512-EhMC195fKq8Tez16Zl/ck1Pl+jhfkjyJNxyD5N3SQQkBjlKeI6W1gQiOi6mEqjVtnfRoHyhva7GLnuZvTYiOMA==}
applesauce-channel@0.0.0-next-20250123215242:
resolution: {integrity: sha512-Hnad4rOAZOBknAwbe+D3NgmOwHiaDs0bb0753uWapg4hCoJdxJnkGVv1cO5afDsOjJKXSmxtzh9A0n/JEAr7uA==}
applesauce-content@0.0.0-next-20250120191411:
resolution: {integrity: sha512-3ecwZCk35xttSi8M5GN8r6AWqSUF4RqkrSCnxH2i/Mk5L97q1PJdjRaBlQNGkKzmacZRUasFuiCuNqvKFh2+aQ==}
applesauce-content@0.0.0-next-20250123215242:
resolution: {integrity: sha512-OKzIlcuSim6vHzw/4yJpAhcIIy2hHEo58GP50btmn4BhWDf0cLNHw/X3GRRep3+5GHnYIFcNXmne/ngySwW9QA==}
applesauce-core@0.0.0-next-20250120191411:
resolution: {integrity: sha512-fgqqYpaBWBudk6jdPLNKkAtCVETkcsdFwerjPCcc6+CKcGktP/JO/xhyQUo2uuY+6ED9p840Efor0dzRoBTVAQ==}
applesauce-core@0.0.0-next-20250123215242:
resolution: {integrity: sha512-k7407vczwk6vcYJcr/d/32HWT4MGEZ4aDR57s79kkRg5SDcUyiksroZvn+u1YTldsQ57Ap9v2fuN1HlsJmNDOA==}
applesauce-factory@0.0.0-next-20250120191411:
resolution: {integrity: sha512-MOd2fdpdmehgH3XqxUvWnm0cc1DRjRpHXnBvfG0L5t4/3u/WyzJOAXWV+IOrb3JuyBsYq9jFPI54KJE6kgTNow==}
applesauce-core@0.10.0:
resolution: {integrity: sha512-QMhUh4FIARcqY5soCB4Z8DIu+py0rYb28IgWT4gP9DLBGpDrY8lStXk7W1/46TLjEH97y0hbiXFK7kMCZ31oOQ==}
applesauce-lists@0.0.0-next-20250120191411:
resolution: {integrity: sha512-b7z4mYilwUySHPKOYbjpWbYAorbbZw38LjGD7iBMfMdigMiOIzW1daeU+hYLj4aJtGwMqchQKvOfIFTqqXcSYQ==}
applesauce-factory@0.0.0-next-20250123215242:
resolution: {integrity: sha512-kTk1yz/iFHgtkFA/0/EicfWG2yVv7UsZN/AKKp7FZPVXOWZVpVVWeXAvwayMsb8UnY4jpfAHYfBOYzj2Uo3ZEg==}
applesauce-loaders@0.0.0-next-20250120191411:
resolution: {integrity: sha512-i6kV1r2yNCygS6fSV7U0AR97tR3b/IszEIjFzYDI0U6ZwZPe5Efoh15NsFZBVdofCewrwr/iidaCyvBj/3ZJZA==}
applesauce-lists@0.0.0-next-20250123215242:
resolution: {integrity: sha512-zqf1bhOlBVp+X9RRAhe4A/O6IUkxjh3aL8INviXIVEC9sj9+mtWTOY4sg2EToc9cyh0ub+uZyzKWQWgHVYHV1A==}
applesauce-net@0.0.0-next-20250120191411:
resolution: {integrity: sha512-B2fGuXKdOXEuHca0aIhtS9hTZd6aeEnqnfHGVidMFq8dOEUo+eYauI/0RsrdWHiK/ADqawrViOACZplqS73M5A==}
applesauce-loaders@0.0.0-next-20250123215242:
resolution: {integrity: sha512-gcXV5IebXr55ovgqoF3FHvsE5HmWrmlDJiuWuIFB4vPLEafe1xY6GvpLVKCYIFgUxvtRdJjMyH4g2IvfMbW/xw==}
applesauce-react@0.0.0-next-20250120191411:
resolution: {integrity: sha512-+e+DNw+4KjUuW7q3wKD1R/evcjFXaEC6BRDJaFuL5yRkV6yCAFkgX/X6gduyggRKfJbtXVbnorC5eazAtyoQfA==}
applesauce-net@0.10.0:
resolution: {integrity: sha512-ZsAs/MkeGHiPZ2/a8lwP8lx/Eh+5Dot0qG4BLTAqjg4emP/RsiqW+hyc6v6QcVbdvuR0+hP1gka3+wWtiy/cTA==}
applesauce-signer@0.0.0-next-20250120191411:
resolution: {integrity: sha512-B/2fb96BYB7mZf4XzE916qMy63dXlVsVewEZu80Y4XDD400xV+0+ZfjTnBvCg2ruCOMcqV23KQoqbNOvVnqZjg==}
applesauce-react@0.0.0-next-20250123215242:
resolution: {integrity: sha512-ekf0EqJEGunNvmExzXuCBe4SqowBZZ0u61cDg1NS8vgjvYKyan4QsGYPCtLvmR9M/3g3nd03xhTTMmXkx9+Iiw==}
applesauce-signer@0.0.0-next-20250123215242:
resolution: {integrity: sha512-YuqOsW35mr1cwqudjw9+Pkti0MdmsJawmIT9zluPoUk8PcGv/sOwRZCi2DrG6U+VUmfwMC+OU4L77QITyG2nwQ==}
arg@4.1.3:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
@ -2264,6 +2267,10 @@ packages:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
async-function@1.0.0:
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
engines: {node: '>= 0.4'}
async@3.2.6:
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
@ -3032,8 +3039,8 @@ packages:
engines: {node: '>=0.10.0'}
hasBin: true
electron-to-chromium@1.5.84:
resolution: {integrity: sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==}
electron-to-chromium@1.5.87:
resolution: {integrity: sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==}
elementtree@0.1.7:
resolution: {integrity: sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==}
@ -3207,8 +3214,8 @@ packages:
fast-shallow-equal@1.0.0:
resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==}
fast-uri@3.0.5:
resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==}
fast-uri@3.0.6:
resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
fast-xml-parser@4.5.1:
resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==}
@ -3513,8 +3520,8 @@ packages:
resolution: {integrity: sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==}
engines: {node: '>=8'}
hls.js@1.5.19:
resolution: {integrity: sha512-C020dKWEJcyvLnrqsFKW4q6D/6IEzKWdhktIS5bgoyEFE8lHgrFBq4RIngdy113abJOlIruhv8qjg7UX8hwxOw==}
hls.js@1.5.20:
resolution: {integrity: sha512-uu0VXUK52JhihhnN/MVVo1lvqNNuhoxkonqgO3IpjvQiGpJBdIXMGkofjQb/j9zvV7a1SW8U9g1FslWx/1HOiQ==}
hoist-non-react-statics@3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
@ -3657,8 +3664,8 @@ packages:
is-arrayish@0.3.2:
resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
is-async-function@2.1.0:
resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==}
is-async-function@2.1.1:
resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
engines: {node: '>= 0.4'}
is-bigint@1.1.0:
@ -4210,8 +4217,8 @@ packages:
micromark-util-sanitize-uri@2.0.1:
resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
micromark-util-subtokenize@2.0.3:
resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==}
micromark-util-subtokenize@2.0.4:
resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==}
micromark-util-symbol@2.0.1:
resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
@ -4341,8 +4348,8 @@ packages:
engines: {node: ^18 || >=20}
hasBin: true
napi-build-utils@1.0.2:
resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
napi-build-utils@2.0.0:
resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==}
native-run@2.0.1:
resolution: {integrity: sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==}
@ -4470,8 +4477,8 @@ packages:
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
oniguruma-to-es@2.2.0:
resolution: {integrity: sha512-EEsso27ri0sf+t4uRFEj5C5gvXQj0d0w1Y2qq06b+hDLBnvzO1rWTwEW4C7ytan6nhg4WPwE26eLoiPhHUbvKg==}
oniguruma-to-es@2.3.0:
resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==}
open@8.4.2:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
@ -4640,8 +4647,8 @@ packages:
preact@10.25.4:
resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==}
prebuild-install@7.1.2:
resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==}
prebuild-install@7.1.3:
resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==}
engines: {node: '>=10'}
hasBin: true
@ -4884,8 +4891,8 @@ packages:
'@types/react':
optional: true
react-remove-scroll@2.6.2:
resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==}
react-remove-scroll@2.6.3:
resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^18.2.22
@ -5525,8 +5532,8 @@ packages:
peerDependencies:
three: '>=0.118.3'
three-render-objects@1.37.0:
resolution: {integrity: sha512-k/OBwmjVyUwAMJGjvqGI9ISXaR7uWopuwLPZW3thi/w/97Rd4ZgcnioAPn6OD3wfN6P6Mm12ioEGdJjBJzDg9Q==}
three-render-objects@1.38.1:
resolution: {integrity: sha512-w51UYkIXnyULX9b7m8fJCDHy9HSviCbubYFIpI4Ox5gluAXRlKDvYg2E9ZKhBf4SXr1ieCpPLVfqLwWfo+ceRA==}
engines: {node: '>=12'}
peerDependencies:
three: '>=0.168'
@ -5870,8 +5877,8 @@ packages:
vite:
optional: true
vite@5.4.12:
resolution: {integrity: sha512-KwUaKB27TvWwDJr1GjjWthLMATbGEbeWYZIbGZ5qFIsgPP3vWzLu4cVooqhm5/Z2SPDUMjyPVjTztm5tYKwQxA==}
vite@5.4.14:
resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@ -6168,7 +6175,7 @@ snapshots:
kapsule: 1.16.0
three: 0.170.0
three-forcegraph: 1.42.12(three@0.170.0)
three-render-objects: 1.37.0(three@0.170.0)
three-render-objects: 1.38.1(three@0.170.0)
'@ampproject/remapping@2.3.0':
dependencies:
@ -6854,12 +6861,12 @@ snapshots:
dependencies:
'@capacitor/core': 6.2.0
'@capacitor/assets@3.0.5(@types/node@22.10.7)(typescript@5.7.3)':
'@capacitor/assets@3.0.5(@types/node@22.10.10)(typescript@5.7.3)':
dependencies:
'@capacitor/cli': 5.7.8
'@ionic/utils-array': 2.1.6
'@ionic/utils-fs': 3.1.7
'@trapezedev/project': 7.1.3(@types/node@22.10.7)(typescript@5.7.3)
'@trapezedev/project': 7.1.3(@types/node@22.10.10)(typescript@5.7.3)
commander: 8.3.0
debug: 4.3.4
fs-extra: 10.1.0
@ -7045,7 +7052,7 @@ snapshots:
react-dom: 19.0.0(react@19.0.0)
react-fast-compare: 3.2.2
react-focus-lock: 2.13.5(@types/react@18.3.18)(react@19.0.0)
react-remove-scroll: 2.6.2(@types/react@18.3.18)(react@19.0.0)
react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@19.0.0)
transitivePeerDependencies:
- '@types/react'
@ -8039,7 +8046,7 @@ snapshots:
dependencies:
'@shikijs/types': 1.29.1
'@shikijs/vscode-textmate': 10.0.1
oniguruma-to-es: 2.2.0
oniguruma-to-es: 2.3.0
'@shikijs/engine-oniguruma@1.29.1':
dependencies:
@ -8083,7 +8090,7 @@ snapshots:
'@trapezedev/gradle-parse@7.1.3': {}
'@trapezedev/project@7.1.3(@types/node@22.10.7)(typescript@5.7.3)':
'@trapezedev/project@7.1.3(@types/node@22.10.10)(typescript@5.7.3)':
dependencies:
'@ionic/utils-fs': 3.1.7
'@ionic/utils-subprocess': 2.1.14
@ -8105,7 +8112,7 @@ snapshots:
replace: 1.2.2
tempy: 1.0.1
tmp: 0.2.3
ts-node: 10.9.2(@types/node@22.10.7)(typescript@5.7.3)
ts-node: 10.9.2(@types/node@22.10.10)(typescript@5.7.3)
xcode: 3.0.1
xml-js: 1.6.11
xpath: 0.0.32
@ -8186,9 +8193,9 @@ snapshots:
'@types/fs-extra@8.1.5':
dependencies:
'@types/node': 22.10.7
'@types/node': 22.10.10
'@types/geojson@7946.0.15': {}
'@types/geojson@7946.0.16': {}
'@types/hast@3.0.4':
dependencies:
@ -8206,7 +8213,7 @@ snapshots:
'@types/leaflet@1.9.16':
dependencies:
'@types/geojson': 7946.0.15
'@types/geojson': 7946.0.16
'@types/lodash.mergewith@4.6.7':
dependencies:
@ -8236,7 +8243,7 @@ snapshots:
'@types/node@12.20.55': {}
'@types/node@22.10.7':
'@types/node@22.10.10':
dependencies:
undici-types: 6.20.0
@ -8333,16 +8340,16 @@ snapshots:
- '@codemirror/lint'
- '@codemirror/search'
'@ungap/structured-clone@1.2.1': {}
'@ungap/structured-clone@1.3.0': {}
'@vitejs/plugin-react@4.3.4(vite@5.4.12(@types/node@22.10.7)(terser@5.37.0))':
'@vitejs/plugin-react@4.3.4(vite@5.4.14(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
vite: 5.4.12(@types/node@22.10.7)(terser@5.37.0)
vite: 5.4.14(@types/node@22.10.10)(terser@5.37.0)
transitivePeerDependencies:
- supports-color
@ -8409,7 +8416,7 @@ snapshots:
ajv@8.17.1:
dependencies:
fast-deep-equal: 3.1.3
fast-uri: 3.0.5
fast-uri: 3.0.6
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
@ -8429,23 +8436,23 @@ snapshots:
dependencies:
entities: 2.2.0
applesauce-channel@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-channel@0.0.0-next-20250123215242(typescript@5.7.3):
dependencies:
applesauce-core: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-factory: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-factory: 0.0.0-next-20250123215242(typescript@5.7.3)
nostr-tools: 2.10.4(typescript@5.7.3)
rxjs: 7.8.1
transitivePeerDependencies:
- supports-color
- typescript
applesauce-content@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-content@0.0.0-next-20250123215242(typescript@5.7.3):
dependencies:
'@cashu/cashu-ts': 2.0.0-rc1
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
'@types/unist': 3.0.3
applesauce-core: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250123215242(typescript@5.7.3)
mdast-util-find-and-replace: 3.0.2
nostr-tools: 2.10.4(typescript@5.7.3)
remark: 15.0.1
@ -8456,7 +8463,7 @@ snapshots:
- supports-color
- typescript
applesauce-core@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-core@0.0.0-next-20250123215242(typescript@5.7.3):
dependencies:
'@scure/base': 1.2.4
debug: 4.4.0
@ -8470,23 +8477,37 @@ snapshots:
- supports-color
- typescript
applesauce-factory@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-core@0.10.0(typescript@5.7.3):
dependencies:
applesauce-content: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250120191411(typescript@5.7.3)
'@scure/base': 1.2.4
debug: 4.4.0
fast-deep-equal: 3.1.3
hash-sum: 2.0.0
light-bolt11-decoder: 3.2.0
nanoid: 5.0.9
nostr-tools: 2.10.4(typescript@5.7.3)
rxjs: 7.8.1
transitivePeerDependencies:
- supports-color
- typescript
applesauce-factory@0.0.0-next-20250123215242(typescript@5.7.3):
dependencies:
applesauce-content: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250123215242(typescript@5.7.3)
nostr-tools: 2.10.4(typescript@5.7.3)
transitivePeerDependencies:
- supports-color
- typescript
applesauce-lists@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-lists@0.0.0-next-20250123215242(typescript@5.7.3):
dependencies:
'@noble/hashes': 1.7.1
'@noble/secp256k1': 1.7.1
'@scure/base': 1.2.4
'@types/dom-serial': 1.0.6
applesauce-core: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-factory: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-factory: 0.0.0-next-20250123215242(typescript@5.7.3)
debug: 4.4.0
nostr-tools: 2.10.4(typescript@5.7.3)
rxjs: 7.8.1
@ -8494,9 +8515,9 @@ snapshots:
- supports-color
- typescript
applesauce-loaders@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-loaders@0.0.0-next-20250123215242(typescript@5.7.3):
dependencies:
applesauce-core: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250123215242(typescript@5.7.3)
nanoid: 5.0.9
nostr-tools: 2.10.4(typescript@5.7.3)
rx-nostr: 3.5.0
@ -8505,9 +8526,9 @@ snapshots:
- supports-color
- typescript
applesauce-net@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-net@0.10.0(typescript@5.7.3):
dependencies:
applesauce-core: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-core: 0.10.0(typescript@5.7.3)
nanoid: 5.0.9
nostr-tools: 2.10.4(typescript@5.7.3)
rxjs: 7.8.1
@ -8515,11 +8536,11 @@ snapshots:
- supports-color
- typescript
applesauce-react@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-react@0.0.0-next-20250123215242(typescript@5.7.3):
dependencies:
applesauce-content: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-factory: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-content: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250123215242(typescript@5.7.3)
applesauce-factory: 0.0.0-next-20250123215242(typescript@5.7.3)
nostr-tools: 2.10.4(typescript@5.7.3)
react: 18.3.1
rxjs: 7.8.1
@ -8527,13 +8548,13 @@ snapshots:
- supports-color
- typescript
applesauce-signer@0.0.0-next-20250120191411(typescript@5.7.3):
applesauce-signer@0.0.0-next-20250123215242(typescript@5.7.3):
dependencies:
'@noble/hashes': 1.7.1
'@noble/secp256k1': 1.7.1
'@scure/base': 1.2.4
'@types/dom-serial': 1.0.6
applesauce-core: 0.0.0-next-20250120191411(typescript@5.7.3)
applesauce-core: 0.0.0-next-20250123215242(typescript@5.7.3)
debug: 4.4.0
nanoid: 5.0.9
nostr-tools: 2.10.4(typescript@5.7.3)
@ -8580,6 +8601,8 @@ snapshots:
astral-regex@2.0.0: {}
async-function@1.0.0: {}
async@3.2.6: {}
at-least-node@1.0.0: {}
@ -8664,7 +8687,7 @@ snapshots:
better-sqlite3@11.8.1:
dependencies:
bindings: 1.5.0
prebuild-install: 7.1.2
prebuild-install: 7.1.3
bezier-js@6.1.4: {}
@ -8756,7 +8779,7 @@ snapshots:
browserslist@4.24.4:
dependencies:
caniuse-lite: 1.0.30001695
electron-to-chromium: 1.5.84
electron-to-chromium: 1.5.87
node-releases: 2.0.19
update-browserslist-db: 1.1.2(browserslist@4.24.4)
@ -9453,7 +9476,7 @@ snapshots:
dependencies:
jake: 10.9.2
electron-to-chromium@1.5.84: {}
electron-to-chromium@1.5.87: {}
elementtree@0.1.7:
dependencies:
@ -9696,7 +9719,7 @@ snapshots:
fast-shallow-equal@1.0.0: {}
fast-uri@3.0.5: {}
fast-uri@3.0.6: {}
fast-xml-parser@4.5.1:
dependencies:
@ -10055,7 +10078,7 @@ snapshots:
hexoid@2.0.0: {}
hls.js@1.5.19: {}
hls.js@1.5.20: {}
hoist-non-react-statics@3.3.2:
dependencies:
@ -10185,8 +10208,9 @@ snapshots:
is-arrayish@0.3.2: {}
is-async-function@2.1.0:
is-async-function@2.1.1:
dependencies:
async-function: 1.0.0
call-bound: 1.0.3
get-proto: 1.0.1
has-tostringtag: 1.0.2
@ -10645,7 +10669,7 @@ snapshots:
dependencies:
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
'@ungap/structured-clone': 1.2.1
'@ungap/structured-clone': 1.3.0
devlop: 1.1.0
micromark-util-sanitize-uri: 2.0.1
trim-lines: 3.0.1
@ -10738,7 +10762,7 @@ snapshots:
micromark-util-html-tag-name: 2.0.1
micromark-util-normalize-identifier: 2.0.1
micromark-util-resolve-all: 2.0.1
micromark-util-subtokenize: 2.0.3
micromark-util-subtokenize: 2.0.4
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.1
@ -10885,7 +10909,7 @@ snapshots:
micromark-util-encode: 2.0.1
micromark-util-symbol: 2.0.1
micromark-util-subtokenize@2.0.3:
micromark-util-subtokenize@2.0.4:
dependencies:
devlop: 1.1.0
micromark-util-chunked: 2.0.1
@ -10912,7 +10936,7 @@ snapshots:
micromark-util-normalize-identifier: 2.0.1
micromark-util-resolve-all: 2.0.1
micromark-util-sanitize-uri: 2.0.1
micromark-util-subtokenize: 2.0.3
micromark-util-subtokenize: 2.0.4
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.1
transitivePeerDependencies:
@ -11026,7 +11050,7 @@ snapshots:
nanoid@5.0.9: {}
napi-build-utils@1.0.2: {}
napi-build-utils@2.0.0: {}
native-run@2.0.1:
dependencies:
@ -11177,7 +11201,7 @@ snapshots:
dependencies:
wrappy: 1.0.2
oniguruma-to-es@2.2.0:
oniguruma-to-es@2.3.0:
dependencies:
emoji-regex-xs: 1.0.0
regex: 5.1.1
@ -11340,14 +11364,14 @@ snapshots:
preact@10.25.4: {}
prebuild-install@7.1.2:
prebuild-install@7.1.3:
dependencies:
detect-libc: 2.0.3
expand-template: 2.0.3
github-from-package: 0.0.0
minimist: 1.2.8
mkdirp-classic: 0.5.3
napi-build-utils: 1.0.2
napi-build-utils: 2.0.0
node-abi: 3.73.0
pump: 3.0.2
rc: 1.2.8
@ -11474,26 +11498,26 @@ snapshots:
dependencies:
dnd-core: 16.0.1
react-dnd-multi-backend@8.1.2(dnd-core@16.0.1)(react-dnd@16.0.1(@types/node@22.10.7)(@types/react@18.3.18)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
react-dnd-multi-backend@8.1.2(dnd-core@16.0.1)(react-dnd@16.0.1(@types/node@22.10.10)(@types/react@18.3.18)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
dnd-core: 16.0.1
dnd-multi-backend: 8.1.2(dnd-core@16.0.1)
react: 19.0.0
react-dnd: 16.0.1(@types/node@22.10.7)(@types/react@18.3.18)(react@19.0.0)
react-dnd-preview: 8.1.2(react-dnd@16.0.1(@types/node@22.10.7)(@types/react@18.3.18)(react@19.0.0))(react@19.0.0)
react-dnd: 16.0.1(@types/node@22.10.10)(@types/react@18.3.18)(react@19.0.0)
react-dnd-preview: 8.1.2(react-dnd@16.0.1(@types/node@22.10.10)(@types/react@18.3.18)(react@19.0.0))(react@19.0.0)
react-dom: 19.0.0(react@19.0.0)
react-dnd-preview@8.1.2(react-dnd@16.0.1(@types/node@22.10.7)(@types/react@18.3.18)(react@19.0.0))(react@19.0.0):
react-dnd-preview@8.1.2(react-dnd@16.0.1(@types/node@22.10.10)(@types/react@18.3.18)(react@19.0.0))(react@19.0.0):
dependencies:
react: 19.0.0
react-dnd: 16.0.1(@types/node@22.10.7)(@types/react@18.3.18)(react@19.0.0)
react-dnd: 16.0.1(@types/node@22.10.10)(@types/react@18.3.18)(react@19.0.0)
react-dnd-touch-backend@16.0.1:
dependencies:
'@react-dnd/invariant': 4.0.2
dnd-core: 16.0.1
react-dnd@16.0.1(@types/node@22.10.7)(@types/react@18.3.18)(react@19.0.0):
react-dnd@16.0.1(@types/node@22.10.10)(@types/react@18.3.18)(react@19.0.0):
dependencies:
'@react-dnd/invariant': 4.0.2
'@react-dnd/shallowequal': 4.0.2
@ -11502,7 +11526,7 @@ snapshots:
hoist-non-react-statics: 3.3.2
react: 19.0.0
optionalDependencies:
'@types/node': 22.10.7
'@types/node': 22.10.10
'@types/react': 18.3.18
react-dom@19.0.0(react@19.0.0):
@ -11571,7 +11595,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
react-mosaic-component@6.1.1(@types/node@22.10.7)(@types/react@18.3.18)(dnd-core@16.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
react-mosaic-component@6.1.1(@types/node@22.10.10)(@types/react@18.3.18)(dnd-core@16.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
classnames: 2.5.1
immutability-helper: 3.1.1
@ -11579,9 +11603,9 @@ snapshots:
prop-types: 15.8.1
rdndmb-html5-to-touch: 8.1.2(dnd-core@16.0.1)
react: 19.0.0
react-dnd: 16.0.1(@types/node@22.10.7)(@types/react@18.3.18)(react@19.0.0)
react-dnd: 16.0.1(@types/node@22.10.10)(@types/react@18.3.18)(react@19.0.0)
react-dnd-html5-backend: 16.0.1
react-dnd-multi-backend: 8.1.2(dnd-core@16.0.1)(react-dnd@16.0.1(@types/node@22.10.7)(@types/react@18.3.18)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-dnd-multi-backend: 8.1.2(dnd-core@16.0.1)(react-dnd@16.0.1(@types/node@22.10.10)(@types/react@18.3.18)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-dnd-touch-backend: 16.0.1
uuid: 9.0.1
transitivePeerDependencies:
@ -11613,7 +11637,7 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.18
react-remove-scroll@2.6.2(@types/react@18.3.18)(react@19.0.0):
react-remove-scroll@2.6.3(@types/react@18.3.18)(react@19.0.0):
dependencies:
react: 19.0.0
react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@19.0.0)
@ -12058,7 +12082,7 @@ snapshots:
color: 4.2.3
detect-libc: 2.0.3
node-addon-api: 6.1.0
prebuild-install: 7.1.2
prebuild-install: 7.1.3
semver: 7.6.3
simple-get: 4.0.1
tar-fs: 3.0.8
@ -12424,7 +12448,7 @@ snapshots:
three: 0.170.0
tinycolor2: 1.6.0
three-render-objects@1.37.0(three@0.170.0):
three-render-objects@1.38.1(three@0.170.0):
dependencies:
'@tweenjs/tween.js': 25.0.0
accessor-fn: 1.5.1
@ -12505,14 +12529,14 @@ snapshots:
ts-easing@0.2.0: {}
ts-node@10.9.2(@types/node@22.10.7)(typescript@5.7.3):
ts-node@10.9.2(@types/node@22.10.10)(typescript@5.7.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
'@types/node': 22.10.7
'@types/node': 22.10.10
acorn: 8.14.0
acorn-walk: 8.3.4
arg: 4.1.3
@ -12727,35 +12751,35 @@ snapshots:
vite-plugin-funding@0.1.0: {}
vite-plugin-pwa@0.21.1(vite@5.4.12(@types/node@22.10.7)(terser@5.37.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0):
vite-plugin-pwa@0.21.1(vite@5.4.14(@types/node@22.10.10)(terser@5.37.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0):
dependencies:
debug: 4.4.0
pretty-bytes: 6.1.1
tinyglobby: 0.2.10
vite: 5.4.12(@types/node@22.10.7)(terser@5.37.0)
vite: 5.4.14(@types/node@22.10.10)(terser@5.37.0)
workbox-build: 7.3.0(@types/babel__core@7.20.5)
workbox-window: 7.3.0
transitivePeerDependencies:
- supports-color
vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@5.4.12(@types/node@22.10.7)(terser@5.37.0)):
vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@5.4.14(@types/node@22.10.10)(terser@5.37.0)):
dependencies:
debug: 4.4.0
globrex: 0.1.2
tsconfck: 3.1.4(typescript@5.7.3)
optionalDependencies:
vite: 5.4.12(@types/node@22.10.7)(terser@5.37.0)
vite: 5.4.14(@types/node@22.10.10)(terser@5.37.0)
transitivePeerDependencies:
- supports-color
- typescript
vite@5.4.12(@types/node@22.10.7)(terser@5.37.0):
vite@5.4.14(@types/node@22.10.10)(terser@5.37.0):
dependencies:
esbuild: 0.21.5
postcss: 8.5.1
rollup: 4.31.0
optionalDependencies:
'@types/node': 22.10.7
'@types/node': 22.10.10
fsevents: 2.3.3
terser: 5.37.0
@ -12805,7 +12829,7 @@ snapshots:
call-bound: 1.0.3
function.prototype.name: 1.1.8
has-tostringtag: 1.0.2
is-async-function: 2.1.0
is-async-function: 2.1.1
is-date-object: 1.1.0
is-finalizationregistry: 1.1.1
is-generator-function: 1.1.0

View File

@ -47,6 +47,7 @@ import bookmarksRoutes from "./views/bookmarks/routes";
import articlesRoutes from "./views/articles/routes";
import torrentsRoutes from "./views/torrents/routes";
import channelsRoutes from "./views/channels/routes";
import groupsRoutes from "./views/groups/routes";
import goalsRoutes from "./views/goals/routes";
import badgesRoutes from "./views/badges/routes";
import emojisRoutes from "./views/emojis/routes";
@ -108,6 +109,7 @@ const router = createBrowserRouter(
{ path: "notifications", Component: NotificationsView },
{ path: "media", children: mediaRoutes },
{ path: "streams", children: streamsRoutes },
{ path: "groups", children: groupsRoutes },
{ path: "tools", children: toolsRoutes },
{ path: "discovery", children: discoveryRoutes },
{ path: "wiki", children: wikiRoutes },

View File

@ -1,6 +1,6 @@
import { Box, Flex, FlexProps, IconButton, Spacer } from "@chakra-ui/react";
import { NostrEvent } from "nostr-tools";
import { getMediaAttachments, MediaAttachment } from "applesauce-core/helpers/media-attachment";
import { getMediaAttachments, MediaAttachment } from "applesauce-core/helpers/file-metadata";
import { Carousel, useCarousel } from "nuka-carousel";
import styled from "@emotion/styled";

View File

@ -29,6 +29,7 @@ import Users03 from "../icons/users-03";
import FileAttachment01 from "../icons/file-attachment-01";
import Rocket02 from "../icons/rocket-02";
import PuzzlePiece01 from "../icons/puzzle-piece-01";
import Users02 from "../icons/users-02";
export type App = {
icon?: ComponentWithAs<"svg", IconProps>;
@ -66,6 +67,13 @@ export const internalApps: App[] = [
id: "streams",
to: "/streams",
},
{
title: "Groups",
description: "Simple relay based groups",
icon: Users02,
id: "groups",
to: "/groups",
},
{
title: "Media",
description: "Browser media posts",

View File

@ -1,5 +1,6 @@
import { memo } from "react";
import { memo, useEffect } from "react";
import { Flex, Heading, Text } from "@chakra-ui/react";
import { parseSharedEvent } from "applesauce-core/helpers/share";
import { kinds, nip18 } from "nostr-tools";
import { NostrEvent } from "../../../types/nostr-event";
@ -11,14 +12,18 @@ import { TrustProvider } from "../../../providers/local/trust-provider";
import useSingleEvent from "../../../hooks/use-single-event";
import { EmbedEvent } from "../../embed-event";
import useUserMuteFilter from "../../../hooks/use-user-mute-filter";
import { parseHardcodedNoteContent } from "../../../helpers/nostr/event";
import LoadingNostrLink from "../../loading-nostr-link";
import NoteMenu from "../../note/note-menu";
import useEventIntersectionRef from "../../../hooks/use-event-intersection-ref";
import { eventStore } from "../../../services/event-store";
function ShareEvent({ event }: { event: NostrEvent }) {
const muteFilter = useUserMuteFilter();
const hardCodedNote = parseHardcodedNoteContent(event);
const hardCodedNote = parseSharedEvent(event);
useEffect(() => {
if (hardCodedNote) eventStore.add(hardCodedNote);
}, [hardCodedNote]);
const pointer = nip18.getRepostedEventPointer(event);
const loadedNote = useSingleEvent(pointer?.id, pointer?.relays);

View File

@ -1,20 +1,14 @@
import { EventTemplate, kinds, validateEvent } from "nostr-tools";
import { EventTemplate, kinds } from "nostr-tools";
import { getEventUID } from "nostr-idb";
import dayjs from "dayjs";
import { nanoid } from "nanoid";
import {
getAddressPointerFromATag,
getEventPointerFromETag,
getNip10References,
parseCoordinate,
} from "applesauce-core/helpers";
import { getAddressPointerFromATag, getEventPointerFromETag, getNip10References } from "applesauce-core/helpers";
import { ATag, ETag, isDTag, isETag, isPTag, NostrEvent, Tag } from "../../types/nostr-event";
import { getMatchNostrLink } from "../regexp";
import { AddressPointer, DecodeResult, EventPointer } from "nostr-tools/nip19";
import { safeJson } from "../parse";
import { safeDecode } from "../nip19";
import { safeRelayUrl, safeRelayUrls } from "../relay";
import { safeRelayUrl } from "../relay";
import RelaySet from "../../classes/relay-set";
import { truncateId } from "../string";
import { createATagFromAddressPointer, createETagFromEventPointer } from "applesauce-factory/helpers";
@ -170,18 +164,6 @@ export type CustomAddressPointer = Omit<AddressPointer, "identifier"> & {
export { parseCoordinate } from "applesauce-core/helpers/pointers";
export function parseHardcodedNoteContent(event: NostrEvent) {
const json = safeJson<NostrEvent>(event.content);
if (!json) return null;
// ensure the note has tags
json.tags = json.tags || [];
validateEvent(json);
return (json as NostrEvent) ?? null;
}
export function sortByDate(a: NostrEvent, b: NostrEvent) {
return b.created_at - a.created_at;
}

View File

@ -7,6 +7,8 @@ import { getEventCoordinate, replaceOrAddSimpleTag } from "./event";
import { getRelayVariations, safeRelayUrls } from "../relay";
import { isAddressPointerInList, isEventPointerInList, isProfilePointerInList } from "applesauce-lists/helpers";
export const USER_GROUPS_LIST_KIND = 10009;
export const LIST_KINDS = [
kinds.Mutelist,
kinds.Pinlist,
@ -19,6 +21,7 @@ export const LIST_KINDS = [
kinds.InterestsList,
kinds.UserEmojiList,
kinds.DirectMessageRelaysList,
USER_GROUPS_LIST_KIND,
];
export const SET_KINDS = [
kinds.Followsets,

View File

@ -0,0 +1,15 @@
import { getPublicGroups } from "applesauce-lists/helpers/groups";
import useCurrentAccount from "./use-current-account";
import useReplaceableEvent from "./use-replaceable-event";
import { USER_GROUPS_LIST_KIND } from "../helpers/nostr/lists";
export default function useUserGroupsList(pubkey?: string, relays: string[] = [], force?: boolean) {
const account = useCurrentAccount();
const key = pubkey ?? account?.pubkey;
const list = useReplaceableEvent(key ? { kind: USER_GROUPS_LIST_KIND, pubkey: key } : undefined, relays, force);
const pointers = list ? getPublicGroups(list) : [];
return { list, pointers };
}

View File

@ -0,0 +1,24 @@
import { Alert, AlertDescription, AlertIcon, AlertTitle, Box, Text } from "@chakra-ui/react";
import PeopleListProvider from "../../providers/local/people-list-provider";
import PeopleListSelection from "../../components/people-list-selection/people-list-selection";
import ContainedSimpleView from "../../components/layout/presets/contained-simple-view";
function GroupsExplorePage() {
return (
<ContainedSimpleView title="Explore channels" actions={<PeopleListSelection ms="auto" size="sm" />}>
<Alert status="info">
<AlertIcon />
<AlertTitle>Work in progress</AlertTitle>
</Alert>
</ContainedSimpleView>
);
}
export default function GroupsExploreView() {
return (
<PeopleListProvider>
<GroupsExplorePage />
</PeopleListProvider>
);
}

View File

@ -0,0 +1,20 @@
import { decodeGroupPointer } from "applesauce-core/helpers/groups";
import { Navigate, useParams } from "react-router-dom";
import ContainedSimpleView from "../../components/layout/presets/contained-simple-view";
import { Alert, AlertIcon, AlertTitle } from "@chakra-ui/react";
export default function GroupView() {
const { identifier } = useParams();
if (!identifier) return <Navigate to="/groups" />;
const pointer = decodeGroupPointer(identifier);
return (
<ContainedSimpleView title="Group">
<Alert status="info">
<AlertIcon />
<AlertTitle>Work in progress</AlertTitle>
</Alert>
</ContainedSimpleView>
);
}

View File

@ -0,0 +1,51 @@
import { Alert, AlertDescription, AlertIcon, AlertTitle, Button } from "@chakra-ui/react";
import { ErrorBoundary } from "../../components/error-boundary";
import ContainedParentView from "../../components/layout/presets/contained-parent-view";
import RouterLink from "../../components/router-link";
import useUserGroupsList from "../../hooks/use-user-groups-list";
import { encodeGroupPointer } from "applesauce-core/helpers/groups";
import SimpleNavItem from "../../components/layout/presets/simple-nav-item";
export default function ChannelsHomeView() {
const { pointers } = useUserGroupsList();
return (
<ContainedParentView
title="Groups"
path="/groups"
width="sm"
actions={
<Button as={RouterLink} to="explore" ms="auto" size="sm">
Explore
</Button>
}
>
{pointers?.map((pointer) => (
<SimpleNavItem to={`/groups/${encodeGroupPointer(pointer)}`} key={pointer.relay + pointer.id}>
{encodeGroupPointer(pointer)}
</SimpleNavItem>
))}
{pointers.length === 0 && (
<Alert
status="info"
variant="subtle"
flexDirection="column"
alignItems="center"
justifyContent="center"
textAlign="center"
>
<AlertIcon boxSize="40px" mr={0} />
<AlertTitle mt={4} mb={1} fontSize="lg">
No groups
</AlertTitle>
<AlertDescription maxWidth="sm">Looks like you have not joined any groups.</AlertDescription>
<Button as={RouterLink} to="explore" variant="link" p="2">
Explore
</Button>
</Alert>
)}
</ContainedParentView>
);
}

View File

@ -0,0 +1,17 @@
import { lazy } from "react";
import { RouteObject } from "react-router-dom";
const ChannelsHomeView = lazy(() => import("."));
const GroupView = lazy(() => import("./group"));
const GroupsExploreView = lazy(() => import("./explore"));
export default [
{
Component: ChannelsHomeView,
children: [
{ index: true, Component: GroupsExploreView },
{ path: "explore", Component: GroupsExploreView },
{ path: ":identifier", Component: GroupView },
],
},
] satisfies RouteObject[];

View File

@ -44,13 +44,14 @@ import { useSharableProfileId } from "../../../hooks/use-shareable-profile-id";
import UserProfileBadges from "./user-profile-badges";
import UserPinnedEvents from "./user-pinned-events";
import UserStatsAccordion from "./user-stats-accordion";
import UserJoinedChanneled from "./user-joined-channels";
import UserJoinedChannels from "./user-joined-channels";
import { getTextColor } from "../../../helpers/color";
import UserName from "../../../components/user/user-name";
import { useUserDNSIdentity } from "../../../hooks/use-user-dns-identity";
import UserAboutContent from "../../../components/user/user-about-content";
import UserRecentEvents from "./user-recent-events";
import useAppSettings, { useUserAppSettings } from "../../../hooks/use-user-app-settings";
import UserJoinedGroups from "./user-joined-groups";
function DNSIdentityWarning({ pubkey }: { pubkey: string }) {
const metadata = useUserProfile(pubkey);
@ -264,7 +265,8 @@ export default function UserAboutTab() {
Nostree page
</Button>
</Flex>
<UserJoinedChanneled pubkey={pubkey} />
<UserJoinedGroups pubkey={pubkey} />
<UserJoinedChannels pubkey={pubkey} />
<Modal isOpen={colorModal.isOpen} onClose={colorModal.onClose} size="2xl">
<ModalOverlay />

View File

@ -6,7 +6,7 @@ import { useBreakpointValue } from "../../../providers/global/breakpoint-provide
import useUserChannelsList from "../../../hooks/use-user-channels-list";
import { PointerChannelCard } from "../../channels/components/channel-card";
export default function UserJoinedChanneled({ pubkey }: { pubkey: string }) {
export default function UserJoinedChannels({ pubkey }: { pubkey: string }) {
const contextRelays = useAdditionalRelayContext();
const { pointers: channels } = useUserChannelsList(pubkey, contextRelays, true);
const columns = useBreakpointValue({ base: 1, lg: 2, xl: 3 }) ?? 1;

View File

@ -0,0 +1,39 @@
import { Button, Flex, Heading, SimpleGrid, useDisclosure } from "@chakra-ui/react";
import { encodeGroupPointer } from "applesauce-core/helpers/groups";
import { useAdditionalRelayContext } from "../../../providers/local/additional-relay-context";
import { ErrorBoundary } from "../../../components/error-boundary";
import { useBreakpointValue } from "../../../providers/global/breakpoint-provider";
import useUserGroupsList from "../../../hooks/use-user-groups-list";
import RouterLink from "../../../components/router-link";
export default function UserJoinedGroups({ pubkey }: { pubkey: string }) {
const contextRelays = useAdditionalRelayContext();
const { list, pointers: groups } = useUserGroupsList(pubkey, contextRelays, true);
const columns = useBreakpointValue({ base: 1, lg: 2, xl: 3 }) ?? 1;
const showAll = useDisclosure();
if (groups.length === 0) return null;
return (
<Flex direction="column" px="2">
<Heading size="md" my="2">
Joined Groups ({groups.length})
</Heading>
<SimpleGrid spacing="4" columns={columns}>
{(showAll.isOpen ? groups : groups.slice(0, columns * 2)).map((pointer) => (
<ErrorBoundary key={pointer.id}>
<Button as={RouterLink} to={`/groups/${encodeGroupPointer(pointer)}`}>
{encodeGroupPointer(pointer)}
</Button>
</ErrorBoundary>
))}
</SimpleGrid>
{!showAll.isOpen && groups.length > columns * 2 && (
<Button variant="link" pt="4" onClick={showAll.onOpen}>
Show All
</Button>
)}
</Flex>
);
}