From 823b203b7314917895f06f0e95510de3c4dab75f Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Mon, 14 Aug 2023 14:12:54 +0700 Subject: [PATCH] update useNostr hook --- package.json | 4 +- pnpm-lock.yaml | 157 +++++++---------- src-tauri/Cargo.lock | 10 +- src/app/space/components/widgets/network.tsx | 4 +- src/app/splash.tsx | 13 +- src/utils/hooks/useEvent.tsx | 45 +---- src/utils/hooks/useNostr.tsx | 167 +++++++------------ src/utils/hooks/useProfile.tsx | 2 +- 8 files changed, 145 insertions(+), 257 deletions(-) diff --git a/package.json b/package.json index 955b530b..c0344d13 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "@vitejs/plugin-react-swc": "^3.3.2", - "autoprefixer": "^10.4.14", + "autoprefixer": "^10.4.15", "clsx": "^2.0.0", "cross-env": "^7.0.3", "csstype": "^3.1.2", @@ -99,7 +99,7 @@ "eslint-plugin-react": "^7.33.1", "eslint-plugin-simple-import-sort": "^10.0.0", "husky": "^8.0.3", - "lint-staged": "^13.2.3", + "lint-staged": "^13.3.0", "postcss": "^8.4.27", "prettier": "^2.8.8", "prettier-plugin-tailwindcss": "^0.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13b2fca6..2660c40d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -211,8 +211,8 @@ devDependencies: specifier: ^3.3.2 version: 3.3.2(vite@4.4.9) autoprefixer: - specifier: ^10.4.14 - version: 10.4.14(postcss@8.4.27) + specifier: ^10.4.15 + version: 10.4.15(postcss@8.4.27) clsx: specifier: ^2.0.0 version: 2.0.0 @@ -244,8 +244,8 @@ devDependencies: specifier: ^8.0.3 version: 8.0.3 lint-staged: - specifier: ^13.2.3 - version: 13.2.3 + specifier: ^13.3.0 + version: 13.3.0 postcss: specifier: ^8.4.27 version: 8.4.27 @@ -2545,6 +2545,7 @@ packages: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 + dev: false /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2559,6 +2560,14 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.21.3 + dev: false + + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -2712,13 +2721,8 @@ packages: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: true - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true - - /autoprefixer@10.4.14(postcss@8.4.27): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + /autoprefixer@10.4.15(postcss@8.4.27): + resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2872,8 +2876,8 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true @@ -2904,20 +2908,13 @@ packages: /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + dev: false - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - restore-cursor: 3.1.0 - dev: true - - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 + restore-cursor: 4.0.0 dev: true /cli-truncate@3.1.0: @@ -2967,9 +2964,9 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} dev: true /commander@4.1.1: @@ -3217,6 +3214,7 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -3687,7 +3685,6 @@ packages: /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false /execa@7.2.0: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} @@ -4140,6 +4137,7 @@ packages: /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + dev: false /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -4251,6 +4249,7 @@ packages: /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + dev: false /is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} @@ -4497,21 +4496,18 @@ packages: uc.micro: 1.0.6 dev: false - /lint-staged@13.2.3: - resolution: {integrity: sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==} - engines: {node: ^14.13.1 || >=16.0.0} + /lint-staged@13.3.0: + resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true dependencies: - chalk: 5.2.0 - cli-truncate: 3.1.0 - commander: 10.0.1 + chalk: 5.3.0 + commander: 11.0.0 debug: 4.3.4 execa: 7.2.0 lilconfig: 2.1.0 - listr2: 5.0.8 + listr2: 6.6.1 micromatch: 4.0.5 - normalize-path: 3.0.0 - object-inspect: 1.12.3 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.3.1 @@ -4520,23 +4516,21 @@ packages: - supports-color dev: true - /listr2@5.0.8: - resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} - engines: {node: ^14.13.1 || >=16.0.0} + /listr2@6.6.1: + resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: '>=16.0.0'} peerDependencies: enquirer: '>= 2.3.0 < 3' peerDependenciesMeta: enquirer: optional: true dependencies: - cli-truncate: 2.1.0 + cli-truncate: 3.1.0 colorette: 2.0.20 - log-update: 4.0.0 - p-map: 4.0.0 + eventemitter3: 5.0.1 + log-update: 5.0.1 rfdc: 1.3.0 - rxjs: 7.8.1 - through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 8.1.0 dev: true /load-json-file@4.0.0: @@ -4589,14 +4583,15 @@ packages: is-unicode-supported: 0.1.0 dev: false - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + /log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 dev: true /longest-streak@3.1.0: @@ -5538,6 +5533,7 @@ packages: engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 + dev: false /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} @@ -6313,9 +6309,9 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 @@ -6357,12 +6353,6 @@ packages: dependencies: queue-microtask: 1.2.3 - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.1 - dev: true - /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -6474,24 +6464,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -6579,6 +6551,7 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + dev: false /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} @@ -6790,10 +6763,6 @@ packages: engines: {node: '>=10'} dev: false - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - /tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} dependencies: @@ -6874,6 +6843,7 @@ packages: /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: false /tstl@2.5.13: resolution: {integrity: sha512-h9wayHHFI5+yqt8iau0vqH96cTNhezhZ/Fk/hrIdpfkiMu3lg9nzyvMfs5bIdX51IVzZO6DudLqhkL/rVXpT6g==} @@ -6906,6 +6876,7 @@ packages: /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + dev: false /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} @@ -6917,6 +6888,11 @@ packages: engines: {node: '>=8'} dev: false + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -7318,15 +7294,6 @@ packages: string-width: 4.2.3 dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -7334,6 +7301,7 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: false /wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} @@ -7342,7 +7310,6 @@ packages: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: false /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 97c844dd..a7aa7710 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2234,9 +2234,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" @@ -4991,9 +4991,9 @@ dependencies = [ [[package]] name = "tao-macros" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445" +checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" dependencies = [ "proc-macro2", "quote", @@ -6184,7 +6184,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window-vibrancy" version = "0.4.0" -source = "git+https://github.com/tauri-apps/window-vibrancy?branch=dev#d1b349f3c3f524ffd3ba37b64349ec6ad6410272" +source = "git+https://github.com/tauri-apps/window-vibrancy?branch=dev#c463a8b324e7a3fac18a006bcc92b27fc3d97a04" dependencies = [ "cocoa 0.25.0", "objc", diff --git a/src/app/space/components/widgets/network.tsx b/src/app/space/components/widgets/network.tsx index 2eb9e510..bf301952 100644 --- a/src/app/space/components/widgets/network.tsx +++ b/src/app/space/components/widgets/network.tsx @@ -18,11 +18,11 @@ const ITEM_PER_PAGE = 10; export function NetworkBlock() { // subscribe for live update - useNewsfeed(); + // useNewsfeed(); const { status, data, fetchNextPage, hasNextPage, isFetchingNextPage } = useInfiniteQuery({ - queryKey: ['newsfeed-circle'], + queryKey: ['network-widget'], queryFn: async ({ pageParam = 0 }) => { return await getNotes(ITEM_PER_PAGE, pageParam); }, diff --git a/src/app/splash.tsx b/src/app/splash.tsx index df0bcbdb..f0579c0b 100644 --- a/src/app/splash.tsx +++ b/src/app/splash.tsx @@ -12,7 +12,7 @@ import { useNostr } from '@utils/hooks/useNostr'; export function SplashScreen() { const { ndk, relayUrls } = useNDK(); const { status, account } = useAccount(); - const { fetchChats, fetchNotes } = useNostr(); + const { fetchUserData } = useNostr(); const [isLoading, setIsLoading] = useState(true); const [errorMessage, setErrorMessage] = useState(null); @@ -27,18 +27,15 @@ export function SplashScreen() { if (step) await invoke('close_splashscreen'); try { - const notes = await fetchNotes(); - const chats = await fetchChats(); - - if (notes.status === 'ok' && chats.status === 'ok') { + const user = await fetchUserData(); + if (user.status === 'ok') { const now = Math.floor(Date.now() / 1000); await updateLastLogin(now); invoke('close_splashscreen'); } else { setIsLoading(false); - setErrorMessage(notes.message || chats.message); - console.log('fetch notes failed, error: ', notes.message); - console.log('fetch chats failed, error: ', chats.message); + setErrorMessage(user.message); + console.log('fetch failed, error: ', user.message); } } catch (e) { setIsLoading(false); diff --git a/src/utils/hooks/useEvent.tsx b/src/utils/hooks/useEvent.tsx index 2ae79148..aa282994 100644 --- a/src/utils/hooks/useEvent.tsx +++ b/src/utils/hooks/useEvent.tsx @@ -1,51 +1,24 @@ import { useQuery } from '@tanstack/react-query'; import { useNDK } from '@libs/ndk/provider'; -import { createNote, getNoteByID } from '@libs/storage'; import { parser } from '@utils/parser'; import { LumeEvent } from '@utils/types'; -export function useEvent(id: string, fallback?: string) { +export function useEvent(id: string, embed?: string) { const { ndk } = useNDK(); const { status, data, error, isFetching } = useQuery( ['note', id], async () => { - const result = await getNoteByID(id); - if (result) { - return result as LumeEvent; + if (embed) { + const event: LumeEvent = JSON.parse(embed); + if (event.kind === 1) embed['content'] = parser(event); + return embed; } else { - if (fallback) { - const embed: LumeEvent = JSON.parse(fallback); - if (embed.kind === 1) embed['content'] = parser(embed); - embed['event_id'] = embed.id; - await createNote( - embed.id, - embed.pubkey, - embed.kind, - embed.tags, - embed.content as unknown as string, - embed.created_at - ); - return embed; - } else { - const event = (await ndk.fetchEvent(id)) as unknown as LumeEvent; - if (event) { - await createNote( - event.id, - event.pubkey, - event.kind, - event.tags, - event.content as unknown as string, - event.created_at - ); - event['event_id'] = event.id; - if (event.kind === 1) event['content'] = parser(event); - return event as unknown as LumeEvent; - } else { - throw new Error('Event not found'); - } - } + const event = (await ndk.fetchEvent(id)) as unknown as LumeEvent; + if (!event) throw new Error('Event not found'); + if (event.kind === 1) event['content'] = parser(event); + return event as unknown as LumeEvent; } }, { diff --git a/src/utils/hooks/useNostr.tsx b/src/utils/hooks/useNostr.tsx index c3038aa8..d2b06f1a 100644 --- a/src/utils/hooks/useNostr.tsx +++ b/src/utils/hooks/useNostr.tsx @@ -1,5 +1,13 @@ -import { NDKEvent, NDKKind, NDKPrivateKeySigner, NDKUser } from '@nostr-dev-kit/ndk'; +import { + NDKEvent, + NDKFilter, + NDKKind, + NDKPrivateKeySigner, + NDKSubscription, + NDKUser, +} from '@nostr-dev-kit/ndk'; import { ndkAdapter } from '@nostr-fetch/adapter-ndk'; +import { useQueryClient } from '@tanstack/react-query'; import destr from 'destr'; import { LRUCache } from 'lru-cache'; import { NostrFetcher } from 'nostr-fetch'; @@ -7,152 +15,95 @@ import { nip19 } from 'nostr-tools'; import { useMemo } from 'react'; import { useNDK } from '@libs/ndk/provider'; -import { - countTotalNotes, - createChat, - createNote, - getLastLogin, - updateAccount, -} from '@libs/storage'; +import { updateAccount } from '@libs/storage'; import { useStronghold } from '@stores/stronghold'; -import { nHoursAgo } from '@utils/date'; import { useAccount } from '@utils/hooks/useAccount'; export function useNostr() { const { ndk, relayUrls } = useNDK(); const { account } = useAccount(); - const fetcher = useMemo(() => NostrFetcher.withCustomPool(ndkAdapter(ndk)), [ndk]); + const queryClient = useQueryClient(); const privkey = useStronghold((state) => state.privkey); + const fetcher = useMemo(() => NostrFetcher.withCustomPool(ndkAdapter(ndk)), [ndk]); + const subManager = useMemo( + () => + new LRUCache({ + max: 4, + dispose: (sub) => sub.stop(), + }), + [] + ); - async function fetchNetwork(prevFollow?: string[]) { - const follows = new Set(prevFollow || []); - const lruNetwork = new LRUCache({ max: 300 }); + const sub = async ( + filter: NDKFilter, + callback: (event: NDKEvent) => void, + closeOnEose?: boolean + ) => { + const subEvent = ndk.subscribe(filter, { closeOnEose: closeOnEose ?? true }); + subManager.set(JSON.stringify(filter), subEvent); - let network: string[]; + subEvent.addListener('event', (event: NDKEvent) => { + callback(event); + }); + }; - // fetch user's follows - if (!prevFollow) { - console.log("fetching user's follow..."); - const user = ndk.getUser({ hexpubkey: account.pubkey }); - const list = await user.follows(); - list.forEach((item: NDKUser) => { - follows.add(nip19.decode(item.npub).data as string); - }); - } + const fetchUserData = async (preFollows?: string[]) => { + try { + const follows = new Set(preFollows || []); + const lruNetwork = new LRUCache({ max: 300 }); - // fetch network - if (!account.network) { - console.log("fetching user's network..."); + // fetch user's follows + if (!preFollows) { + const user = ndk.getUser({ hexpubkey: account.pubkey }); + const list = await user.follows(); + list.forEach((item: NDKUser) => { + follows.add(nip19.decode(item.npub).data as string); + }); + } + + // build user's network const events = await ndk.fetchEvents({ kinds: [3], authors: [...follows] }); - events.forEach((event: NDKEvent) => { event.tags.forEach((tag) => { if (tag[0] === 'p') lruNetwork.set(tag[1], tag[1]); }); }); - network = [...lruNetwork.values()] as string[]; - } else { - network = account.network; - } + const network = [...lruNetwork.values()] as string[]; - // update user in db - await updateAccount('follows', [...follows]); - await updateAccount('network', network); + await updateAccount('follows', [...follows]); + await updateAccount('network', [...new Set([...follows, ...network])]); - return [...new Set([...follows, ...network])]; - } - - async function fetchNotes(prevFollow?: string[]) { - try { - if (!ndk) return { status: 'failed', message: 'NDK instance not found' }; - - const network = await fetchNetwork(prevFollow); - const totalNotes = await countTotalNotes(); - const lastLogin = await getLastLogin(); - - if (network.length > 0) { - console.log('fetching notes...'); - - let since: number; - if (totalNotes === 0 || lastLogin === 0) { - since = nHoursAgo(24); - } else { - since = lastLogin; - } - - const events = await fetcher.fetchAllEvents( - relayUrls, - { - kinds: [1], - authors: network, - }, - { since: since } - ); - - for (const event of events) { - await createNote( - event.id, - event.pubkey, - event.kind, - event.tags, - event.content, - event.created_at - ); - } - } + queryClient.invalidateQueries(['currentAccount']); return { status: 'ok' }; } catch (e) { - console.error('failed fetch notes, error: ', e); return { status: 'failed', message: e }; } - } + }; - async function fetchChats() { + const fetchNotes = async (since: number) => { try { if (!ndk) return { status: 'failed', message: 'NDK instance not found' }; - const lastLogin = await getLastLogin(); - - const outgoingMessages = await fetcher.fetchAllEvents( + const events = await fetcher.fetchAllEvents( relayUrls, { - kinds: [4], - authors: [account.pubkey], + kinds: [1], + authors: account.network ?? account.follows, }, - { since: lastLogin } + { since: since } ); - const incomingMessages = await fetcher.fetchAllEvents( - relayUrls, - { kinds: [4], '#p': [account.pubkey] }, - { since: lastLogin } - ); - - const messages = [...outgoingMessages, ...incomingMessages]; - - for (const event of messages) { - const receiverPubkey = event.tags.find((t) => t[0] === 'p')[1] || account.pubkey; - await createChat( - event.id, - receiverPubkey, - event.pubkey, - event.content, - event.tags, - event.created_at - ); - } - - return { status: 'ok' }; + return { status: 'ok', notes: events }; } catch (e) { - console.error('failed fetch messages, error: ', e); + console.error('failed get notes, error: ', e); return { status: 'failed', message: e }; } - } + }; const publish = async ({ content, @@ -203,5 +154,5 @@ export function useNostr() { return res; }; - return { fetchNotes, fetchChats, publish, createZap }; + return { sub, fetchUserData, fetchNotes, publish, createZap }; } diff --git a/src/utils/hooks/useProfile.tsx b/src/utils/hooks/useProfile.tsx index c815a0ac..a59b1391 100644 --- a/src/utils/hooks/useProfile.tsx +++ b/src/utils/hooks/useProfile.tsx @@ -14,7 +14,7 @@ export function useProfile(pubkey: string, fallback?: string) { ['user', pubkey], async () => { if (!fallback) { - const user = await ndk.getUser({ hexpubkey: pubkey }); + const user = ndk.getUser({ hexpubkey: pubkey }); await user.fetchProfile(); if (user.profile) { user.profile.display_name = user.profile.displayName;