update notification

This commit is contained in:
Ren Amamiya 2023-09-07 11:34:26 +07:00
parent 48066a4018
commit 8eb11efb34
7 changed files with 121 additions and 105 deletions

View File

@ -57,7 +57,7 @@
"react-player": "^2.13.0",
"react-router-dom": "^6.15.0",
"react-textarea-autosize": "^8.5.3",
"react-virtuoso": "^4.5.0",
"react-virtuoso": "^4.5.1",
"remark-gfm": "^3.0.1",
"tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql#v1",
"tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1",

View File

@ -119,8 +119,8 @@ dependencies:
specifier: ^8.5.3
version: 8.5.3(@types/react@18.2.21)(react@18.2.0)
react-virtuoso:
specifier: ^4.5.0
version: 4.5.0(react-dom@18.2.0)(react@18.2.0)
specifier: ^4.5.1
version: 4.5.1(react-dom@18.2.0)(react@18.2.0)
remark-gfm:
specifier: ^3.0.1
version: 3.0.1
@ -312,8 +312,8 @@ packages:
chalk: 2.4.2
js-tokens: 4.0.0
/@babel/parser@7.22.15:
resolution: {integrity: sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==}
/@babel/parser@7.22.16:
resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==}
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
@ -331,7 +331,7 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/code-frame': 7.22.13
'@babel/parser': 7.22.15
'@babel/parser': 7.22.16
'@babel/types': 7.22.15
dev: true
@ -345,7 +345,7 @@ packages:
'@babel/helper-function-name': 7.22.5
'@babel/helper-hoist-variables': 7.22.5
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.22.15
'@babel/parser': 7.22.16
'@babel/types': 7.17.0
debug: 4.3.4
globals: 11.12.0
@ -1717,8 +1717,8 @@ packages:
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
dev: false
/@swc/core-darwin-arm64@1.3.82:
resolution: {integrity: sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==}
/@swc/core-darwin-arm64@1.3.83:
resolution: {integrity: sha512-Plz2IKeveVLivbXTSCC3OZjD2MojyKYllhPrn9RotkDIZEFRYJZtW5/Ik1tJW/2rzu5HVKuGYrDKdScVVTbOxQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
@ -1726,8 +1726,8 @@ packages:
dev: true
optional: true
/@swc/core-darwin-x64@1.3.82:
resolution: {integrity: sha512-ogQWgNMq7qTpITjcP3dnzkFNj7bh6SwMr859GvtOTrE75H7L7jDWxESfH4f8foB/LGxBKiDNmxKhitCuAsZK4A==}
/@swc/core-darwin-x64@1.3.83:
resolution: {integrity: sha512-FBGVg5IPF/8jQ6FbK60iDUHjv0H5+LwfpJHKH6wZnRaYWFtm7+pzYgreLu3NTsm3m7/1a7t0+7KURwBGUaJCCw==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
@ -1735,8 +1735,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm-gnueabihf@1.3.82:
resolution: {integrity: sha512-7TMXG1lXlNhD0kUiEqs+YlGV4irAdBa2quuy+XI3oJf2fBK6dQfEq4xBy65B3khrorzQS3O0oDGQ+cmdpHExHA==}
/@swc/core-linux-arm-gnueabihf@1.3.83:
resolution: {integrity: sha512-EZcsuRYhGkzofXtzwDjuuBC/suiX9s7zeg2YYXOVjWwyebb6BUhB1yad3mcykFQ20rTLO9JUyIaiaMYDHGobqw==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
@ -1744,8 +1744,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm64-gnu@1.3.82:
resolution: {integrity: sha512-26JkOujbzcItPAmIbD5vHJxQVy5ihcSu3YHTKwope1h28sApZdtE7S3e2G3gsZRTIdsCQkXUtAQeqHxGWWR3pw==}
/@swc/core-linux-arm64-gnu@1.3.83:
resolution: {integrity: sha512-khI41szLHrCD/cFOcN4p2SYvZgHjhhHlcMHz5BksRrDyteSJKu0qtWRZITVom0N/9jWoAleoFhMnFTUs0H8IWA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
@ -1753,8 +1753,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm64-musl@1.3.82:
resolution: {integrity: sha512-8Izj9tuuMpoc3cqiPBRtwqpO1BZ/+sfZVsEhLxrbOFlcSb8LnKyMle1g3JMMUwI4EU75RGVIzZMn8A6GOKdJbA==}
/@swc/core-linux-arm64-musl@1.3.83:
resolution: {integrity: sha512-zgT7yNOdbjHcGAwvys79mbfNLK65KBlPJWzeig+Yk7I8TVzmaQge7B6ZS/gwF9/p+8TiLYo/tZ5aF2lqlgdSVw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
@ -1762,8 +1762,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-x64-gnu@1.3.82:
resolution: {integrity: sha512-0GSrIBScQwTaPv46T2qB7XnDYxndRCpwH4HMjh6FN+I+lfPUhTSJKW8AonqrqT1TbpFIgvzQs7EnTsD7AnSCow==}
/@swc/core-linux-x64-gnu@1.3.83:
resolution: {integrity: sha512-x+mH0Y3NC/G0YNlFmGi3vGD4VOm7IPDhh+tGrx6WtJp0BsShAbOpxtfU885rp1QweZe4qYoEmGqiEjE2WrPIdA==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
@ -1771,8 +1771,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-x64-musl@1.3.82:
resolution: {integrity: sha512-KJUnaaepDKNzrEbwz4jv0iC3/t9x0NSoe06fnkAlhh2+NFKWKKJhVCOBTrpds8n7eylBDIXUlK34XQafjVMUdg==}
/@swc/core-linux-x64-musl@1.3.83:
resolution: {integrity: sha512-s5AYhAOmetUwUZwS5g9qb92IYgNHHBGiY2mTLImtEgpAeBwe0LPDj6WrujxCBuZnaS55mKRLLOuiMZE5TpjBNA==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
@ -1780,8 +1780,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-arm64-msvc@1.3.82:
resolution: {integrity: sha512-TR3MHKhDYIyGyFcyl2d/p1ftceXcubAhX5wRSOdtOyr5+K/v3jbyCCqN7bbqO5o43wQVCwwR/drHleYyDZvg8Q==}
/@swc/core-win32-arm64-msvc@1.3.83:
resolution: {integrity: sha512-yw2rd/KVOGs95lRRB+killLWNaO1dy4uVa8Q3/4wb5txlLru07W1m041fZLzwOg/1Sh0TMjJgGxj0XHGR3ZXhQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
@ -1789,8 +1789,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-ia32-msvc@1.3.82:
resolution: {integrity: sha512-ZX4HzVVt6hs84YUg70UvyBJnBOIspmQQM0iXSzBvOikk3zRoN7BnDwQH4GScvevCEBuou60+i4I6d5kHLOfh8Q==}
/@swc/core-win32-ia32-msvc@1.3.83:
resolution: {integrity: sha512-POW+rgZ6KWqBpwPGIRd2/3pcf46P+UrKBm4HLt5IwbHvekJ4avIM8ixJa9kK0muJNVJcDpaZgxaU1ELxtJ1j8w==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
@ -1798,8 +1798,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-x64-msvc@1.3.82:
resolution: {integrity: sha512-4mJMnex21kbQoaHeAmHnVwQN9/XAfPszJ6n9HI7SVH+aAHnbBIR0M59/b50/CJMjTj5niUGk7EwQ3nhVNOG32g==}
/@swc/core-win32-x64-msvc@1.3.83:
resolution: {integrity: sha512-CiWQtkFnZElXQUalaHp+Wacw0Jd+24ncRYhqaJ9YKnEQP1H82CxIIuQqLM8IFaLpn5dpY6SgzaeubWF46hjcLA==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
@ -1807,8 +1807,8 @@ packages:
dev: true
optional: true
/@swc/core@1.3.82:
resolution: {integrity: sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==}
/@swc/core@1.3.83:
resolution: {integrity: sha512-PccHDgGQlFjpExgJxH91qA3a4aifR+axCFJ4RieCoiI0m5gURE4nBhxzTBY5YU/YKTBmPO8Gc5Q6inE3+NquWg==}
engines: {node: '>=10'}
requiresBuild: true
peerDependencies:
@ -1819,16 +1819,16 @@ packages:
dependencies:
'@swc/types': 0.1.4
optionalDependencies:
'@swc/core-darwin-arm64': 1.3.82
'@swc/core-darwin-x64': 1.3.82
'@swc/core-linux-arm-gnueabihf': 1.3.82
'@swc/core-linux-arm64-gnu': 1.3.82
'@swc/core-linux-arm64-musl': 1.3.82
'@swc/core-linux-x64-gnu': 1.3.82
'@swc/core-linux-x64-musl': 1.3.82
'@swc/core-win32-arm64-msvc': 1.3.82
'@swc/core-win32-ia32-msvc': 1.3.82
'@swc/core-win32-x64-msvc': 1.3.82
'@swc/core-darwin-arm64': 1.3.83
'@swc/core-darwin-x64': 1.3.83
'@swc/core-linux-arm-gnueabihf': 1.3.83
'@swc/core-linux-arm64-gnu': 1.3.83
'@swc/core-linux-arm64-musl': 1.3.83
'@swc/core-linux-x64-gnu': 1.3.83
'@swc/core-linux-x64-musl': 1.3.83
'@swc/core-win32-arm64-msvc': 1.3.83
'@swc/core-win32-ia32-msvc': 1.3.83
'@swc/core-win32-x64-msvc': 1.3.83
dev: true
/@swc/types@0.1.4:
@ -2293,7 +2293,7 @@ packages:
optional: true
dependencies:
'@babel/generator': 7.17.7
'@babel/parser': 7.22.15
'@babel/parser': 7.22.16
'@babel/traverse': 7.17.3
'@babel/types': 7.17.0
javascript-natural-sort: 0.7.1
@ -2670,7 +2670,7 @@ packages:
peerDependencies:
vite: ^4
dependencies:
'@swc/core': 1.3.82
'@swc/core': 1.3.83
vite: 4.4.9(@types/node@20.5.9)
transitivePeerDependencies:
- '@swc/helpers'
@ -2810,8 +2810,8 @@ packages:
get-intrinsic: 1.2.1
dev: false
/array.prototype.flat@1.3.1:
resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
/array.prototype.flat@1.3.2:
resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
@ -2819,8 +2819,8 @@ packages:
es-abstract: 1.22.1
es-shim-unscopables: 1.0.0
/array.prototype.flatmap@1.3.1:
resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
/array.prototype.flatmap@1.3.2:
resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
@ -2838,13 +2838,14 @@ packages:
get-intrinsic: 1.2.1
dev: true
/arraybuffer.prototype.slice@1.0.1:
resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==}
/arraybuffer.prototype.slice@1.0.2:
resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
engines: {node: '>= 0.4'}
dependencies:
array-buffer-byte-length: 1.0.0
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.22.1
get-intrinsic: 1.2.1
is-array-buffer: 3.0.2
is-shared-array-buffer: 1.0.2
@ -2884,8 +2885,8 @@ packages:
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
engines: {node: '>= 0.4'}
/axe-core@4.7.2:
resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==}
/axe-core@4.8.0:
resolution: {integrity: sha512-ZtlVZobOeDQhb/y2lMK6mznDw7TJHDNcKx5/bbBkFvArIQ5CVFhSI6hWWQnMx9I8cNmNmZ30wpDyOC2E2nvgbQ==}
engines: {node: '>=4'}
dev: true
@ -2925,7 +2926,7 @@ packages:
hasBin: true
dependencies:
caniuse-lite: 1.0.30001527
electron-to-chromium: 1.4.508
electron-to-chromium: 1.4.509
node-releases: 2.0.13
update-browserslist-db: 1.0.11(browserslist@4.21.10)
dev: true
@ -3284,8 +3285,8 @@ packages:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
dev: true
/electron-to-chromium@1.4.508:
resolution: {integrity: sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==}
/electron-to-chromium@1.4.509:
resolution: {integrity: sha512-G5KlSWY0zzhANtX15tkikHl4WB7zil2Y65oT52EZUL194abjUXBZym12Ht7Bhuwm/G3LJFEqMADyv2Cks56dmg==}
dev: true
/emoji-regex@8.0.0:
@ -3323,7 +3324,7 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
array-buffer-byte-length: 1.0.0
arraybuffer.prototype.slice: 1.0.1
arraybuffer.prototype.slice: 1.0.2
available-typed-arrays: 1.0.5
call-bind: 1.0.2
es-set-tostringtag: 2.0.1
@ -3350,7 +3351,7 @@ packages:
object-keys: 1.1.1
object.assign: 4.1.4
regexp.prototype.flags: 1.5.0
safe-array-concat: 1.0.0
safe-array-concat: 1.0.1
safe-regex-test: 1.0.0
string.prototype.trim: 1.2.7
string.prototype.trimend: 1.0.6
@ -3378,7 +3379,7 @@ packages:
has-symbols: 1.0.3
internal-slot: 1.0.5
iterator.prototype: 1.1.1
safe-array-concat: 1.0.0
safe-array-concat: 1.0.1
dev: true
/es-set-tostringtag@2.0.1:
@ -3568,8 +3569,8 @@ packages:
'@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2)
array-includes: 3.1.7
array.prototype.findlastindex: 1.2.3
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
array.prototype.flat: 1.3.2
array.prototype.flatmap: 1.3.2
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.48.0
@ -3599,9 +3600,9 @@ packages:
'@babel/runtime': 7.22.15
aria-query: 5.3.0
array-includes: 3.1.7
array.prototype.flatmap: 1.3.1
array.prototype.flatmap: 1.3.2
ast-types-flow: 0.0.7
axe-core: 4.7.2
axe-core: 4.8.0
axobject-query: 3.2.1
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
@ -3622,7 +3623,7 @@ packages:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
dependencies:
array-includes: 3.1.7
array.prototype.flatmap: 1.3.1
array.prototype.flatmap: 1.3.2
array.prototype.tosorted: 1.1.1
doctrine: 2.1.0
es-iterator-helpers: 1.0.14
@ -4455,7 +4456,7 @@ packages:
engines: {node: '>=4.0'}
dependencies:
array-includes: 3.1.7
array.prototype.flat: 1.3.1
array.prototype.flat: 1.3.2
object.assign: 4.1.4
object.values: 1.1.7
dev: true
@ -6019,8 +6020,8 @@ packages:
- '@types/react'
dev: false
/react-virtuoso@4.5.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-OMP6XrzJMMos1vbJZC16RxGW7utAxUMP7i5PNPi6epBNVH7nz+CF/DlmecNBep5wyjLud51dQ5epjb2A0w9W/Q==}
/react-virtuoso@4.5.1(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-Jdo9M/T5PcDAczvmXAKwvb/BW0MCMr/cb+3j2m9192zlQgQ+syMdJR42i+Sk80ln5aSNaL1fnxleJzdKsCc4lw==}
engines: {node: '>=10'}
peerDependencies:
react: '>=16 || >=17 || >= 18'
@ -6182,8 +6183,8 @@ packages:
dependencies:
glob: 7.2.3
/rollup@3.28.1:
resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==}
/rollup@3.29.0:
resolution: {integrity: sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
@ -6206,8 +6207,8 @@ packages:
mri: 1.2.0
dev: false
/safe-array-concat@1.0.0:
resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==}
/safe-array-concat@1.0.1:
resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
engines: {node: '>=0.4'}
dependencies:
call-bind: 1.0.2
@ -6996,7 +6997,7 @@ packages:
'@types/node': 20.5.9
esbuild: 0.18.20
postcss: 8.4.29
rollup: 3.28.1
rollup: 3.29.0
optionalDependencies:
fsevents: 2.3.3
dev: true

2
src-tauri/Cargo.lock generated
View File

@ -2627,7 +2627,7 @@ dependencies = [
[[package]]
name = "lume"
version = "1.2.2"
version = "1.2.3"
dependencies = [
"rust-argon2 1.0.0",
"serde",

View File

@ -1,28 +1,16 @@
import { NDKEvent } from '@nostr-dev-kit/ndk';
import { useQuery } from '@tanstack/react-query';
import { useCallback } from 'react';
import { NotiMention } from '@app/notifications/components/mention';
import { NotiReaction } from '@app/notifications/components/reaction';
import { NotiRepost } from '@app/notifications/components/repost';
import { useStorage } from '@libs/storage/provider';
import { LoaderIcon } from '@shared/icons';
import { TitleBar } from '@shared/titleBar';
import { useNostr } from '@utils/hooks/useNostr';
import { useActivities } from '@stores/activities';
export function NotificationScreen() {
const { db } = useStorage();
const { fetchActivities } = useNostr();
const { status, data } = useQuery(
['notifications', db.account.pubkey],
async () => {
return await fetchActivities();
},
{ refetchOnWindowFocus: false }
);
const activities = useActivities((state) => state.activities);
const renderItem = useCallback(
(event: NDKEvent) => {
@ -37,7 +25,7 @@ export function NotificationScreen() {
return null;
}
},
[data]
[activities]
);
return (
@ -47,14 +35,7 @@ export function NotificationScreen() {
<TitleBar title="Activities in the last 24 hours" />
<div className="flex h-full flex-col gap-1.5">
<div className="flex h-full flex-col">
{status === 'loading' ? (
<div className="flex h-full w-full items-center justify-center">
<div className="flex flex-col items-center gap-1.5">
<LoaderIcon className="h-5 w-5 animate-spin text-white" />
<p className="text-sm font-medium text-white/50">Loading</p>
</div>
</div>
) : data?.length < 1 ? (
{activities?.length < 1 ? (
<div className="flex h-full w-full flex-col items-center justify-center">
<p className="mb-1 text-4xl">🎉</p>
<p className="font-medium text-white/50">
@ -62,7 +43,7 @@ export function NotificationScreen() {
</p>
</div>
) : (
data.map((event) => renderItem(event))
activities.map((event) => renderItem(event))
)}
</div>
</div>

View File

@ -7,15 +7,17 @@ import { useStorage } from '@libs/storage/provider';
import { LoaderIcon } from '@shared/icons';
import { useActivities } from '@stores/activities';
import { useNostr } from '@utils/hooks/useNostr';
export function SplashScreen() {
const { db } = useStorage();
const { ndk } = useNDK();
const { fetchUserData, prefetchEvents } = useNostr();
const { fetchUserData, fetchActivities, prefetchEvents } = useNostr();
const [isLoading, setIsLoading] = useState<boolean>(true);
const [errorMessage, setErrorMessage] = useState<null | string>(null);
const setActivities = useActivities((state) => state.setActivities);
const skip = async () => {
await invoke('close_splashscreen');
@ -29,20 +31,20 @@ export function SplashScreen() {
try {
const user = await fetchUserData();
const data = await prefetchEvents();
const activities = await fetchActivities();
if (user.status === 'ok' && data.status === 'ok') {
// set activities
setActivities(activities);
// update last login = current time
await db.updateLastLogin();
// close splash screen and open main app screen
await invoke('close_splashscreen');
} else {
setIsLoading(false);
setErrorMessage(user.message);
console.log('fetch failed, error: ', user.message);
}
} catch (e) {
setIsLoading(false);
setErrorMessage(e);
await message(`Something wrong: ${e}`, {
title: 'Lume',
await message(e, {
title: 'An unexpected error has occurred',
type: 'error',
});
}
@ -75,15 +77,14 @@ export function SplashScreen() {
) : (
<div className="mt-2 flex flex-col gap-1 text-center">
<h3 className="text-lg font-semibold leading-none text-white">
Something wrong!
An unexpected error has occurred
</h3>
<p className="text-sm text-white/50">{errorMessage}</p>
<button
type="button"
onClick={skip}
className="mx-auto mt-4 inline-flex h-10 w-max items-center justify-center rounded-md bg-white/10 px-8 text-sm font-medium leading-none text-white backdrop-blur-xl hover:bg-white/20"
>
Skip
Skip this step
</button>
</div>
)}

View File

@ -6,6 +6,8 @@ import { useStorage } from '@libs/storage/provider';
import { AccountMoreActions } from '@shared/accounts/more';
import { Image } from '@shared/image';
import { useActivities } from '@stores/activities';
import { useNostr } from '@utils/hooks/useNostr';
import { useProfile } from '@utils/hooks/useProfile';
import { sendNativeNotification } from '@utils/notification';
@ -16,6 +18,8 @@ export function ActiveAccount() {
const { status, user } = useProfile(db.account.pubkey);
const { sub } = useNostr();
const addActivity = useActivities((state) => state.addActivity);
useEffect(() => {
const filter: NDKFilter = {
'#p': [db.account.pubkey],
@ -30,6 +34,8 @@ export function ActiveAccount() {
};
sub(filter, async (event) => {
addActivity(event);
switch (event.kind) {
case NDKKind.Text:
return await sendNativeNotification('Mention');

27
src/stores/activities.ts Normal file
View File

@ -0,0 +1,27 @@
import { NDKEvent } from '@nostr-dev-kit/ndk';
import { create } from 'zustand';
import { createJSONStorage, persist } from 'zustand/middleware';
interface ActivitiesState {
activities: null | Array<NDKEvent>;
setActivities: (events: NDKEvent[]) => void;
addActivity: (event: NDKEvent) => void;
}
export const useActivities = create<ActivitiesState>()(
persist(
(set) => ({
activities: null,
setActivities: (events: NDKEvent[]) => {
set(() => ({ activities: events }));
},
addActivity: (event: NDKEvent) => {
set((state) => ({ activities: [event, ...state.activities] }));
},
}),
{
name: 'activities',
storage: createJSONStorage(() => localStorage),
}
)
);