clean up & small fixes

This commit is contained in:
Ren Amamiya 2023-08-26 14:52:02 +07:00
parent 0f212828a7
commit fe28cd95bd
15 changed files with 247 additions and 264 deletions

View File

@ -93,7 +93,7 @@
"cross-env": "^7.0.3",
"csstype": "^3.1.2",
"encoding": "^0.1.13",
"eslint": "^8.47.0",
"eslint": "^8.48.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-react": "^7.33.2",

View File

@ -203,10 +203,10 @@ devDependencies:
version: 5.5.7
'@typescript-eslint/eslint-plugin':
specifier: ^6.4.1
version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2)
version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.2.2)
'@typescript-eslint/parser':
specifier: ^6.4.1
version: 6.4.1(eslint@8.47.0)(typescript@5.2.2)
version: 6.4.1(eslint@8.48.0)(typescript@5.2.2)
'@vitejs/plugin-react-swc':
specifier: ^3.3.2
version: 3.3.2(vite@4.4.9)
@ -226,20 +226,20 @@ devDependencies:
specifier: ^0.1.13
version: 0.1.13
eslint:
specifier: ^8.47.0
version: 8.47.0
specifier: ^8.48.0
version: 8.48.0
eslint-config-prettier:
specifier: ^9.0.0
version: 9.0.0(eslint@8.47.0)
version: 9.0.0(eslint@8.48.0)
eslint-plugin-jsx-a11y:
specifier: ^6.7.1
version: 6.7.1(eslint@8.47.0)
version: 6.7.1(eslint@8.48.0)
eslint-plugin-react:
specifier: ^7.33.2
version: 7.33.2(eslint@8.47.0)
version: 7.33.2(eslint@8.48.0)
eslint-plugin-simple-import-sort:
specifier: ^10.0.0
version: 10.0.0(eslint@8.47.0)
version: 10.0.0(eslint@8.48.0)
husky:
specifier: ^8.0.3
version: 8.0.3
@ -811,17 +811,17 @@ packages:
dev: true
optional: true
/@eslint-community/eslint-utils@4.4.0(eslint@8.47.0):
/@eslint-community/eslint-utils@4.4.0(eslint@8.48.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
dependencies:
eslint: 8.47.0
eslint: 8.48.0
eslint-visitor-keys: 3.4.3
/@eslint-community/regexpp@4.7.0:
resolution: {integrity: sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==}
/@eslint-community/regexpp@4.8.0:
resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
/@eslint/eslintrc@2.1.2:
@ -840,8 +840,8 @@ packages:
transitivePeerDependencies:
- supports-color
/@eslint/js@8.47.0:
resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==}
/@eslint/js@8.48.0:
resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
/@floating-ui/core@1.4.1:
@ -991,15 +991,15 @@ packages:
dependencies:
'@noble/hashes': 1.3.2
'@noble/secp256k1': 2.0.0
'@scure/base': 1.1.1
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.2.2)
'@scure/base': 1.1.2
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2)
debug: 4.3.4
esbuild: 0.17.19
esbuild-plugin-alias: 0.2.1
eslint: 8.47.0
eslint-config-prettier: 8.10.0(eslint@8.47.0)
eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)
eslint: 8.48.0
eslint-config-prettier: 8.10.0(eslint@8.48.0)
eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)
esm-loader-typescript: 1.0.5
eventemitter3: 5.0.1
light-bolt11-decoder: 3.0.0
@ -1717,6 +1717,10 @@ packages:
resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==}
dev: false
/@scure/base@1.1.2:
resolution: {integrity: sha512-sSCrnIdaUZQHhBxZThMuk7Wm1TWzMD3uJNdGgx3JS23xSqevu0tAOsg8k66nL3R2NwQe65AI9GgqpPOgZys/eA==}
dev: false
/@scure/bip32@1.3.1:
resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==}
dependencies:
@ -1743,8 +1747,8 @@ packages:
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
dev: false
/@swc/core-darwin-arm64@1.3.78:
resolution: {integrity: sha512-596KRua/d5Gx1buHKKchSyHuwoIL4S1BRD/wCvYNLNZ3xOzcuBBmXOjrDVigKi1ztNDeS07p30RO5UyYur0XAA==}
/@swc/core-darwin-arm64@1.3.80:
resolution: {integrity: sha512-rhoFTcQMUGfO7IkfOnopPSF6O0/aVJ58B7KueIKbvrMe6YvSfFj9QfObELFjYCcrJZTvUWBhig0QrsfPIiUphA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
@ -1752,8 +1756,8 @@ packages:
dev: true
optional: true
/@swc/core-darwin-x64@1.3.78:
resolution: {integrity: sha512-w0RsD1onQAj0vuLAoOVi48HgnW6D6oBEIZP17l0HYejCDBZ+FRZLjml7wgNAWMqHcd2qNRqgtZ+v7aLza2JtBQ==}
/@swc/core-darwin-x64@1.3.80:
resolution: {integrity: sha512-0dOLedFpVXe+ugkKHXsqSxMKqvQYfFtibWbrZ7j8wOaErzSGPr0VpyWvepNVb9s046725kPXSw+fsGhqZR8wrw==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
@ -1761,8 +1765,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm-gnueabihf@1.3.78:
resolution: {integrity: sha512-v1CpRn+H6fha1WIqmdRvJM40pFdjUHrGfhf4Ygci72nlAU41l5XimN8Iwkm8FgIwf2wnv0lLzedSM4IHvpq/yA==}
/@swc/core-linux-arm-gnueabihf@1.3.80:
resolution: {integrity: sha512-QIjwP3PtDeHBDkwF6+ZZqdUsqAhORbMpxrw2jq3mHe4lQrxBttSFTq018vlMRo2mFEorOvXdadzaD9m+NymPrw==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
@ -1770,8 +1774,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm64-gnu@1.3.78:
resolution: {integrity: sha512-Sis17dz9joJRFVvR/gteOZSUNrrrioo81RQzani0Zr5ZZOfWLMTB9DA+0MVlfnVa2taYcsJHJZFoAv9JkLwbzg==}
/@swc/core-linux-arm64-gnu@1.3.80:
resolution: {integrity: sha512-cg8WriIueab58ZwkzXmIACnjSzFLzOBwxlC9k65gPXMNgCjab2YbqEYvAbjBqneuqaao02gW6tad2uhjgYaExw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
@ -1779,8 +1783,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm64-musl@1.3.78:
resolution: {integrity: sha512-E5F8/qp+QupnfBnsP4vN1PKyCmAHYHDG1GMyPE/zLFOUYLgw+jK4C9rfyLBR0o2bWo1ay2WCIjusBZD9XHGOSA==}
/@swc/core-linux-arm64-musl@1.3.80:
resolution: {integrity: sha512-AhdCQ7QKx5mWrtpaOA1mFRiWWvuiiUtspvo0QSpspDetRKTND1rlf/3UB5+gp0kCeCNUTsVmJWU7fIA9ICZtXA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
@ -1788,8 +1792,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-x64-gnu@1.3.78:
resolution: {integrity: sha512-iDxa+RknnTQlyy+WfPor1FM6y44ERNI2E0xiUV6gV6uPwegCngi8LFC+E7IvP6+p+yXtAkesunAaiZ8nn0s+rw==}
/@swc/core-linux-x64-gnu@1.3.80:
resolution: {integrity: sha512-+2e5oni1vOrLIjM5Q2/GIzK/uS2YEtuJqnjPvCK8SciRJsSl8OgVsRvyCDbmKeZNtJ2Q+o/O2AQ2w1qpAJG6jg==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
@ -1797,8 +1801,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-x64-musl@1.3.78:
resolution: {integrity: sha512-dWtIYUFL5sMTE2UKshkXTusHcK8+zAhhGzvqWq1wJS45pqTlrAbzpyqB780fle880x3A6DMitWmsAFARdNzpuQ==}
/@swc/core-linux-x64-musl@1.3.80:
resolution: {integrity: sha512-8OK9IlI1zpWOm7vIp1iXmZSEzLAwFpqhsGSEhxPavpOx2m54kLFdPcw/Uv3n461f6TCtszIxkGq1kSqBUdfUBA==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
@ -1806,8 +1810,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-arm64-msvc@1.3.78:
resolution: {integrity: sha512-CXFaGEc2M9Su3UoUMC8AnzKb9g+GwPxXfakLWZsjwS448h6jcreExq3nwtBNdVGzQ26xqeVLMFfb1l/oK99Hwg==}
/@swc/core-win32-arm64-msvc@1.3.80:
resolution: {integrity: sha512-RKhatwiAGlffnF6z2Mm3Ddid0v3KB+uf5m/Gc7N9zO/EUAV0PnHRuYuZSGyqodHmGFC+mK8YrCooFCEmHL9n+w==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
@ -1815,8 +1819,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-ia32-msvc@1.3.78:
resolution: {integrity: sha512-FaH1jwWnJpWkdImpMoiZpMg9oy9UUyZwltzN7hFwjR48e3Li82cRFb+9PifIBHCUSBM+CrrsJXbHP213IMVAyw==}
/@swc/core-win32-ia32-msvc@1.3.80:
resolution: {integrity: sha512-3jiiZzU/kaw7k4zUp1yMq1QiUe4wJVtCEXIhf+fKuBsIwm7rdvyK/+PIx5KHnZy4TGQnYczKBRhJA5nuBcrUCQ==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
@ -1824,8 +1828,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-x64-msvc@1.3.78:
resolution: {integrity: sha512-oYxa+tPdhlx1aH14AIoF6kvVjo49tEOW0drNqoEaVHufvgH0y43QU2Jum3b2+xXztmMRtzK2CSN3GPOAXDKKKg==}
/@swc/core-win32-x64-msvc@1.3.80:
resolution: {integrity: sha512-2eZtIoIWQBWqykfms92Zd37lveYOBWQTZjdooBGlsLHtcoQLkNpf1NXmR6TKY0yy8q6Yl3OhPvY+izjmO08MSg==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
@ -1833,8 +1837,8 @@ packages:
dev: true
optional: true
/@swc/core@1.3.78:
resolution: {integrity: sha512-y6DQP571v7fbUUY7nz5G4lNIRGofuO48K5pGhD9VnuOCTuptfooCdi8wnigIrIhM/M4zQ53m/YCMDCbOtDgEww==}
/@swc/core@1.3.80:
resolution: {integrity: sha512-yX2xV5I/lYswHHR+44TPvzBgq3/Y8N1YWpTQADYuvSiX3Jxyvemk5Jpx3rRtigYb8WBkWAAf2i5d5ZJ2M7hhgw==}
engines: {node: '>=10'}
requiresBuild: true
peerDependencies:
@ -1842,17 +1846,23 @@ packages:
peerDependenciesMeta:
'@swc/helpers':
optional: true
dependencies:
'@swc/types': 0.1.4
optionalDependencies:
'@swc/core-darwin-arm64': 1.3.78
'@swc/core-darwin-x64': 1.3.78
'@swc/core-linux-arm-gnueabihf': 1.3.78
'@swc/core-linux-arm64-gnu': 1.3.78
'@swc/core-linux-arm64-musl': 1.3.78
'@swc/core-linux-x64-gnu': 1.3.78
'@swc/core-linux-x64-musl': 1.3.78
'@swc/core-win32-arm64-msvc': 1.3.78
'@swc/core-win32-ia32-msvc': 1.3.78
'@swc/core-win32-x64-msvc': 1.3.78
'@swc/core-darwin-arm64': 1.3.80
'@swc/core-darwin-x64': 1.3.80
'@swc/core-linux-arm-gnueabihf': 1.3.80
'@swc/core-linux-arm64-gnu': 1.3.80
'@swc/core-linux-arm64-musl': 1.3.80
'@swc/core-linux-x64-gnu': 1.3.80
'@swc/core-linux-x64-musl': 1.3.80
'@swc/core-win32-arm64-msvc': 1.3.80
'@swc/core-win32-ia32-msvc': 1.3.80
'@swc/core-win32-x64-msvc': 1.3.80
dev: true
/@swc/types@0.1.4:
resolution: {integrity: sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg==}
dev: true
/@tailwindcss/typography@0.5.9(tailwindcss@3.3.3):
@ -2424,7 +2434,7 @@ packages:
resolution: {integrity: sha512-W8F4eoTIvzXeNrT3JroQPimZLXnlJA8smYygHZUKFPVoYwgs/OhJkA1VBhL3iSs57OQkuINqHlY4SmMT5wtnJg==}
dev: true
/@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@5.2.2):
/@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2):
resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -2435,13 +2445,13 @@ packages:
typescript:
optional: true
dependencies:
'@eslint-community/regexpp': 4.7.0
'@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.2.2)
'@eslint-community/regexpp': 4.8.0
'@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2)
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/type-utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2)
'@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2)
debug: 4.3.4
eslint: 8.47.0
eslint: 8.48.0
graphemer: 1.4.0
ignore: 5.2.4
natural-compare-lite: 1.4.0
@ -2452,7 +2462,7 @@ packages:
- supports-color
dev: false
/@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2):
/@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.2.2):
resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
@ -2463,14 +2473,14 @@ packages:
typescript:
optional: true
dependencies:
'@eslint-community/regexpp': 4.7.0
'@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2)
'@eslint-community/regexpp': 4.8.0
'@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2)
'@typescript-eslint/scope-manager': 6.4.1
'@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/type-utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2)
'@typescript-eslint/utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2)
'@typescript-eslint/visitor-keys': 6.4.1
debug: 4.3.4
eslint: 8.47.0
eslint: 8.48.0
graphemer: 1.4.0
ignore: 5.2.4
natural-compare: 1.4.0
@ -2481,7 +2491,7 @@ packages:
- supports-color
dev: true
/@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.2.2):
/@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.2.2):
resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -2495,13 +2505,13 @@ packages:
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
debug: 4.3.4
eslint: 8.47.0
eslint: 8.48.0
typescript: 5.2.2
transitivePeerDependencies:
- supports-color
dev: false
/@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.2.2):
/@typescript-eslint/parser@6.4.1(eslint@8.48.0)(typescript@5.2.2):
resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
@ -2516,7 +2526,7 @@ packages:
'@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2)
'@typescript-eslint/visitor-keys': 6.4.1
debug: 4.3.4
eslint: 8.47.0
eslint: 8.48.0
typescript: 5.2.2
transitivePeerDependencies:
- supports-color
@ -2538,7 +2548,7 @@ packages:
'@typescript-eslint/visitor-keys': 6.4.1
dev: true
/@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@5.2.2):
/@typescript-eslint/type-utils@5.62.0(eslint@8.48.0)(typescript@5.2.2):
resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -2549,16 +2559,16 @@ packages:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
'@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2)
debug: 4.3.4
eslint: 8.47.0
eslint: 8.48.0
tsutils: 3.21.0(typescript@5.2.2)
typescript: 5.2.2
transitivePeerDependencies:
- supports-color
dev: false
/@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.2.2):
/@typescript-eslint/type-utils@6.4.1(eslint@8.48.0)(typescript@5.2.2):
resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
@ -2569,9 +2579,9 @@ packages:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2)
'@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2)
debug: 4.3.4
eslint: 8.47.0
eslint: 8.48.0
ts-api-utils: 1.0.2(typescript@5.2.2)
typescript: 5.2.2
transitivePeerDependencies:
@ -2630,19 +2640,19 @@ packages:
- supports-color
dev: true
/@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.2.2):
/@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.2.2):
resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0)
'@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0)
'@types/json-schema': 7.0.12
'@types/semver': 7.5.0
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
eslint: 8.47.0
eslint: 8.48.0
eslint-scope: 5.1.1
semver: 7.5.4
transitivePeerDependencies:
@ -2650,19 +2660,19 @@ packages:
- typescript
dev: false
/@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.2.2):
/@typescript-eslint/utils@6.4.1(eslint@8.48.0)(typescript@5.2.2):
resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0)
'@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0)
'@types/json-schema': 7.0.12
'@types/semver': 7.5.0
'@typescript-eslint/scope-manager': 6.4.1
'@typescript-eslint/types': 6.4.1
'@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2)
eslint: 8.47.0
eslint: 8.48.0
semver: 7.5.4
transitivePeerDependencies:
- supports-color
@ -2690,7 +2700,7 @@ packages:
peerDependencies:
vite: ^4
dependencies:
'@swc/core': 1.3.78
'@swc/core': 1.3.80
vite: 4.4.9(@types/node@20.5.6)
transitivePeerDependencies:
- '@swc/helpers'
@ -2892,7 +2902,7 @@ packages:
postcss: ^8.1.0
dependencies:
browserslist: 4.21.10
caniuse-lite: 1.0.30001522
caniuse-lite: 1.0.30001523
fraction.js: 4.2.1
normalize-range: 0.1.2
picocolors: 1.0.0
@ -2944,8 +2954,8 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
caniuse-lite: 1.0.30001522
electron-to-chromium: 1.4.501
caniuse-lite: 1.0.30001523
electron-to-chromium: 1.4.503
node-releases: 2.0.13
update-browserslist-db: 1.0.11(browserslist@4.21.10)
dev: true
@ -2955,7 +2965,7 @@ packages:
engines: {node: '>=6.14.2'}
requiresBuild: true
dependencies:
node-gyp-build: 4.6.0
node-gyp-build: 4.6.1
dev: false
/call-bind@1.0.2:
@ -2987,8 +2997,8 @@ packages:
engines: {node: '>=6'}
dev: false
/caniuse-lite@1.0.30001522:
resolution: {integrity: sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==}
/caniuse-lite@1.0.30001523:
resolution: {integrity: sha512-I5q5cisATTPZ1mc588Z//pj/Ox80ERYDfR71YnvY7raS/NOk8xXlZcB0sF7JdqaV//kOaa6aus7lRfpdnt1eBA==}
dev: true
/case-anything@2.1.13:
@ -3330,8 +3340,8 @@ packages:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
dev: true
/electron-to-chromium@1.4.501:
resolution: {integrity: sha512-NCF5hZUg73MEP0guvIM+BjPs9W07UeAuc5XCNqRZZTKJxLjE0ZS/Zo5UsV8bbs2y/jeKRPFPzdWdBfOGEZTXKg==}
/electron-to-chromium@1.4.503:
resolution: {integrity: sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==}
dev: true
/emoji-regex@8.0.0:
@ -3555,22 +3565,22 @@ packages:
engines: {node: '>=12'}
dev: false
/eslint-config-prettier@8.10.0(eslint@8.47.0):
/eslint-config-prettier@8.10.0(eslint@8.48.0):
resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
dependencies:
eslint: 8.47.0
eslint: 8.48.0
dev: false
/eslint-config-prettier@9.0.0(eslint@8.47.0):
/eslint-config-prettier@9.0.0(eslint@8.48.0):
resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
dependencies:
eslint: 8.47.0
eslint: 8.48.0
dev: true
/eslint-formatter-pretty@4.1.0:
@ -3597,7 +3607,7 @@ packages:
- supports-color
dev: false
/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0):
/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0):
resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
engines: {node: '>=4'}
peerDependencies:
@ -3618,15 +3628,15 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2)
debug: 3.2.7
eslint: 8.47.0
eslint: 8.48.0
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
dev: false
/eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.47.0):
/eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.48.0):
resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==}
engines: {node: '>=4'}
peerDependencies:
@ -3636,16 +3646,16 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2)
array-includes: 3.1.6
array.prototype.findlastindex: 1.2.2
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.47.0
eslint: 8.48.0
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0)
eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0)
has: 1.0.3
is-core-module: 2.13.0
is-glob: 4.0.3
@ -3661,7 +3671,7 @@ packages:
- supports-color
dev: false
/eslint-plugin-jsx-a11y@6.7.1(eslint@8.47.0):
/eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0):
resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==}
engines: {node: '>=4.0'}
peerDependencies:
@ -3676,7 +3686,7 @@ packages:
axobject-query: 3.2.1
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
eslint: 8.47.0
eslint: 8.48.0
has: 1.0.3
jsx-ast-utils: 3.3.5
language-tags: 1.0.5
@ -3686,7 +3696,7 @@ packages:
semver: 6.3.1
dev: true
/eslint-plugin-react@7.33.2(eslint@8.47.0):
/eslint-plugin-react@7.33.2(eslint@8.48.0):
resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==}
engines: {node: '>=4'}
peerDependencies:
@ -3697,7 +3707,7 @@ packages:
array.prototype.tosorted: 1.1.1
doctrine: 2.1.0
es-iterator-helpers: 1.0.13
eslint: 8.47.0
eslint: 8.48.0
estraverse: 5.3.0
jsx-ast-utils: 3.3.5
minimatch: 3.1.2
@ -3711,12 +3721,12 @@ packages:
string.prototype.matchall: 4.0.8
dev: true
/eslint-plugin-simple-import-sort@10.0.0(eslint@8.47.0):
/eslint-plugin-simple-import-sort@10.0.0(eslint@8.48.0):
resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==}
peerDependencies:
eslint: '>=5.0.0'
dependencies:
eslint: 8.47.0
eslint: 8.48.0
dev: true
/eslint-rule-docs@1.1.235:
@ -3742,15 +3752,15 @@ packages:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
/eslint@8.47.0:
resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==}
/eslint@8.48.0:
resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0)
'@eslint-community/regexpp': 4.7.0
'@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0)
'@eslint-community/regexpp': 4.8.0
'@eslint/eslintrc': 2.1.2
'@eslint/js': 8.47.0
'@eslint/js': 8.48.0
'@humanwhocodes/config-array': 0.11.10
'@humanwhocodes/module-importer': 1.0.1
'@nodelib/fs.walk': 1.2.8
@ -3893,7 +3903,7 @@ packages:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
dependencies:
flat-cache: 3.0.4
flat-cache: 3.1.0
/fill-range@7.0.1:
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
@ -3916,11 +3926,12 @@ packages:
locate-path: 6.0.0
path-exists: 4.0.0
/flat-cache@3.0.4:
resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
engines: {node: ^10.12.0 || >=12.0.0}
/flat-cache@3.1.0:
resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==}
engines: {node: '>=12.0.0'}
dependencies:
flatted: 3.2.7
keyv: 4.5.3
rimraf: 3.0.2
/flatted@3.2.7:
@ -4502,6 +4513,9 @@ packages:
hasBin: true
dev: true
/json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
/json-parse-better-errors@1.0.2:
resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
dev: false
@ -4533,6 +4547,11 @@ packages:
object.values: 1.1.6
dev: true
/keyv@4.5.3:
resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==}
dependencies:
json-buffer: 3.0.1
/kind-of@6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
@ -5253,8 +5272,8 @@ packages:
formdata-polyfill: 4.0.10
dev: false
/node-gyp-build@4.6.0:
resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==}
/node-gyp-build@4.6.1:
resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==}
hasBin: true
dev: false
@ -6999,7 +7018,7 @@ packages:
engines: {node: '>=6.14.2'}
requiresBuild: true
dependencies:
node-gyp-build: 4.6.0
node-gyp-build: 4.6.1
dev: false
/utf8-buffer@1.0.0:

20
src-tauri/Cargo.lock generated
View File

@ -1475,7 +1475,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5"
dependencies = [
"cfg-if",
"rustix 0.38.8",
"rustix 0.38.9",
"windows-sys 0.48.0",
]
@ -3415,9 +3415,9 @@ dependencies = [
[[package]]
name = "pin-project-lite"
version = "0.2.12"
version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05"
checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
[[package]]
name = "pin-utils"
@ -3972,9 +3972,9 @@ dependencies = [
[[package]]
name = "rustix"
version = "0.38.8"
version = "0.38.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f"
checksum = "9bfe0f2582b4931a45d1fa608f8a8722e8b3c7ac54dd6d5f3b3212791fedef49"
dependencies = [
"bitflags 2.4.0",
"errno",
@ -4117,18 +4117,18 @@ dependencies = [
[[package]]
name = "serde"
version = "1.0.186"
version = "1.0.188"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1"
checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.186"
version = "1.0.188"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670"
checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
dependencies = [
"proc-macro2",
"quote",
@ -5387,7 +5387,7 @@ dependencies = [
"cfg-if",
"fastrand 2.0.0",
"redox_syscall 0.3.5",
"rustix 0.38.8",
"rustix 0.38.9",
"windows-sys 0.48.0",
]

View File

@ -28,7 +28,7 @@ export function User({ pubkey, fallback }: { pubkey: string; fallback?: string }
/>
</div>
<div className="flex w-full flex-1 flex-col items-start text-start">
<p className="truncate font-medium leading-tight text-white">
<p className="max-w-[15rem] truncate font-medium leading-tight text-white">
{user?.name || user?.display_name || user?.nip05}
</p>
<span className="max-w-[15rem] truncate text-base leading-tight text-white/50">

View File

@ -28,6 +28,10 @@ export function FeedWidgetForm({ params }: { params: Widget }) {
setGroups(arr);
};
const cancel = () => {
removeWidget(db, params.id);
};
const submit = async () => {
setWidget(db, {
kind: WidgetKinds.feed,
@ -39,7 +43,7 @@ export function FeedWidgetForm({ params }: { params: Widget }) {
};
return (
<div className="flex h-full shrink-0 grow-0 basis-[400px] flex-col items-center justify-center">
<div className="flex h-full shrink-0 grow-0 basis-[400px] flex-col items-center justify-center bg-white/10">
<div className="w-full px-5">
<h3 className="mb-4 text-center text-lg font-semibold">
Choose account you want to add to group feeds
@ -70,7 +74,7 @@ export function FeedWidgetForm({ params }: { params: Widget }) {
</button>
))}
</div>
<div className="flex items-center justify-center">
<div className="flex flex-col items-center justify-center gap-2">
<button
type="submit"
disabled={groups.length < 1}
@ -81,6 +85,13 @@ export function FeedWidgetForm({ params }: { params: Widget }) {
<span>Add {groups.length} account to group feed</span>
<ArrowRightCircleIcon className="h-5 w-5" />
</button>
<button
type="button"
onClick={cancel}
className="inline-flex h-11 w-full items-center justify-center gap-2 rounded-lg bg-white/10 px-6 font-medium leading-none text-white hover:bg-white/20 focus:outline-none disabled:opacity-50"
>
Cancel
</button>
</div>
</div>
</div>

View File

@ -40,6 +40,10 @@ export function HashTagWidgetForm({ params }: { params: Widget }) {
formState: { errors, isDirty, isValid },
} = useForm<FormValues>({ resolver });
const cancel = () => {
removeWidget(db, params.id);
};
const onSubmit = async (data: FormValues) => {
try {
setWidget(db, {
@ -58,7 +62,7 @@ export function HashTagWidgetForm({ params }: { params: Widget }) {
};
return (
<div className="flex h-full shrink-0 grow-0 basis-[400px] flex-col items-center justify-center">
<div className="flex h-full shrink-0 grow-0 basis-[400px] flex-col items-center justify-center bg-white/10">
<div className="w-full px-5">
<h3 className="mb-4 text-center text-lg font-semibold">
Enter hashtag you want to follow
@ -74,7 +78,7 @@ export function HashTagWidgetForm({ params }: { params: Widget }) {
{errors.hashtag && <p>{errors.hashtag.message}</p>}
</span>
</div>
<div className="flex items-center justify-center">
<div className="flex flex-col items-center justify-center gap-2">
<button
type="submit"
disabled={!isDirty || !isValid}
@ -84,6 +88,13 @@ export function HashTagWidgetForm({ params }: { params: Widget }) {
<span>Create</span>
<ArrowRightCircleIcon className="h-5 w-5" />
</button>
<button
type="button"
onClick={cancel}
className="inline-flex h-11 w-full items-center justify-center gap-2 rounded-lg bg-white/10 px-6 font-medium leading-none text-white hover:bg-white/20 focus:outline-none disabled:opacity-50"
>
Cancel
</button>
</div>
</form>
</div>

View File

@ -1,10 +1,12 @@
import { useQuery } from '@tanstack/react-query';
import { useEffect, useState } from 'react';
import { FollowIcon, LoaderIcon, UnfollowIcon } from '@shared/icons';
import { useStorage } from '@libs/storage/provider';
import { FollowIcon, UnfollowIcon } from '@shared/icons';
import { Image } from '@shared/image';
import { useSocial } from '@utils/hooks/useSocial';
import { useNostr } from '@utils/hooks/useNostr';
import { compactNumber } from '@utils/number';
import { shortenKey } from '@utils/shortenKey';
@ -14,7 +16,8 @@ export interface Profile {
}
export function UserProfile({ data }: { data: Profile }) {
const { status: socialStatus, userFollows, follow, unfollow } = useSocial();
const { db } = useStorage();
const { addContact, removeContact } = useNostr();
const { status, data: userStats } = useQuery(
['user-stats', data.pubkey],
async () => {
@ -36,7 +39,7 @@ export function UserProfile({ data }: { data: Profile }) {
const followUser = (pubkey: string) => {
try {
follow(pubkey);
addContact(pubkey);
// update state
setFollowed(true);
} catch (error) {
@ -46,7 +49,7 @@ export function UserProfile({ data }: { data: Profile }) {
const unfollowUser = (pubkey: string) => {
try {
unfollow(pubkey);
removeContact(pubkey);
// update state
setFollowed(false);
} catch (error) {
@ -55,12 +58,10 @@ export function UserProfile({ data }: { data: Profile }) {
};
useEffect(() => {
if (status === 'success' && userFollows) {
if (userFollows.includes(data.pubkey)) {
setFollowed(true);
}
if (db.account.follows.includes(data.pubkey)) {
setFollowed(true);
}
}, [status]);
}, []);
if (!profile) {
return (
@ -88,14 +89,7 @@ export function UserProfile({ data }: { data: Profile }) {
</div>
</div>
<div className="inline-flex items-center gap-2">
{socialStatus === 'loading' ? (
<button
type="button"
className="inline-flex h-8 w-8 items-center justify-center rounded-md bg-white/10 hover:bg-fuchsia-500"
>
<LoaderIcon className="h-4 w-4 animate-spin text-white" />
</button>
) : followed ? (
{followed ? (
<button
type="button"
onClick={() => unfollowUser(data.pubkey)}

View File

@ -8,21 +8,20 @@ import { useStorage } from '@libs/storage/provider';
import { EditProfileModal } from '@shared/editProfileModal';
import { Image } from '@shared/image';
import { useNostr } from '@utils/hooks/useNostr';
import { useProfile } from '@utils/hooks/useProfile';
import { useSocial } from '@utils/hooks/useSocial';
import { shortenKey } from '@utils/shortenKey';
export function UserProfile({ pubkey }: { pubkey: string }) {
const { db } = useStorage();
const { user } = useProfile(pubkey);
const { status, userFollows, follow, unfollow } = useSocial();
const { addContact, removeContact } = useNostr();
const [followed, setFollowed] = useState(false);
const followUser = (pubkey: string) => {
try {
follow(pubkey);
addContact(pubkey);
// update state
setFollowed(true);
} catch (error) {
@ -32,8 +31,7 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
const unfollowUser = (pubkey: string) => {
try {
unfollow(pubkey);
removeContact(pubkey);
// update state
setFollowed(false);
} catch (error) {
@ -42,12 +40,10 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
};
useEffect(() => {
if (status === 'success' && userFollows) {
if (userFollows.includes(pubkey)) {
setFollowed(true);
}
if (db.account.follows.includes(pubkey)) {
setFollowed(true);
}
}, [status]);
}, []);
if (!user) return <p>Loading...</p>;
@ -92,14 +88,7 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
</div>
</div>
<div className="inline-flex items-center justify-center gap-2">
{status === 'loading' ? (
<button
type="button"
className="inline-flex h-10 w-36 items-center justify-center rounded-md bg-white/10 text-sm font-medium hover:bg-fuchsia-500"
>
Loading...
</button>
) : followed ? (
{followed ? (
<button
type="button"
onClick={() => unfollowUser(pubkey)}

View File

@ -26,7 +26,7 @@ export function UserStats({ pubkey }: { pubkey: string }) {
}
return (
<div className="flex w-full items-center gap-10">
<div className="flex w-full items-center justify-center gap-10">
<div className="inline-flex flex-col items-center gap-1">
<span className="font-semibold leading-none text-white">
{compactNumber.format(data.stats[pubkey].followers_pubkey_count) ?? 0}

View File

@ -37,7 +37,7 @@ export function UserScreen() {
count: data ? data.length : 0,
getScrollElement: () => parentRef.current,
estimateSize: () => 650,
overscan: 2,
overscan: 4,
});
const items = virtualizer.getVirtualItems();

View File

@ -11,10 +11,13 @@ export function RepliesList({ id }: { id: string }) {
const [data, setData] = useState<null | NDKEventWithReplies[]>(null);
useEffect(() => {
let isCancelled = false;
async function fetchRepliesAndSub() {
const events = await fetchAllReplies(id);
setData(events);
if (!isCancelled) {
setData(events);
}
// subscribe for new replies
sub(
{
@ -26,9 +29,12 @@ export function RepliesList({ id }: { id: string }) {
false
);
}
fetchRepliesAndSub();
}, []);
return () => {
isCancelled = true;
};
}, [id]);
if (!data) {
return (

View File

@ -72,7 +72,7 @@ export function NoteStats({ id }: { id: string }) {
<span className="font-semibold text-white">
{compactNumber.format(data.reposts)}
</span>{' '}
reposts
repostrs
</p>
<span className="text-white/50">·</span>
<p className="text-white/50">

View File

@ -3,21 +3,24 @@ import { Link } from 'react-router-dom';
import { UserStats } from '@app/users/components/stats';
import { useStorage } from '@libs/storage/provider';
import { Image } from '@shared/image';
import { useNostr } from '@utils/hooks/useNostr';
import { useProfile } from '@utils/hooks/useProfile';
import { useSocial } from '@utils/hooks/useSocial';
import { displayNpub } from '@utils/shortenKey';
export function UserProfile({ pubkey }: { pubkey: string }) {
const { db } = useStorage();
const { user } = useProfile(pubkey);
const { status, userFollows, follow, unfollow } = useSocial();
const { addContact, removeContact } = useNostr();
const [followed, setFollowed] = useState(false);
const followUser = (pubkey: string) => {
try {
follow(pubkey);
addContact(pubkey);
// update state
setFollowed(true);
@ -28,7 +31,7 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
const unfollowUser = (pubkey: string) => {
try {
unfollow(pubkey);
removeContact(pubkey);
// update state
setFollowed(false);
@ -38,12 +41,10 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
};
useEffect(() => {
if (status === 'success' && userFollows) {
if (userFollows.includes(pubkey)) {
setFollowed(true);
}
if (db.account.follows.includes(pubkey)) {
setFollowed(true);
}
}, [status]);
}, []);
return (
<div>
@ -68,14 +69,7 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
<UserStats pubkey={pubkey} />
</div>
<div className="mt-4 inline-flex items-center gap-2">
{status === 'loading' ? (
<button
type="button"
className="inline-flex h-10 w-36 items-center justify-center rounded-md bg-white/10 text-sm font-medium hover:bg-fuchsia-500"
>
Loading...
</button>
) : followed ? (
{followed ? (
<button
type="button"
onClick={() => unfollowUser(pubkey)}

View File

@ -98,6 +98,32 @@ export function useNostr() {
}
};
const addContact = async (pubkey: string) => {
const list = new Set(db.account.follows);
list.add(pubkey);
const tags = [];
list.forEach((item) => {
tags.push(['p', item]);
});
// publish event
publish({ content: '', kind: NDKKind.Contacts, tags: tags });
};
const removeContact = async (pubkey: string) => {
const list = new Set(db.account.follows);
list.delete(pubkey);
const tags = [];
list.forEach((item) => {
tags.push(['p', item]);
});
// publish event
publish({ content: '', kind: NDKKind.Contacts, tags: tags });
};
const prefetchEvents = async () => {
try {
const fetcher = NostrFetcher.withCustomPool(ndkAdapter(ndk));
@ -309,6 +335,8 @@ export function useNostr() {
return {
sub,
fetchUserData,
addContact,
removeContact,
prefetchEvents,
fetchActivities,
fetchNIP04Chats,

View File

@ -1,69 +0,0 @@
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { useNDK } from '@libs/ndk/provider';
import { useStorage } from '@libs/storage/provider';
import { useNostr } from '@utils/hooks/useNostr';
export function useSocial() {
const queryClient = useQueryClient();
const { publish } = useNostr();
const { ndk } = useNDK();
const { db } = useStorage();
const { status, data: userFollows } = useQuery(
['userFollows', db.account.pubkey],
async () => {
const keys = [];
const user = ndk.getUser({ hexpubkey: db.account.pubkey });
const follows = await user.follows();
follows.forEach((item) => {
keys.push(item.hexpubkey);
});
return keys;
},
{
refetchOnReconnect: false,
refetchOnMount: false,
refetchOnWindowFocus: false,
}
);
const unfollow = (pubkey: string) => {
const followsAsSet = new Set(userFollows);
followsAsSet.delete(pubkey);
const tags = [];
followsAsSet.forEach((item) => {
tags.push(['p', item]);
});
// publish event
publish({ content: '', kind: 3, tags: tags });
// invalid cache
queryClient.invalidateQueries({
queryKey: ['userFollows', db.account.pubkey],
});
};
const follow = async (pubkey: string) => {
const followsAsSet = new Set(userFollows);
followsAsSet.add(pubkey);
const tags = [];
followsAsSet.forEach((item) => {
tags.push(['p', item]);
});
// publish event
publish({ content: '', kind: 3, tags: tags });
// invalid cache
queryClient.invalidateQueries({
queryKey: ['userFollows', db.account.pubkey],
});
};
return { status, userFollows, follow, unfollow };
}