diff --git a/package.json b/package.json index d1a09fdc..c77dc1cc 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ "@floating-ui/react": "^0.23.1", "@headlessui/react": "^1.7.14", "@supabase/supabase-js": "^2.21.0", + "@tanstack/react-query": "^4.29.5", + "@tanstack/react-virtual": "3.0.0-beta.54", "@tauri-apps/api": "^1.2.0", "@vidstack/react": "^0.4.5", "dayjs": "^1.11.7", @@ -31,7 +33,7 @@ "react-string-replace": "^1.1.0", "react-virtuoso": "^4.3.1", "react-youtube": "^10.1.0", - "swr": "^2.1.4", + "swr": "^2.1.5", "tailwind-merge": "^1.12.0", "tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql", "vidstack": "^0.4.5" @@ -40,9 +42,9 @@ "@tailwindcss/typography": "^0.5.9", "@tauri-apps/cli": "^1.2.3", "@trivago/prettier-plugin-sort-imports": "^4.1.1", - "@types/node": "^18.16.0", - "@types/react": "^18.0.38", - "@types/react-dom": "^18.0.11", + "@types/node": "^18.16.1", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.1", "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "^5.59.1", "@typescript-eslint/parser": "^5.59.1", @@ -62,9 +64,9 @@ "prettier": "^2.8.8", "prettier-plugin-tailwindcss": "^0.2.7", "prop-types": "^15.8.1", - "tailwindcss": "^3.3.1", + "tailwindcss": "^3.3.2", "typescript": "^4.9.5", - "vite": "^4.3.1", + "vite": "^4.3.2", "vite-plugin-ssr": "^0.4.117", "vite-plugin-top-level-await": "^1.3.0", "vite-tsconfig-paths": "^4.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6afafb6c..3c0964f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,12 +10,18 @@ dependencies: '@supabase/supabase-js': specifier: ^2.21.0 version: 2.21.0(encoding@0.1.13) + '@tanstack/react-query': + specifier: ^4.29.5 + version: 4.29.5(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-virtual': + specifier: 3.0.0-beta.54 + version: 3.0.0-beta.54(react@18.2.0) '@tauri-apps/api': specifier: ^1.2.0 version: 1.2.0 '@vidstack/react': specifier: ^0.4.5 - version: 0.4.5(@types/react@18.0.38)(maverick.js@0.33.1)(media-icons@0.4.2)(react@18.2.0)(vidstack@0.4.5) + version: 0.4.5(@types/react@18.2.0)(maverick.js@0.33.1)(media-icons@0.4.2)(react@18.2.0)(vidstack@0.4.5) dayjs: specifier: ^1.11.7 version: 1.11.7 @@ -53,14 +59,14 @@ dependencies: specifier: ^10.1.0 version: 10.1.0(react@18.2.0) swr: - specifier: ^2.1.4 - version: 2.1.4(react@18.2.0) + specifier: ^2.1.5 + version: 2.1.5(react@18.2.0) tailwind-merge: specifier: ^1.12.0 version: 1.12.0 tauri-plugin-sql-api: specifier: github:tauri-apps/tauri-plugin-sql - version: github.com/tauri-apps/tauri-plugin-sql/62b21ef24303d80e9905f57b2b6d27efc8677c23 + version: github.com/tauri-apps/tauri-plugin-sql/e180c047ed2de5b3fd89af92e4fed57520d8c918 vidstack: specifier: ^0.4.5 version: 0.4.5 @@ -68,7 +74,7 @@ dependencies: devDependencies: '@tailwindcss/typography': specifier: ^0.5.9 - version: 0.5.9(tailwindcss@3.3.1) + version: 0.5.9(tailwindcss@3.3.2) '@tauri-apps/cli': specifier: ^1.2.3 version: 1.2.3 @@ -76,14 +82,14 @@ devDependencies: specifier: ^4.1.1 version: 4.1.1(prettier@2.8.8) '@types/node': - specifier: ^18.16.0 - version: 18.16.0 + specifier: ^18.16.1 + version: 18.16.1 '@types/react': - specifier: ^18.0.38 - version: 18.0.38 + specifier: ^18.2.0 + version: 18.2.0 '@types/react-dom': - specifier: ^18.0.11 - version: 18.0.11 + specifier: ^18.2.1 + version: 18.2.1 '@types/youtube-player': specifier: ^5.5.7 version: 5.5.7 @@ -95,7 +101,7 @@ devDependencies: version: 5.59.1(eslint@8.39.0)(typescript@4.9.5) '@vitejs/plugin-react-swc': specifier: ^3.3.0 - version: 3.3.0(vite@4.3.1) + version: 3.3.0(vite@4.3.2) autoprefixer: specifier: ^10.4.14 version: 10.4.14(postcss@8.4.23) @@ -142,28 +148,34 @@ devDependencies: specifier: ^15.8.1 version: 15.8.1 tailwindcss: - specifier: ^3.3.1 - version: 3.3.1(postcss@8.4.23) + specifier: ^3.3.2 + version: 3.3.2 typescript: specifier: ^4.9.5 version: 4.9.5 vite: - specifier: ^4.3.1 - version: 4.3.1(@types/node@18.16.0) + specifier: ^4.3.2 + version: 4.3.2(@types/node@18.16.1) vite-plugin-ssr: specifier: ^0.4.117 - version: 0.4.117(vite@4.3.1) + version: 0.4.117(vite@4.3.2) vite-plugin-top-level-await: specifier: ^1.3.0 - version: 1.3.0(vite@4.3.1) + version: 1.3.0(vite@4.3.2) vite-tsconfig-paths: specifier: ^4.2.0 - version: 4.2.0(typescript@4.9.5)(vite@4.3.1) + version: 4.2.0(typescript@4.9.5)(vite@4.3.2) ws: specifier: ^8.13.0 version: 8.13.0 packages: + /@alloc/quick-lru@5.2.0: + resolution: + { integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== } + engines: { node: '>=10' } + dev: true + /@babel/code-frame@7.21.4: resolution: { integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== } @@ -830,9 +842,9 @@ packages: - supports-color dev: false - /@swc/core-darwin-arm64@1.3.54: + /@swc/core-darwin-arm64@1.3.55: resolution: - { integrity: sha512-B1nTlkhTfzt95C/p+iWRaqwHTqqVWcqpHatnieIKxMCaceuZjvd7PeddbHmmrFFfjQqfs8UNzwrTVpgsFwCJWg== } + { integrity: sha512-UnHC8aPg/JvHhgXxTU6EhTtfnYNS7nhq8EKB8laNPxlHbwEyMBVQ2QuJHlNCtFtvSfX/uH5l04Ld1iGXnBTfdQ== } engines: { node: '>=10' } cpu: [arm64] os: [darwin] @@ -840,9 +852,9 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.54: + /@swc/core-darwin-x64@1.3.55: resolution: - { integrity: sha512-FM+46dRyvJySCrDIDARamycjl/LB9taQCFQg5QpQmQFwIkZ7GIaiQUZO9cdrZUBGPJJCsm7o2FG4ufwnVsCHHA== } + { integrity: sha512-VNJkFVARrktIqtaLrD1NFA54gqekH7eAUcUY2U2SdHwO67HYjfMXMxlugLP5PDasSKpTkrVooUdhkffoA5W50g== } engines: { node: '>=10' } cpu: [x64] os: [darwin] @@ -850,9 +862,9 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.54: + /@swc/core-linux-arm-gnueabihf@1.3.55: resolution: - { integrity: sha512-5EfxTKllNm+ucjuo3WNhwHfY417UwqCsaqjJnveXgn5DU+6/ft96skdpD+xrBp5ejMNzem8xYambOrBLzs2QDw== } + { integrity: sha512-6OcohhIFKKNW/TpJt26Tpul8zyL7dmp1Lnyj2BX9ycsZZ5UnsNiGqn37mrqJgVTx/ansEmbyOmKu2mzm/Ct6cQ== } engines: { node: '>=10' } cpu: [arm] os: [linux] @@ -860,9 +872,9 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.54: + /@swc/core-linux-arm64-gnu@1.3.55: resolution: - { integrity: sha512-4AmBlRaelUYcW9aR/q3z8UiNYsQ/1JtinETCZBye08wnwK81ITriYcHTBPP8Ix8IZtkcvpsN/SsGAnLNcrpRBQ== } + { integrity: sha512-MfZtXGBv21XWwvrSMP0CMxScDolT/iv5PRl9UBprYUehwWr7BNjA3V9W7QQ+kKoPyORWk7LX7OpJZF3FnO618Q== } engines: { node: '>=10' } cpu: [arm64] os: [linux] @@ -870,9 +882,9 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.54: + /@swc/core-linux-arm64-musl@1.3.55: resolution: - { integrity: sha512-twgmC6wfH2WW5mlG/rHk4GnbDZ2UDetF0PMJt/ICmgBwJsDSf71WSI9CA5b/F1wE9DE0ofyo+yukjuj9TtPvOQ== } + { integrity: sha512-iZJo+7L5lv10W0f0C6SlyteAyMJt5Tp+aH3+nlAwKdtc+VjyL1sGhR8DJMXp2/buBRZJ9tjEtpXKDaWUdSdF7Q== } engines: { node: '>=10' } cpu: [arm64] os: [linux] @@ -880,9 +892,9 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.54: + /@swc/core-linux-x64-gnu@1.3.55: resolution: - { integrity: sha512-/dE+z0pF1R0vvXPTQ43+cypltfbZDI0C3WuDMkb1KIaQS7yiaufzzWIVGfJisoKGxpyk3ABSSPcStEqedpvJ+w== } + { integrity: sha512-Rmc8ny/mslzzz0+wNK9/mLdyAWVbMZHRSvljhpzASmq48NBkmZ5vk9/WID6MnUz2e9cQ0JxJQs8t39KlFJtW3g== } engines: { node: '>=10' } cpu: [x64] os: [linux] @@ -890,9 +902,9 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.54: + /@swc/core-linux-x64-musl@1.3.55: resolution: - { integrity: sha512-/dGU5pCaPYEaaPAPt+Fa+9cCTNuhmtdTpxwUX0ZF3VlWAf3QPoTcPYkUDEOvWcl3g8RpEr7ZGp9beVCp2NpLpA== } + { integrity: sha512-Ymoc4xxINzS93ZjVd2UZfLZk1jF6wHjdCbC1JF+0zK3IrNrxCIDoWoaAj0+Bbvyo3hD1Xg/cneSTsqX8amnnuQ== } engines: { node: '>=10' } cpu: [x64] os: [linux] @@ -900,9 +912,9 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.54: + /@swc/core-win32-arm64-msvc@1.3.55: resolution: - { integrity: sha512-gpqOqHB7fHqTApS8pvW1/oMCcfEH1LxRU81KqUGY/MXR3DDwpnDY3ycyCzRB4tpNr91ZpgzUtrlx8OQCHq75uw== } + { integrity: sha512-OhnmFstq2qRU2GI5I0G/8L+vc2rx8+w+IOA6EZBrY4FuMCbPIZKKzlnAIxYn2W+yD4gvBzYP3tgEcaDfQk6EkA== } engines: { node: '>=10' } cpu: [arm64] os: [win32] @@ -910,9 +922,9 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.54: + /@swc/core-win32-ia32-msvc@1.3.55: resolution: - { integrity: sha512-2h+EnYoEDZcPfoGCKU4F/gbDz0Dw+vQG7b5rxwo6IWFhB2mGOMiYZzbIo6LVyFRoSXNVNa88Yov18pgfeM9gMw== } + { integrity: sha512-3VR5rHZ6uoL/Vo3djV30GgX2oyDwWWsk+Yp+nyvYyBaKYiH2zeHfxdYRLSQV3W7kSlCAH3oDYpSljrWZ0t5XEQ== } engines: { node: '>=10' } cpu: [ia32] os: [win32] @@ -920,9 +932,9 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.54: + /@swc/core-win32-x64-msvc@1.3.55: resolution: - { integrity: sha512-//W/mqIVuOxMRVI3ojCF6jKLpugu6sSSsCaBpM9GdDVGAaAt0UdivKzecqHIt2PGoN6l1mT73Zy+083PvkPhHQ== } + { integrity: sha512-KBtMFtRwnbxBugYf6i2ePqEGdxsk715KcqGMjGhxNg7BTACnXnhj37irHu2e7A7wZffbkUVUYuj/JEgVkEjSxg== } engines: { node: '>=10' } cpu: [x64] os: [win32] @@ -930,9 +942,9 @@ packages: dev: true optional: true - /@swc/core@1.3.54: + /@swc/core@1.3.55: resolution: - { integrity: sha512-/BCIn698CHkQz3d3VY5W5BHagbwkKen295mDM+JPfDepLsLy3lKtD1+GZqZYKVQDebUj90eAn7OD+qBrAxPtaA== } + { integrity: sha512-w/lN3OuJsuy868yJZKop+voZLVzI5pVSoopQVtgDNkEzejnPuRp9XaeAValvuMaWqKoTMtOjLzEPyv/xiAGYQQ== } engines: { node: '>=10' } requiresBuild: true peerDependencies: @@ -941,19 +953,19 @@ packages: '@swc/helpers': optional: true optionalDependencies: - '@swc/core-darwin-arm64': 1.3.54 - '@swc/core-darwin-x64': 1.3.54 - '@swc/core-linux-arm-gnueabihf': 1.3.54 - '@swc/core-linux-arm64-gnu': 1.3.54 - '@swc/core-linux-arm64-musl': 1.3.54 - '@swc/core-linux-x64-gnu': 1.3.54 - '@swc/core-linux-x64-musl': 1.3.54 - '@swc/core-win32-arm64-msvc': 1.3.54 - '@swc/core-win32-ia32-msvc': 1.3.54 - '@swc/core-win32-x64-msvc': 1.3.54 + '@swc/core-darwin-arm64': 1.3.55 + '@swc/core-darwin-x64': 1.3.55 + '@swc/core-linux-arm-gnueabihf': 1.3.55 + '@swc/core-linux-arm64-gnu': 1.3.55 + '@swc/core-linux-arm64-musl': 1.3.55 + '@swc/core-linux-x64-gnu': 1.3.55 + '@swc/core-linux-x64-musl': 1.3.55 + '@swc/core-win32-arm64-msvc': 1.3.55 + '@swc/core-win32-ia32-msvc': 1.3.55 + '@swc/core-win32-x64-msvc': 1.3.55 dev: true - /@tailwindcss/typography@0.5.9(tailwindcss@3.3.1): + /@tailwindcss/typography@0.5.9(tailwindcss@3.3.2): resolution: { integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg== } peerDependencies: @@ -963,9 +975,48 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.1(postcss@8.4.23) + tailwindcss: 3.3.2 dev: true + /@tanstack/query-core@4.29.5: + resolution: + { integrity: sha512-xXIiyQ/4r9KfaJ3k6kejqcaqFXXBTzN2aOJ5H1J6aTJE9hl/nbgAdfF6oiIu0CD5xowejJEJ6bBg8TO7BN4NuQ== } + dev: false + + /@tanstack/react-query@4.29.5(react-dom@18.2.0)(react@18.2.0): + resolution: + { integrity: sha512-F87cibC3s3eG0Q90g2O+hqntpCrudKFnR8P24qkH9uccEhXErnJxBC/AAI4cJRV2bfMO8IeGZQYf3WyYgmSg0w== } + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.29.5 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /@tanstack/react-virtual@3.0.0-beta.54(react@18.2.0): + resolution: + { integrity: sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ== } + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/virtual-core': 3.0.0-beta.54 + react: 18.2.0 + dev: false + + /@tanstack/virtual-core@3.0.0-beta.54: + resolution: + { integrity: sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g== } + dev: false + /@tauri-apps/api@1.2.0: resolution: { integrity: sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw== } @@ -1105,9 +1156,9 @@ packages: { integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== } dev: true - /@types/node@18.16.0: + /@types/node@18.16.1: resolution: - { integrity: sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ== } + { integrity: sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA== } /@types/phoenix@1.5.6: resolution: @@ -1118,16 +1169,16 @@ packages: resolution: { integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== } - /@types/react-dom@18.0.11: + /@types/react-dom@18.2.1: resolution: - { integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== } + { integrity: sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w== } dependencies: - '@types/react': 18.0.38 + '@types/react': 18.2.0 dev: true - /@types/react@18.0.38: + /@types/react@18.2.0: resolution: - { integrity: sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw== } + { integrity: sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== } dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 @@ -1146,7 +1197,7 @@ packages: resolution: { integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ== } dependencies: - '@types/node': 18.16.0 + '@types/node': 18.16.1 dev: false /@types/youtube-player@5.5.7: @@ -1292,7 +1343,7 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@vidstack/react@0.4.5(@types/react@18.0.38)(maverick.js@0.33.1)(media-icons@0.4.2)(react@18.2.0)(vidstack@0.4.5): + /@vidstack/react@0.4.5(@types/react@18.2.0)(maverick.js@0.33.1)(media-icons@0.4.2)(react@18.2.0)(vidstack@0.4.5): resolution: { integrity: sha512-spcim3+p1fMzkhHRKn5PS54YQjfThW5M3F2+R8tCT+wpsxbbCDa/TGdLBoIy2oC0LNziPkn0vlBWIZko9F5iig== } engines: { node: '>=16' } @@ -1303,21 +1354,21 @@ packages: react: ^18.0.0 vidstack: 0.4.5 dependencies: - '@types/react': 18.0.38 + '@types/react': 18.2.0 maverick.js: 0.33.1 media-icons: 0.4.2 react: 18.2.0 vidstack: 0.4.5 dev: false - /@vitejs/plugin-react-swc@3.3.0(vite@4.3.1): + /@vitejs/plugin-react-swc@3.3.0(vite@4.3.2): resolution: { integrity: sha512-Ycg+n2eyCOTpn/wRy+evVo859+hw7qCj9iaX5CMny6x1fx1Uoq0xBG+a98lFtwLNGfGEnpI0F26YigRuxCRkwg== } peerDependencies: vite: ^4 dependencies: - '@swc/core': 1.3.54 - vite: 4.3.1(@types/node@18.16.0) + '@swc/core': 1.3.55 + vite: 4.3.2(@types/node@18.16.1) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -1542,7 +1593,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001481 - electron-to-chromium: 1.4.371 + electron-to-chromium: 1.4.372 node-releases: 2.0.10 update-browserslist-db: 1.0.11(browserslist@4.21.5) dev: true @@ -1846,9 +1897,9 @@ packages: { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } dev: true - /electron-to-chromium@1.4.371: + /electron-to-chromium@1.4.372: resolution: - { integrity: sha512-jlBzY4tFcJaiUjzhRTCWAqRvTO/fWzjA3Bls0mykzGZ7zvcMP7h05W6UcgzfT9Ca1SW2xyKDOFRyI0pQeRNZGw== } + { integrity: sha512-MrlFq/j+TYHOjeWsWGYfzevc25HNeJdsF6qaLFrqBTRWZQtWkb1myq/Q2veLWezVaa5OcSZ99CFwTT4aF4Mung== } dev: true /emoji-regex@8.0.0: @@ -2961,7 +3012,7 @@ packages: engines: { node: '>=16' } dependencies: '@maverick-js/signals': 5.9.3 - type-fest: 3.8.0 + type-fest: 3.9.0 dev: false /media-captions@0.0.8: @@ -3334,10 +3385,10 @@ packages: engines: { node: '>= 6' } dev: true - /postcss-import@14.1.0(postcss@8.4.23): + /postcss-import@15.1.0(postcss@8.4.23): resolution: - { integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== } - engines: { node: '>=10.0.0' } + { integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== } + engines: { node: '>=14.0.0' } peerDependencies: postcss: ^8.0.0 dependencies: @@ -3358,10 +3409,10 @@ packages: postcss: 8.4.23 dev: true - /postcss-load-config@3.1.4(postcss@8.4.23): + /postcss-load-config@4.0.1(postcss@8.4.23): resolution: - { integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== } - engines: { node: '>= 10' } + { integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== } + engines: { node: '>= 14' } peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -3373,12 +3424,12 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.23 - yaml: 1.10.2 + yaml: 2.2.2 dev: true - /postcss-nested@6.0.0(postcss@8.4.23): + /postcss-nested@6.0.1(postcss@8.4.23): resolution: - { integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== } + { integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== } engines: { node: '>=12.0' } peerDependencies: postcss: ^8.2.14 @@ -3509,12 +3560,6 @@ packages: { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } dev: true - /quick-lru@5.1.1: - resolution: - { integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== } - engines: { node: '>=10' } - dev: true - /react-dom@18.2.0(react@18.2.0): resolution: { integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== } @@ -3947,9 +3992,9 @@ packages: engines: { node: '>= 0.4' } dev: true - /swr@2.1.4(react@18.2.0): + /swr@2.1.5(react@18.2.0): resolution: - { integrity: sha512-NG+eu3s3YT7aCnL0BRzsYIh8U0HhzA4II1bNMTUtO5D+N+4+YJpcfLiagFdrt0IbTGCbOiVyzAIMvqOCsk9cQA== } + { integrity: sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw== } peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 dependencies: @@ -3967,17 +4012,15 @@ packages: { integrity: sha512-Y17eDp7FtN1+JJ4OY0Bqv9OA41O+MS8c1Iyr3T6JFLnOgLg3EvcyMKZAnQ8AGyvB5Nxm3t9Xb5Mhe139m8QT/g== } dev: false - /tailwindcss@3.3.1(postcss@8.4.23): + /tailwindcss@3.3.2: resolution: - { integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g== } - engines: { node: '>=12.13.0' } + { integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== } + engines: { node: '>=14.0.0' } hasBin: true - peerDependencies: - postcss: ^8.0.9 dependencies: + '@alloc/quick-lru': 5.2.0 arg: 5.0.2 chokidar: 3.5.3 - color-name: 1.1.4 didyoumean: 1.2.2 dlv: 1.1.3 fast-glob: 3.2.12 @@ -3990,13 +4033,12 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.23 - postcss-import: 14.1.0(postcss@8.4.23) + postcss-import: 15.1.0(postcss@8.4.23) postcss-js: 4.0.1(postcss@8.4.23) - postcss-load-config: 3.1.4(postcss@8.4.23) - postcss-nested: 6.0.0(postcss@8.4.23) + postcss-load-config: 4.0.1(postcss@8.4.23) + postcss-nested: 6.0.1(postcss@8.4.23) postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 - quick-lru: 5.1.1 resolve: 1.22.2 sucrase: 3.32.0 transitivePeerDependencies: @@ -4112,9 +4154,9 @@ packages: engines: { node: '>=10' } dev: true - /type-fest@3.8.0: + /type-fest@3.9.0: resolution: - { integrity: sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q== } + { integrity: sha512-hR8JP2e8UiH7SME5JZjsobBlEiatFoxpzCP+R3ZeCo7kAaG1jXQE5X/buLzogM6GJu8le9Y4OcfNuIQX0rZskA== } engines: { node: '>=14.16' } dev: false @@ -4217,10 +4259,10 @@ packages: maverick.js: 0.33.1 media-captions: 0.0.8 media-icons: 0.4.2 - type-fest: 3.8.0 + type-fest: 3.9.0 dev: false - /vite-plugin-ssr@0.4.117(vite@4.3.1): + /vite-plugin-ssr@0.4.117(vite@4.3.2): resolution: { integrity: sha512-jebuK9HGNTpwbNlhIygTmNX8W9ZJTClUv/V5MfvRbVGqL0jGkYbsKKwzRNbUDm5EMqblbFf9mMHt6KSIuh/YJQ== } engines: { node: '>=12.19.0' } @@ -4242,25 +4284,25 @@ packages: fast-glob: 3.2.12 picocolors: 1.0.0 sirv: 2.0.3 - vite: 4.3.1(@types/node@18.16.0) + vite: 4.3.2(@types/node@18.16.1) dev: true - /vite-plugin-top-level-await@1.3.0(vite@4.3.1): + /vite-plugin-top-level-await@1.3.0(vite@4.3.2): resolution: { integrity: sha512-owIfsgWudMlQODWJSwp0sQB3AZZu3qsMygeBjZy8CyjEk6OB9AGd8lHqmgwrcEqgvy9N58lYxSBLVk3/4ejEiA== } peerDependencies: vite: '>=2.8' dependencies: '@rollup/plugin-virtual': 3.0.1 - '@swc/core': 1.3.54 + '@swc/core': 1.3.55 uuid: 9.0.0 - vite: 4.3.1(@types/node@18.16.0) + vite: 4.3.2(@types/node@18.16.1) transitivePeerDependencies: - '@swc/helpers' - rollup dev: true - /vite-tsconfig-paths@4.2.0(typescript@4.9.5)(vite@4.3.1): + /vite-tsconfig-paths@4.2.0(typescript@4.9.5)(vite@4.3.2): resolution: { integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw== } peerDependencies: @@ -4272,15 +4314,15 @@ packages: debug: 4.3.4 globrex: 0.1.2 tsconfck: 2.1.1(typescript@4.9.5) - vite: 4.3.1(@types/node@18.16.0) + vite: 4.3.2(@types/node@18.16.1) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.3.1(@types/node@18.16.0): + /vite@4.3.2(@types/node@18.16.1): resolution: - { integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg== } + { integrity: sha512-9R53Mf+TBoXCYejcL+qFbZde+eZveQLDYd9XgULILLC1a5ZwPaqgmdVpL8/uvw2BM/1TzetWjglwm+3RO+xTyw== } engines: { node: ^14.18.0 || >=16.0.0 } hasBin: true peerDependencies: @@ -4304,7 +4346,7 @@ packages: terser: optional: true dependencies: - '@types/node': 18.16.0 + '@types/node': 18.16.1 esbuild: 0.17.18 postcss: 8.4.23 rollup: 3.21.0 @@ -4428,12 +4470,6 @@ packages: { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } dev: true - /yaml@1.10.2: - resolution: - { integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== } - engines: { node: '>= 6' } - dev: true - /yaml@2.2.2: resolution: { integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== } @@ -4457,10 +4493,10 @@ packages: - supports-color dev: false - github.com/tauri-apps/tauri-plugin-sql/62b21ef24303d80e9905f57b2b6d27efc8677c23: + github.com/tauri-apps/tauri-plugin-sql/e180c047ed2de5b3fd89af92e4fed57520d8c918: resolution: { - tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/62b21ef24303d80e9905f57b2b6d27efc8677c23, + tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/e180c047ed2de5b3fd89af92e4fed57520d8c918, } name: tauri-plugin-sql-api version: 0.0.0 diff --git a/src/components/eventCollector.tsx b/src/components/eventCollector.tsx index f1ff6e81..23424cbf 100644 --- a/src/components/eventCollector.tsx +++ b/src/components/eventCollector.tsx @@ -83,7 +83,7 @@ export default function EventCollector() { event.tags, event.content, event.created_at, - '' + event.id ); break; default: diff --git a/src/components/note/placeholder.tsx b/src/components/note/placeholder.tsx index 5c87d613..17f7ee2a 100644 --- a/src/components/note/placeholder.tsx +++ b/src/components/note/placeholder.tsx @@ -10,7 +10,6 @@ export const Placeholder = () => { ยท
-
diff --git a/src/components/note/quoteRepost.tsx b/src/components/note/quoteRepost.tsx index e1d57c0d..e80f3aba 100644 --- a/src/components/note/quoteRepost.tsx +++ b/src/components/note/quoteRepost.tsx @@ -8,7 +8,7 @@ export const NoteQuoteRepost = memo(function NoteQuoteRepost({ event }: { event: const rootNote = () => { let note = null; - if (event.content.length > 0) { + if (event.content) { const content = destr(event.content); if (content) { note = ; diff --git a/src/pages/index.page.tsx b/src/pages/index.page.tsx index 953ed892..e11a0f99 100644 --- a/src/pages/index.page.tsx +++ b/src/pages/index.page.tsx @@ -103,7 +103,7 @@ export function Page() { event.tags, event.content, event.created_at, - '' + event.id ); break; // hide message (channel only) diff --git a/src/pages/newsfeed/following/index.page.tsx b/src/pages/newsfeed/following/index.page.tsx index f4992c46..0cb23c59 100644 --- a/src/pages/newsfeed/following/index.page.tsx +++ b/src/pages/newsfeed/following/index.page.tsx @@ -4,113 +4,116 @@ import { NoteBase } from '@components/note/base'; import { Placeholder } from '@components/note/placeholder'; import { NoteQuoteRepost } from '@components/note/quoteRepost'; -import { filteredNotesAtom, hasNewerNoteAtom, notesAtom } from '@stores/note'; +import { hasNewerNoteAtom } from '@stores/note'; -import { dateToUnix } from '@utils/getDate'; -import { getLatestNotes, getNotes } from '@utils/storage'; +import { countTotalNotes, getNotes } from '@utils/storage'; +import { useInfiniteQuery } from '@tanstack/react-query'; +import { useVirtualizer } from '@tanstack/react-virtual'; import { ArrowUp } from 'iconoir-react'; -import { useAtom, useAtomValue, useSetAtom } from 'jotai'; -import { useCallback, useEffect, useRef } from 'react'; -import { Virtuoso } from 'react-virtuoso'; +import { useAtom } from 'jotai'; +import { useEffect, useRef } from 'react'; + +const ITEM_PER_PAGE = 20; +const TIME = Math.floor(Date.now() / 1000); + +let totalNotes = 0; + +if (typeof window !== 'undefined') { + const result = await countTotalNotes(); + totalNotes = result.total; +} export function Page() { - const [hasNewerNote, setHasNewerNote] = useAtom(hasNewerNoteAtom); - const setData = useSetAtom(notesAtom); - const data = useAtomValue(filteredNotesAtom); + const [hasNewerNote] = useAtom(hasNewerNoteAtom); - const virtuosoRef = useRef(null); - const now = useRef(new Date()); - const limit = useRef(20); - const offset = useRef(0); - - const itemContent: any = useCallback( - (index: string | number) => { - switch (data[index].kind) { - case 1: - return ; - case 6: - return ; - default: - break; - } + const { status, error, data, fetchNextPage, hasNextPage, isFetching, isFetchingNextPage }: any = useInfiniteQuery({ + queryKey: ['following'], + queryFn: async ({ pageParam = 0 }) => { + return await getNotes(TIME, ITEM_PER_PAGE, pageParam); }, - [data] - ); + getNextPageParam: (lastPage) => (lastPage.nextCursor <= totalNotes ? lastPage.nextCursor : 'undefined'), + }); - const computeItemKey = useCallback( - (index: string | number) => { - return data[index].event_id; - }, - [data] - ); + const allRows = data ? data.pages.flatMap((d: { data: any }) => d.data) : []; + const parentRef = useRef(); - const initialData = useCallback(async () => { - const result: any = await getNotes(dateToUnix(now.current), limit.current, offset.current); - setData((data) => [...data, ...result]); - }, [setData]); + const rowVirtualizer = useVirtualizer({ + count: hasNextPage ? allRows.length + 1 : allRows.length, + getScrollElement: () => parentRef.current, + estimateSize: () => 400, + overscan: 5, + }); - const loadMore = useCallback(async () => { - offset.current += limit.current; - // query next page - const result: any = await getNotes(dateToUnix(now.current), limit.current, offset.current); - setData((data) => [...data, ...result]); - }, [setData]); - - const loadLatest = useCallback(async () => { - // next query - const result: any = await getLatestNotes(dateToUnix(now.current)); - // update data - setData((data) => [...result, ...data]); - // hide newer trigger - setHasNewerNote(false); - // scroll to top - virtuosoRef.current.scrollToIndex({ index: -1 }); - }, [setData, setHasNewerNote]); + const itemsVirtualizer = rowVirtualizer.getVirtualItems(); useEffect(() => { - let initPage = false; + const [lastItem] = [...rowVirtualizer.getVirtualItems()].reverse(); - if (!initPage) { - initialData().catch(console.error); + if (!lastItem) { + return; } - return () => { - initPage = true; - }; - }, [initialData]); + if (lastItem.index >= allRows.length - 1 && hasNextPage && !isFetchingNextPage) { + fetchNextPage(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [fetchNextPage, allRows.length, rowVirtualizer.getVirtualItems()]); return (
{hasNewerNote && (
-
)} - + {status === 'loading' ? ( + + ) : status === 'error' ? ( +
{error.message}
+ ) : ( +
+ +
+
+ {rowVirtualizer.getVirtualItems().map((virtualRow) => { + const note = allRows[virtualRow.index]; + if (note) { + if (note.kind === 1) { + return ( +
+ +
+ ); + } else { + return ( +
+ +
+ ); + } + } + })} +
+
+
+ )} +
{isFetching && !isFetchingNextPage ? 'Background Updating...' : null}
); } - -const COMPONENTS = { - Header: () => , - EmptyPlaceholder: () => , - ScrollSeekPlaceholder: () => , -}; diff --git a/src/renderer/shell.tsx b/src/renderer/shell.tsx index b8e200ca..6bf2c8a9 100644 --- a/src/renderer/shell.tsx +++ b/src/renderer/shell.tsx @@ -5,14 +5,19 @@ import { PageContextProvider } from '@utils/hooks/usePageContext'; import { PageContext } from '@renderer/types'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { StrictMode } from 'react'; +const queryClient = new QueryClient(); + export function Shell({ children, pageContext }: { children: React.ReactNode; pageContext: PageContext }) { return ( - {children} + + {children} + diff --git a/src/utils/storage.tsx b/src/utils/storage.tsx index ff774865..829cdc57 100644 --- a/src/utils/storage.tsx +++ b/src/utils/storage.tsx @@ -78,9 +78,16 @@ export async function countTotalNotes() { // get all notes export async function getNotes(time: number, limit: number, offset: number) { const db = await connect(); - return await db.select( - `SELECT * FROM notes WHERE created_at <= "${time}" ORDER BY created_at DESC LIMIT "${limit}" OFFSET "${offset}";` + + const notes: any = { data: null, nextCursor: 0 }; + const query: any = await db.select( + `SELECT * FROM notes WHERE created_at <= "${time}" GROUP BY parent_id ORDER BY created_at DESC LIMIT "${limit}" OFFSET "${offset}";` ); + + notes['data'] = query; + notes['nextCursor'] = offset + limit; + + return notes; } // get note by id @@ -93,7 +100,9 @@ export async function getNoteByID(event_id: string) { // get all latest notes export async function getLatestNotes(time: number) { const db = await connect(); - return await db.select(`SELECT * FROM notes WHERE created_at > "${time}" ORDER BY created_at DESC;`); + return await db.select( + `SELECT * FROM notes WHERE created_at > "${time}" GROUP BY parent_id ORDER BY created_at DESC;` + ); } // create note