new renderer for newsfeed

This commit is contained in:
Ren Amamiya 2023-04-26 14:53:04 +07:00
parent 9d635d472e
commit 7a2e08f601
9 changed files with 266 additions and 212 deletions

View File

@ -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",

View File

@ -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

View File

@ -83,7 +83,7 @@ export default function EventCollector() {
event.tags,
event.content,
event.created_at,
''
event.id
);
break;
default:

View File

@ -10,7 +10,6 @@ export const Placeholder = () => {
<span className="text-zinc-500">·</span>
<div className="h-4 w-12 rounded bg-zinc-700" />
</div>
<div className="h-3 w-3 rounded-full bg-zinc-700" />
</div>
</div>
</div>

View File

@ -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 = <RootNote event={content} />;

View File

@ -103,7 +103,7 @@ export function Page() {
event.tags,
event.content,
event.created_at,
''
event.id
);
break;
// hide message (channel only)

View File

@ -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 <NoteBase event={data[index]} />;
case 6:
return <NoteQuoteRepost event={data[index]} />;
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 (
<NewsfeedLayout>
<div className="relative h-full w-full rounded-lg border border-zinc-800 bg-zinc-900 shadow-input shadow-black/20">
{hasNewerNote && (
<div className="absolute left-1/2 top-2 z-50 -translate-x-1/2 transform">
<button
onClick={() => loadLatest()}
className="inline-flex h-8 transform items-center justify-center gap-1 rounded-full bg-fuchsia-500 pl-3 pr-3.5 text-sm shadow-md shadow-fuchsia-800/20 active:translate-y-1"
>
<button className="inline-flex h-8 transform items-center justify-center gap-1 rounded-full bg-fuchsia-500 pl-3 pr-3.5 text-sm shadow-md shadow-fuchsia-800/20 active:translate-y-1">
<ArrowUp width={14} height={14} />
Load latest
</button>
</div>
)}
<Virtuoso
ref={virtuosoRef}
data={data}
itemContent={itemContent}
computeItemKey={computeItemKey}
components={COMPONENTS}
overscan={200}
endReached={loadMore}
className="scrollbar-hide h-full w-full overflow-y-auto"
/>
{status === 'loading' ? (
<Placeholder />
) : status === 'error' ? (
<div>{error.message}</div>
) : (
<div ref={parentRef} className="h-full w-full overflow-y-auto" style={{ contain: 'strict' }}>
<FormBase />
<div
className="relative w-full"
style={{
height: `${rowVirtualizer.getTotalSize()}px`,
}}
>
<div
className="absolute left-0 top-0 w-full"
style={{
transform: `translateY(${itemsVirtualizer[0].start - rowVirtualizer.options.scrollMargin}px)`,
}}
>
{rowVirtualizer.getVirtualItems().map((virtualRow) => {
const note = allRows[virtualRow.index];
if (note) {
if (note.kind === 1) {
return (
<div key={virtualRow.index} data-index={virtualRow.index} ref={rowVirtualizer.measureElement}>
<NoteBase key={note.event_id} event={note} />
</div>
);
} else {
return (
<div key={virtualRow.index} data-index={virtualRow.index} ref={rowVirtualizer.measureElement}>
<NoteQuoteRepost key={note.event_id} event={note} />
</div>
);
}
}
})}
</div>
</div>
</div>
)}
<div>{isFetching && !isFetchingNextPage ? 'Background Updating...' : null}</div>
</div>
</NewsfeedLayout>
);
}
const COMPONENTS = {
Header: () => <FormBase />,
EmptyPlaceholder: () => <Placeholder />,
ScrollSeekPlaceholder: () => <Placeholder />,
};

View File

@ -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 (
<StrictMode>
<PageContextProvider pageContext={pageContext}>
<RelayProvider>
<AccountProvider>{children}</AccountProvider>
<AccountProvider>
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
</AccountProvider>
</RelayProvider>
</PageContextProvider>
</StrictMode>

View File

@ -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