feat(ark): refactor

This commit is contained in:
2023-12-16 07:47:00 +07:00
parent ba93bdbb91
commit 17c64ee357
18 changed files with 449 additions and 483 deletions

View File

@@ -21,7 +21,7 @@
"@evilmartians/harmony": "^1.2.0", "@evilmartians/harmony": "^1.2.0",
"@getalby/sdk": "^2.7.0", "@getalby/sdk": "^2.7.0",
"@nostr-dev-kit/ndk": "^2.3.0", "@nostr-dev-kit/ndk": "^2.3.0",
"@nostr-fetch/adapter-ndk": "^0.13.1", "@nostr-fetch/adapter-ndk": "^0.14.1",
"@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-alert-dialog": "^1.0.5",
"@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-avatar": "^1.0.4",
@@ -33,8 +33,8 @@
"@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-switch": "^1.0.3",
"@radix-ui/react-toolbar": "^1.0.4", "@radix-ui/react-toolbar": "^1.0.4",
"@radix-ui/react-tooltip": "^1.0.7", "@radix-ui/react-tooltip": "^1.0.7",
"@tanstack/react-query": "^5.13.4", "@tanstack/react-query": "^5.14.0",
"@tanstack/react-query-devtools": "^5.13.5", "@tanstack/react-query-devtools": "^5.14.0",
"@tauri-apps/api": "2.0.0-alpha.11", "@tauri-apps/api": "2.0.0-alpha.11",
"@tauri-apps/cli": "2.0.0-alpha.17", "@tauri-apps/cli": "2.0.0-alpha.17",
"@tauri-apps/plugin-autostart": "2.0.0-alpha.3", "@tauri-apps/plugin-autostart": "2.0.0-alpha.3",
@@ -60,7 +60,7 @@
"@tiptap/react": "^2.1.13", "@tiptap/react": "^2.1.13",
"@tiptap/starter-kit": "^2.1.13", "@tiptap/starter-kit": "^2.1.13",
"@tiptap/suggestion": "^2.1.13", "@tiptap/suggestion": "^2.1.13",
"@vidstack/react": "^1.9.7", "@vidstack/react": "^1.9.8",
"dayjs": "^1.11.10", "dayjs": "^1.11.10",
"framer-motion": "^10.16.16", "framer-motion": "^10.16.16",
"html-to-text": "^9.0.5", "html-to-text": "^9.0.5",
@@ -69,7 +69,7 @@
"markdown-to-jsx": "^7.3.2", "markdown-to-jsx": "^7.3.2",
"minidenticons": "^4.2.0", "minidenticons": "^4.2.0",
"nanoid": "^5.0.4", "nanoid": "^5.0.4",
"nostr-fetch": "^0.13.1", "nostr-fetch": "^0.14.1",
"nostr-tools": "^1.17.0", "nostr-tools": "^1.17.0",
"qrcode.react": "^3.1.0", "qrcode.react": "^3.1.0",
"re-resizable": "^6.9.11", "re-resizable": "^6.9.11",
@@ -93,7 +93,7 @@
"@types/html-to-text": "^9.0.4", "@types/html-to-text": "^9.0.4",
"@types/node": "^20.10.4", "@types/node": "^20.10.4",
"@types/react": "^18.2.45", "@types/react": "^18.2.45",
"@types/react-dom": "^18.2.17", "@types/react-dom": "^18.2.18",
"@typescript-eslint/eslint-plugin": "^6.14.0", "@typescript-eslint/eslint-plugin": "^6.14.0",
"@typescript-eslint/parser": "^6.14.0", "@typescript-eslint/parser": "^6.14.0",
"@vitejs/plugin-react-swc": "^3.5.0", "@vitejs/plugin-react-swc": "^3.5.0",
@@ -101,7 +101,7 @@
"clsx": "^2.0.0", "clsx": "^2.0.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"encoding": "^0.1.13", "encoding": "^0.1.13",
"eslint": "^8.55.0", "eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-react": "^7.33.2", "eslint-plugin-react": "^7.33.2",
@@ -116,7 +116,7 @@
"tailwind-scrollbar": "^3.0.5", "tailwind-scrollbar": "^3.0.5",
"tailwindcss": "^3.3.6", "tailwindcss": "^3.3.6",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"vite": "^5.0.8", "vite": "^5.0.10",
"vite-plugin-top-level-await": "^1.4.1", "vite-plugin-top-level-await": "^1.4.1",
"vite-tsconfig-paths": "^4.2.2" "vite-tsconfig-paths": "^4.2.2"
} }

434
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

199
src-tauri/Cargo.lock generated
View File

@@ -242,9 +242,9 @@ dependencies = [
[[package]] [[package]]
name = "async-io" name = "async-io"
version = "2.2.1" version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff" checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7"
dependencies = [ dependencies = [
"async-lock 3.2.0", "async-lock 3.2.0",
"cfg-if", "cfg-if",
@@ -304,7 +304,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -313,7 +313,7 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5"
dependencies = [ dependencies = [
"async-io 2.2.1", "async-io 2.2.2",
"async-lock 2.8.0", "async-lock 2.8.0",
"atomic-waker", "atomic-waker",
"cfg-if", "cfg-if",
@@ -339,7 +339,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -760,7 +760,7 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -872,9 +872,9 @@ dependencies = [
[[package]] [[package]]
name = "const-oid" name = "const-oid"
version = "0.9.5" version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
[[package]] [[package]]
name = "constant_time_eq" name = "constant_time_eq"
@@ -976,9 +976,9 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-channel" name = "crossbeam-channel"
version = "0.5.8" version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" checksum = "14c3242926edf34aec4ac3a77108ad4854bffaa2e4ddc1824124ce59231302d5"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"crossbeam-utils", "crossbeam-utils",
@@ -986,9 +986,9 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-queue" name = "crossbeam-queue"
version = "0.3.8" version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" checksum = "b9bcf5bdbfdd6030fb4a1c497b5d5fc5921aa2f60d359a17e249c0e6df3de153"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"crossbeam-utils", "crossbeam-utils",
@@ -996,9 +996,9 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.16" version = "0.8.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
] ]
@@ -1037,17 +1037,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [ dependencies = [
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
name = "ctor" name = "ctor"
version = "0.2.5" version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37e366bff8cd32dd8754b0991fb66b279dc48f598c3a18914852a6673deef583" checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e"
dependencies = [ dependencies = [
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -1101,7 +1101,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -1112,7 +1112,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -1319,7 +1319,7 @@ checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -1514,7 +1514,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -1643,7 +1643,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -1957,7 +1957,7 @@ dependencies = [
"proc-macro-error", "proc-macro-error",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -2057,7 +2057,7 @@ dependencies = [
"proc-macro-error", "proc-macro-error",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -2127,9 +2127,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]] [[package]]
name = "hkdf" name = "hkdf"
version = "0.12.3" version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
dependencies = [ dependencies = [
"hmac", "hmac",
] ]
@@ -2145,11 +2145,11 @@ dependencies = [
[[package]] [[package]]
name = "home" name = "home"
version = "0.5.5" version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
dependencies = [ dependencies = [
"windows-sys 0.48.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@@ -2567,9 +2567,9 @@ dependencies = [
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.150" version = "0.2.151"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
[[package]] [[package]]
name = "libloading" name = "libloading"
@@ -3237,7 +3237,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -3248,9 +3248,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]] [[package]]
name = "openssl-src" name = "openssl-src"
version = "300.2.0+3.2.0" version = "300.2.1+3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1ebed1d188c4cd64c2bcd73d6c1fe1092f3d98c111831923cc1b706c3859fca" checksum = "3fe476c29791a5ca0d1273c697e96085bbabbbea2ef7afd5617e78a4b40332d3"
dependencies = [ dependencies = [
"cc", "cc",
] ]
@@ -3513,7 +3513,7 @@ dependencies = [
"phf_shared 0.11.2", "phf_shared 0.11.2",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -4220,7 +4220,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -4242,7 +4242,7 @@ checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -4292,7 +4292,7 @@ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -4822,9 +4822,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.39" version = "2.0.41"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -5056,15 +5056,15 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
"tauri-codegen", "tauri-codegen",
"tauri-utils", "tauri-utils",
] ]
[[package]] [[package]]
name = "tauri-plugin-autostart" name = "tauri-plugin-autostart"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"auto-launch", "auto-launch",
"log", "log",
@@ -5076,8 +5076,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-cli" name = "tauri-plugin-cli"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"clap", "clap",
"log", "log",
@@ -5089,8 +5089,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-clipboard-manager" name = "tauri-plugin-clipboard-manager"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"arboard", "arboard",
"log", "log",
@@ -5103,8 +5103,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-dialog" name = "tauri-plugin-dialog"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"glib 0.16.9", "glib 0.16.9",
"log", "log",
@@ -5120,8 +5120,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-fs" name = "tauri-plugin-fs"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"glob", "glob",
@@ -5133,8 +5133,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-http" name = "tauri-plugin-http"
version = "2.0.0-alpha.5" version = "2.0.0-alpha.6"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"data-url", "data-url",
"glob", "glob",
@@ -5150,8 +5150,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-notification" name = "tauri-plugin-notification"
version = "2.0.0-alpha.5" version = "2.0.0-alpha.6"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"log", "log",
"notify-rust", "notify-rust",
@@ -5168,8 +5168,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-os" name = "tauri-plugin-os"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"gethostname 0.4.3", "gethostname 0.4.3",
"log", "log",
@@ -5184,16 +5184,16 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-process" name = "tauri-plugin-process"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"tauri", "tauri",
] ]
[[package]] [[package]]
name = "tauri-plugin-shell" name = "tauri-plugin-shell"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"encoding_rs", "encoding_rs",
"log", "log",
@@ -5209,8 +5209,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-sql" name = "tauri-plugin-sql"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"log", "log",
@@ -5225,8 +5225,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-store" name = "tauri-plugin-store"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@@ -5238,7 +5238,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-theme" name = "tauri-plugin-theme"
version = "0.3.0" version = "0.3.0"
source = "git+https://github.com/wyhaya/tauri-plugin-theme#cccc9b3fbc308a475ef8720f3535ae657ce1924b" source = "git+https://github.com/wyhaya/tauri-plugin-theme#cc032254c07887068f0aafd578127d276ff7f1c6"
dependencies = [ dependencies = [
"cocoa 0.25.0", "cocoa 0.25.0",
"dirs-next", "dirs-next",
@@ -5253,8 +5253,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-updater" name = "tauri-plugin-updater"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"base64", "base64",
"dirs-next", "dirs-next",
@@ -5279,8 +5279,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-upload" name = "tauri-plugin-upload"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"log", "log",
@@ -5296,8 +5296,8 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-window-state" name = "tauri-plugin-window-state"
version = "2.0.0-alpha.4" version = "2.0.0-alpha.5"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#a848e1870a71b7460a0c56ba44cc1af61d818483" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#68cb23f9c0722343a79096044122a811fd8cc059"
dependencies = [ dependencies = [
"bincode", "bincode",
"bitflags 2.4.1", "bitflags 2.4.1",
@@ -5428,22 +5428,22 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.50" version = "1.0.51"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "1.0.50" version = "1.0.51"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -5546,7 +5546,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -5669,7 +5669,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -5713,9 +5713,9 @@ dependencies = [
[[package]] [[package]]
name = "tray-icon" name = "tray-icon"
version = "0.11.0" version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5375d350db4ccd3c783a4c683be535e70df5c62b07a824e7bcd6d43ef6d74181" checksum = "fad962d06d2bfd9b2ab4f665fc73b175523b834b1466a294520201c5845145f8"
dependencies = [ dependencies = [
"cocoa 0.25.0", "cocoa 0.25.0",
"core-graphics 0.23.1", "core-graphics 0.23.1",
@@ -5754,10 +5754,11 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]] [[package]]
name = "uds_windows" name = "uds_windows"
version = "1.0.2" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9"
dependencies = [ dependencies = [
"memoffset 0.9.0",
"tempfile", "tempfile",
"winapi", "winapi",
] ]
@@ -5942,7 +5943,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@@ -5976,7 +5977,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@@ -6089,7 +6090,7 @@ checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -6206,7 +6207,7 @@ checksum = "fb2b158efec5af20d8846836622f50a87e6556b9153a42772fa047f773c0e555"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -6217,7 +6218,7 @@ checksum = "0546e63e1ce64c04403d2311fa0e3ab5ae3a367bd524b4a38d8d8d18c70cfa76"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]
@@ -6429,9 +6430,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.5.26" version = "0.5.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@@ -6546,11 +6547,13 @@ dependencies = [
[[package]] [[package]]
name = "xattr" name = "xattr"
version = "1.1.1" version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbc6ab6ec1907d1a901cdbcd2bd4cb9e7d64ce5c9739cbb97d3c391acd8c7fae" checksum = "a7dae5072fe1f8db8f8d29059189ac175196e410e40ba42d5d4684ae2f750995"
dependencies = [ dependencies = [
"libc", "libc",
"linux-raw-sys 0.4.12",
"rustix 0.38.28",
] ]
[[package]] [[package]]
@@ -6642,22 +6645,22 @@ dependencies = [
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.7.30" version = "0.7.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "306dca4455518f1f31635ec308b6b3e4eb1b11758cefafc782827d0aa7acb5c7" checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d"
dependencies = [ dependencies = [
"zerocopy-derive", "zerocopy-derive",
] ]
[[package]] [[package]]
name = "zerocopy-derive" name = "zerocopy-derive"
version = "0.7.30" version = "0.7.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be912bf68235a88fbefd1b73415cb218405958d1655b2ece9035a19920bdf6ba" checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.39", "syn 2.0.41",
] ]
[[package]] [[package]]

View File

@@ -22,8 +22,6 @@ export function CreateAccountScreen() {
const [keys, setKeys] = useState<null | { const [keys, setKeys] = useState<null | {
npub: string; npub: string;
nsec: string; nsec: string;
pubkey: string;
privkey: string;
}>(null); }>(null);
const ark = useArk(); const ark = useArk();
@@ -64,7 +62,6 @@ export function CreateAccountScreen() {
content: JSON.stringify(profile), content: JSON.stringify(profile),
kind: NDKKind.Metadata, kind: NDKKind.Metadata,
tags: [], tags: [],
publish: true,
}); });
if (publish) { if (publish) {
@@ -77,18 +74,12 @@ export function CreateAccountScreen() {
await ark.createEvent({ await ark.createEvent({
kind: NDKKind.RelayList, kind: NDKKind.RelayList,
tags: [ark.relays], tags: [ark.relays],
publish: true,
}); });
setKeys({ setKeys({ npub: userNpub, nsec: userNsec });
npub: userNpub,
nsec: userNsec,
pubkey: userPubkey,
privkey: userPrivkey,
});
setLoading(false); setLoading(false);
} else { } else {
toast('Cannot publish user profile, please try again later.'); toast.error('Cannot publish user profile, please try again later.');
setLoading(false); setLoading(false);
} }
} catch (e) { } catch (e) {
@@ -222,7 +213,7 @@ export function CreateAccountScreen() {
}} }}
className="rounded-xl bg-neutral-50 p-3 dark:bg-neutral-950" className="rounded-xl bg-neutral-50 p-3 dark:bg-neutral-950"
> >
<User pubkey={keys.pubkey} variant="simple" /> <User pubkey={keys.npub} variant="simple" />
</motion.div> </motion.div>
<motion.div <motion.div
initial={{ opacity: 0, y: 80 }} initial={{ opacity: 0, y: 80 }}

View File

@@ -70,7 +70,6 @@ export function FollowScreen() {
if (item.startsWith('npub1')) return ['p', nip19.decode(item).data as string]; if (item.startsWith('npub1')) return ['p', nip19.decode(item).data as string];
return ['p', item]; return ['p', item];
}), }),
publish: true,
}); });
if (publish) { if (publish) {

View File

@@ -1,21 +1,17 @@
import { NDKEvent } from '@nostr-dev-kit/ndk';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { useArk } from '@libs/ark';
import { EditIcon, ReactionIcon, ReplyIcon, RepostIcon, ZapIcon } from '@shared/icons'; import { EditIcon, ReactionIcon, ReplyIcon, RepostIcon, ZapIcon } from '@shared/icons';
import { TextNote } from '@shared/notes'; import { TextNote } from '@shared/notes';
export function TutorialNoteScreen() { export function TutorialNoteScreen() {
const ark = useArk(); const exampleEvent = new NDKEvent(undefined, {
id: 'a3527670dd9b178bf7c2a9ea673b63bc8bfe774942b196691145343623c45821',
const exampleEvent = ark.createNDKEvent({ pubkey: '04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9',
event: { created_at: 1701355223,
id: 'a3527670dd9b178bf7c2a9ea673b63bc8bfe774942b196691145343623c45821', kind: 1,
pubkey: '04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9', tags: [],
created_at: 1701355223, content: 'good morning nostr, stay humble and stack sats 🫡',
kind: 1, sig: '9e0bd67ec25598744f20bff0fe360fdf190c4240edb9eea260e50f77e07f94ea767ececcc6270819b7f64e5e7ca1fe20b4971f46dc120e6db43114557f3a6dae',
tags: [],
content: 'good morning nostr, stay humble and stack sats 🫡',
sig: '9e0bd67ec25598744f20bff0fe360fdf190c4240edb9eea260e50f77e07f94ea767ececcc6270819b7f64e5e7ca1fe20b4971f46dc120e6db43114557f3a6dae',
},
}); });
return ( return (

View File

@@ -93,11 +93,10 @@ export function NewArticleScreen() {
content, content,
tags, tags,
kind: NDKKind.Article, kind: NDKKind.Article,
publish: true,
}); });
if (publish) { if (publish) {
toast.success(`Broadcasted to ${publish} relays successfully.`); toast.success(`Broadcasted to ${publish.seens.length} relays successfully.`);
// update state // update state
setLoading(false); setLoading(false);

View File

@@ -91,11 +91,10 @@ export function NewFileScreen() {
kind: 1063, kind: 1063,
tags: metadata, tags: metadata,
content: caption, content: caption,
publish: true,
}); });
if (publish) { if (publish) {
toast.success(`Broadcasted to ${publish} relays successfully.`); toast.success(`Broadcasted to ${publish.seens.length} relays successfully.`);
setMetadata(null); setMetadata(null);
setIsPublish(false); setIsPublish(false);
} }

View File

@@ -1,4 +1,4 @@
import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { NDKKind } from '@nostr-dev-kit/ndk';
import CharacterCount from '@tiptap/extension-character-count'; import CharacterCount from '@tiptap/extension-character-count';
import Image from '@tiptap/extension-image'; import Image from '@tiptap/extension-image';
import Mention from '@tiptap/extension-mention'; import Mention from '@tiptap/extension-mention';
@@ -82,18 +82,16 @@ export function NewPostScreen() {
const rootReplyTo = searchParams.get('rootReplyTo'); const rootReplyTo = searchParams.get('rootReplyTo');
// publish event // publish event
const event = (await ark.createEvent({ const publish = await ark.createEvent({
kind: NDKKind.Text, kind: NDKKind.Text,
tags: [], tags: [],
content: serializedContent, content: serializedContent,
replyTo, replyTo,
rootReplyTo, rootReplyTo,
})) as NDKEvent; });
const publish = await event.publish();
if (publish) { if (publish) {
toast.success(`Broadcasted to ${publish.size} relays successfully.`); toast.success(`Broadcasted to ${publish.seens.length} relays successfully.`);
// update state // update state
setLoading(false); setLoading(false);
@@ -103,7 +101,7 @@ export function NewPostScreen() {
if (!replyTo) { if (!replyTo) {
addWidget.mutate({ addWidget.mutate({
title: 'Thread', title: 'Thread',
content: event.id, content: publish.id,
kind: WIDGET_KIND.thread, kind: WIDGET_KIND.thread,
}); });
} }

View File

@@ -101,7 +101,6 @@ export function EditProfileScreen() {
kind: NDKKind.Metadata, kind: NDKKind.Metadata,
tags: [], tags: [],
content: JSON.stringify(content), content: JSON.stringify(content),
publish: true,
}); });
if (publish) { if (publish) {

View File

@@ -22,8 +22,8 @@ import {
normalizeRelayUrl, normalizeRelayUrl,
normalizeRelayUrlSet, normalizeRelayUrlSet,
} from 'nostr-fetch'; } from 'nostr-fetch';
import { toast } from 'sonner'; import { nip19 } from 'nostr-tools';
import { NDKCacheAdapterTauri } from '@libs/ark'; import { NDKCacheAdapterTauri } from '@libs/cache';
import { import {
Account, Account,
NDKCacheUser, NDKCacheUser,
@@ -34,9 +34,9 @@ import {
} from '@utils/types'; } from '@utils/types';
export class Ark { export class Ark {
#ndk: NDK;
#fetcher: NostrFetcher;
#storage: Database; #storage: Database;
public ndk: NDK;
public fetcher: NostrFetcher;
public account: Account | null; public account: Account | null;
public relays: string[] | null; public relays: string[] | null;
public readyToSign: boolean; public readyToSign: boolean;
@@ -123,20 +123,13 @@ export class Ark {
return new NDKPrivateKeySigner(userPrivkey); return new NDKPrivateKeySigner(userPrivkey);
} catch (e) { } catch (e) {
console.log(e); console.log(e);
if (e === 'Token already redeemed') {
toast.info(
'nsecbunker token already redeemed. You need to re-login with another token.'
);
await this.logout();
}
this.readyToSign = false;
return null; return null;
} }
} }
public async init() { public async init() {
const settings = await this.getAllSettings(); const settings = await this.getAllSettings();
for (const item of settings) { for (const item of settings) {
if (item.key === 'nsecbunker') this.settings.bunker = !!parseInt(item.value); if (item.key === 'nsecbunker') this.settings.bunker = !!parseInt(item.value);
if (item.key === 'outbox') this.settings.outbox = !!parseInt(item.value); if (item.key === 'outbox') this.settings.outbox = !!parseInt(item.value);
@@ -147,8 +140,7 @@ export class Ark {
const explicitRelayUrls = normalizeRelayUrlSet([ const explicitRelayUrls = normalizeRelayUrlSet([
'wss://relay.damus.io', 'wss://relay.damus.io',
'wss://relay.nostr.band', 'wss://relay.nostr.band/all',
'wss://nos.lol',
'wss://nostr.mutinywallet.com', 'wss://nostr.mutinywallet.com',
]); ]);
@@ -184,19 +176,19 @@ export class Ark {
const user = ndk.getUser({ pubkey: this.account.pubkey }); const user = ndk.getUser({ pubkey: this.account.pubkey });
ndk.activeUser = user; ndk.activeUser = user;
const contacts = await user.follows(undefined /* outbox */); const contacts = await user.follows();
this.account.contacts = [...contacts].map((user) => user.pubkey); this.account.contacts = [...contacts].map((user) => user.pubkey);
} }
this.relays = [...ndk.pool.relays.values()].map((relay) => relay.url); this.relays = [...ndk.pool.relays.values()].map((relay) => relay.url);
this.#ndk = ndk; this.ndk = ndk;
this.#fetcher = fetcher; this.fetcher = fetcher;
} }
public updateNostrSigner({ signer }: { signer: NDKNip46Signer | NDKPrivateKeySigner }) { public updateNostrSigner({ signer }: { signer: NDKNip46Signer | NDKPrivateKeySigner }) {
this.#ndk.signer = signer; this.ndk.signer = signer;
this.readyToSign = true; this.readyToSign = true;
return this.#ndk.signer; return this.ndk.signer;
} }
public async getAllCacheUsers() { public async getAllCacheUsers() {
@@ -390,14 +382,14 @@ export class Ark {
} }
public async logout() { public async logout() {
await this.#keyring_remove(this.account.pubkey);
await this.#keyring_remove(`${this.account.pubkey}-nsecbunker`);
await this.#storage.execute("UPDATE accounts SET is_active = '0' WHERE id = $1;", [ await this.#storage.execute("UPDATE accounts SET is_active = '0' WHERE id = $1;", [
this.account.id, this.account.id,
]); ]);
await this.#keyring_remove(this.account.pubkey);
await this.#keyring_remove(`${this.account.pubkey}-nsecbunker`);
this.account = null; this.account = null;
this.#ndk.signer = null; this.ndk.signer = null;
} }
public subscribe({ public subscribe({
@@ -409,53 +401,44 @@ export class Ark {
closeOnEose: boolean; closeOnEose: boolean;
cb: (event: NDKEvent) => void; cb: (event: NDKEvent) => void;
}) { }) {
const sub = this.#ndk.subscribe(filter, { closeOnEose }); const sub = this.ndk.subscribe(filter, { closeOnEose });
sub.addListener('event', (event: NDKEvent) => cb(event)); sub.addListener('event', (event: NDKEvent) => cb(event));
return sub; return sub;
} }
public createNDKEvent({ event }: { event: NostrEvent | NostrEventExt }) {
return new NDKEvent(this.#ndk, event);
}
public async createEvent({ public async createEvent({
kind, kind,
tags, tags,
content, content,
rootReplyTo = undefined, rootReplyTo = undefined,
replyTo = undefined, replyTo = undefined,
publish,
}: { }: {
kind: NDKKind | number; kind: NDKKind | number;
tags: NDKTag[]; tags: NDKTag[];
content?: string; content?: string;
rootReplyTo?: string; rootReplyTo?: string;
replyTo?: string; replyTo?: string;
publish?: boolean;
}) { }) {
try { try {
const event = new NDKEvent(this.#ndk); const event = new NDKEvent(this.ndk);
if (content) event.content = content; if (content) event.content = content;
event.kind = kind; event.kind = kind;
event.tags = tags; event.tags = tags;
if (rootReplyTo) { if (rootReplyTo) {
const rootEvent = await this.#ndk.fetchEvent(rootReplyTo); const rootEvent = await this.ndk.fetchEvent(rootReplyTo);
if (rootEvent) event.tag(rootEvent, 'root'); if (rootEvent) event.tag(rootEvent, 'root');
} }
if (replyTo) { if (replyTo) {
const replyEvent = await this.#ndk.fetchEvent(replyTo); const replyEvent = await this.ndk.fetchEvent(replyTo);
if (replyEvent) event.tag(replyEvent, 'reply'); if (replyEvent) event.tag(replyEvent, 'reply');
} }
if (publish) { const publish = await event.publish();
const publishedEvent = await event.publish();
if (!publishedEvent) throw new Error('Failed to publish event');
return publishedEvent.size;
}
return event; if (!publish) throw new Error('Failed to publish event');
return { id: event.id, seens: [...publish.values()].map((item) => item.url) };
} catch (e) { } catch (e) {
throw new Error(e); throw new Error(e);
} }
@@ -463,7 +446,23 @@ export class Ark {
public async getUserProfile({ pubkey }: { pubkey: string }) { public async getUserProfile({ pubkey }: { pubkey: string }) {
try { try {
const user = this.#ndk.getUser({ pubkey }); // get clean pubkey without any special characters
let hexstring = pubkey.replace(/[^a-zA-Z0-9]/g, '');
if (
hexstring.startsWith('npub1') ||
hexstring.startsWith('nprofile1') ||
hexstring.startsWith('naddr1')
) {
const decoded = nip19.decode(hexstring);
if (decoded.type === 'nprofile') hexstring = decoded.data.pubkey;
if (decoded.type === 'npub') hexstring = decoded.data;
if (decoded.type === 'naddr') hexstring = decoded.data.pubkey;
}
const user = this.ndk.getUser({ pubkey: hexstring });
const profile = await user.fetchProfile({ const profile = await user.fetchProfile({
cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST, cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST,
}); });
@@ -471,8 +470,7 @@ export class Ark {
if (!profile) return null; if (!profile) return null;
return profile; return profile;
} catch (e) { } catch (e) {
console.error(e); throw new Error(e);
return null;
} }
} }
@@ -484,7 +482,7 @@ export class Ark {
outbox?: boolean; outbox?: boolean;
}) { }) {
try { try {
const user = this.#ndk.getUser({ pubkey: pubkey ? pubkey : this.account.pubkey }); const user = this.ndk.getUser({ pubkey: pubkey ? pubkey : this.account.pubkey });
const contacts = [...(await user.follows(undefined, outbox))].map( const contacts = [...(await user.follows(undefined, outbox))].map(
(user) => user.pubkey (user) => user.pubkey
); );
@@ -492,33 +490,33 @@ export class Ark {
if (pubkey === this.account.pubkey) this.account.contacts = contacts; if (pubkey === this.account.pubkey) this.account.contacts = contacts;
return contacts; return contacts;
} catch (e) { } catch (e) {
console.error(e); throw new Error(e);
return []; return [];
} }
} }
public async getUserRelays({ pubkey }: { pubkey?: string }) { public async getUserRelays({ pubkey }: { pubkey?: string }) {
try { try {
const user = this.#ndk.getUser({ pubkey: pubkey ? pubkey : this.account.pubkey }); const user = this.ndk.getUser({ pubkey: pubkey ? pubkey : this.account.pubkey });
return await user.relayList(); return await user.relayList();
} catch (e) { } catch (e) {
console.error(e); throw new Error(e);
return null; return null;
} }
} }
public async createContact({ pubkey }: { pubkey: string }) { public async createContact({ pubkey }: { pubkey: string }) {
const user = this.#ndk.getUser({ pubkey: this.account.pubkey }); const user = this.ndk.getUser({ pubkey: this.account.pubkey });
const contacts = await user.follows(); const contacts = await user.follows();
return await user.follow(new NDKUser({ pubkey: pubkey }), contacts); return await user.follow(new NDKUser({ pubkey: pubkey }), contacts);
} }
public async deleteContact({ pubkey }: { pubkey: string }) { public async deleteContact({ pubkey }: { pubkey: string }) {
const user = this.#ndk.getUser({ pubkey: this.account.pubkey }); const user = this.ndk.getUser({ pubkey: this.account.pubkey });
const contacts = await user.follows(); const contacts = await user.follows();
contacts.delete(new NDKUser({ pubkey: pubkey })); contacts.delete(new NDKUser({ pubkey: pubkey }));
const event = new NDKEvent(this.#ndk); const event = new NDKEvent(this.ndk);
event.content = ''; event.content = '';
event.kind = NDKKind.Contacts; event.kind = NDKKind.Contacts;
event.tags = [...contacts].map((item) => [ event.tags = [...contacts].map((item) => [
@@ -532,22 +530,40 @@ export class Ark {
} }
public async getAllEvents({ filter }: { filter: NDKFilter }) { public async getAllEvents({ filter }: { filter: NDKFilter }) {
const events = await this.#ndk.fetchEvents(filter); const events = await this.ndk.fetchEvents(filter);
if (!events) return []; if (!events) return [];
return [...events]; return [...events];
} }
public async getEventById({ id }: { id: string }) { public async getEventById({ id }: { id: string }) {
const event = await this.#ndk.fetchEvent(id, { let eventId: string = id;
if (
eventId.startsWith('nevent1') ||
eventId.startsWith('note1') ||
eventId.startsWith('naddr1')
) {
const decode = nip19.decode(eventId);
if (decode.type === 'nevent') eventId = decode.data.id;
if (decode.type === 'note') eventId = decode.data;
if (decode.type === 'naddr') {
return await this.ndk.fetchEvent({
kinds: [decode.data.kind],
'#d': [decode.data.identifier],
authors: [decode.data.pubkey],
});
}
}
return await this.ndk.fetchEvent(id, {
cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST, cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST,
}); });
if (!event) return null;
return event;
} }
public async getEventByFilter({ filter }: { filter: NDKFilter }) { public async getEventByFilter({ filter }: { filter: NDKFilter }) {
const event = await this.#ndk.fetchEvent(filter, { const event = await this.ndk.fetchEvent(filter, {
cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST, cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST,
}); });
@@ -589,8 +605,8 @@ export class Ark {
let events = data || null; let events = data || null;
if (!data) { if (!data) {
const relayUrls = [...this.#ndk.pool.relays.values()].map((item) => item.url); const relayUrls = [...this.ndk.pool.relays.values()].map((item) => item.url);
const rawEvents = (await this.#fetcher.fetchAllEvents( const rawEvents = (await this.fetcher.fetchAllEvents(
relayUrls, relayUrls,
{ {
kinds: [NDKKind.Text], kinds: [NDKKind.Text],
@@ -600,7 +616,7 @@ export class Ark {
{ sort: true } { sort: true }
)) as unknown as NostrEvent[]; )) as unknown as NostrEvent[];
events = rawEvents.map( events = rawEvents.map(
(event) => new NDKEvent(this.#ndk, event) (event) => new NDKEvent(this.ndk, event)
) as NDKEvent[] as NDKEventWithReplies[]; ) as NDKEvent[] as NDKEventWithReplies[];
} }
@@ -633,7 +649,7 @@ export class Ark {
public async getAllRelaysFromContacts() { public async getAllRelaysFromContacts() {
const LIMIT = 1; const LIMIT = 1;
const relayMap = new Map<string, string[]>(); const relayMap = new Map<string, string[]>();
const relayEvents = this.#fetcher.fetchLatestEventsPerAuthor( const relayEvents = this.fetcher.fetchLatestEventsPerAuthor(
{ {
authors: this.account.contacts, authors: this.account.contacts,
relayUrls: this.relays, relayUrls: this.relays,
@@ -672,13 +688,13 @@ export class Ark {
const rootIds = new Set(); const rootIds = new Set();
const dedupQueue = new Set(); const dedupQueue = new Set();
const events = await this.#fetcher.fetchLatestEvents(this.relays, filter, limit, { const events = await this.fetcher.fetchLatestEvents(this.relays, filter, limit, {
asOf: pageParam === 0 ? undefined : pageParam, asOf: pageParam === 0 ? undefined : pageParam,
abortSignal: signal, abortSignal: signal,
}); });
const ndkEvents = events.map((event) => { const ndkEvents = events.map((event) => {
return new NDKEvent(this.#ndk, event); return new NDKEvent(this.ndk, event);
}); });
if (dedup) { if (dedup) {
@@ -713,7 +729,7 @@ export class Ark {
signal?: AbortSignal; signal?: AbortSignal;
dedup?: boolean; dedup?: boolean;
}) { }) {
const events = await this.#fetcher.fetchLatestEvents( const events = await this.fetcher.fetchLatestEvents(
[normalizeRelayUrl(relayUrl)], [normalizeRelayUrl(relayUrl)],
filter, filter,
limit, limit,
@@ -724,7 +740,7 @@ export class Ark {
); );
const ndkEvents = events.map((event) => { const ndkEvents = events.map((event) => {
return new NDKEvent(this.#ndk, event); return new NDKEvent(this.ndk, event);
}); });
return ndkEvents.sort((a, b) => b.created_at - a.created_at); return ndkEvents.sort((a, b) => b.created_at - a.created_at);
@@ -807,7 +823,7 @@ export class Ark {
* @deprecated NIP-04 will be replace by NIP-44 in the next update * @deprecated NIP-04 will be replace by NIP-44 in the next update
*/ */
public async getAllChats() { public async getAllChats() {
const events = await this.#fetcher.fetchAllEvents( const events = await this.fetcher.fetchAllEvents(
this.relays, this.relays,
{ {
kinds: [NDKKind.EncryptedDirectMessage], kinds: [NDKKind.EncryptedDirectMessage],
@@ -840,7 +856,7 @@ export class Ark {
let senderMessages: NostrEventExt<false>[] = []; let senderMessages: NostrEventExt<false>[] = [];
if (pubkey !== this.account.pubkey) { if (pubkey !== this.account.pubkey) {
senderMessages = await this.#fetcher.fetchAllEvents( senderMessages = await this.fetcher.fetchAllEvents(
this.relays, this.relays,
{ {
kinds: [NDKKind.EncryptedDirectMessage], kinds: [NDKKind.EncryptedDirectMessage],
@@ -851,7 +867,7 @@ export class Ark {
); );
} }
const userMessages = await this.#fetcher.fetchAllEvents( const userMessages = await this.fetcher.fetchAllEvents(
this.relays, this.relays,
{ {
kinds: [NDKKind.EncryptedDirectMessage], kinds: [NDKKind.EncryptedDirectMessage],
@@ -876,20 +892,20 @@ export class Ark {
? event.tags.find((el) => el[0] === 'p')[1] ? event.tags.find((el) => el[0] === 'p')[1]
: event.pubkey, : event.pubkey,
}); });
const content = await this.#ndk.signer.decrypt(sender, event.content); const content = await this.ndk.signer.decrypt(sender, event.content);
return content; return content;
} catch (e) { } catch (e) {
console.error(e); throw new Error(e);
} }
} }
public async nip04Encrypt({ content, pubkey }: { content: string; pubkey: string }) { public async nip04Encrypt({ content, pubkey }: { content: string; pubkey: string }) {
try { try {
const recipient = new NDKUser({ pubkey }); const recipient = new NDKUser({ pubkey });
const message = await this.#ndk.signer.encrypt(recipient, content); const message = await this.ndk.signer.encrypt(recipient, content);
const event = new NDKEvent(this.#ndk); const event = new NDKEvent(this.ndk);
event.content = message; event.content = message;
event.kind = NDKKind.EncryptedDirectMessage; event.kind = NDKKind.EncryptedDirectMessage;
event.tag(recipient); event.tag(recipient);
@@ -897,22 +913,22 @@ export class Ark {
const publish = await event.publish(); const publish = await event.publish();
if (!publish) throw new Error('Failed to send NIP-04 encrypted message'); if (!publish) throw new Error('Failed to send NIP-04 encrypted message');
return publish; return { id: event.id, seens: [...publish.values()].map((item) => item.url) };
} catch (e) { } catch (e) {
console.error(e); throw new Error(e);
} }
} }
public async replyTo({ content, event }: { content: string; event: NDKEvent }) { public async replyTo({ content, event }: { content: string; event: NDKEvent }) {
try { try {
const replyEvent = new NDKEvent(this.#ndk); const replyEvent = new NDKEvent(this.ndk);
replyEvent.content = content; replyEvent.content = content;
replyEvent.kind = NDKKind.Text; replyEvent.kind = NDKKind.Text;
replyEvent.tag(event, 'reply'); replyEvent.tag(event, 'reply');
return await replyEvent.publish(); return await replyEvent.publish();
} catch (e) { } catch (e) {
console.error(e); throw new Error(e);
} }
} }
} }

View File

@@ -1,3 +1,2 @@
export * from './ark'; export * from './ark';
export * from './cache';
export * from './provider'; export * from './provider';

View File

@@ -183,12 +183,14 @@ export class NDKCacheAdapterTauri implements NDKCacheAdapter {
const filterKeys = Object.keys(_filter || {}).sort(); const filterKeys = Object.keys(_filter || {}).sort();
try { try {
(await this.byKindAndAuthor(filterKeys, filter, subscription)) || await Promise.allSettled([
(await this.byAuthors(filterKeys, filter, subscription)) || this.byKindAndAuthor(filterKeys, filter, subscription),
(await this.byKinds(filterKeys, filter, subscription)) || this.byAuthors(filterKeys, filter, subscription),
(await this.byIdsQuery(filterKeys, filter, subscription)) || this.byKinds(filterKeys, filter, subscription),
(await this.byNip33Query(filterKeys, filter, subscription)) || this.byIdsQuery(filterKeys, filter, subscription),
(await this.byTagsAndOptionallyKinds(filterKeys, filter, subscription)); this.byNip33Query(filterKeys, filter, subscription),
this.byTagsAndOptionallyKinds(filterKeys, filter, subscription),
]);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
@@ -196,7 +198,7 @@ export class NDKCacheAdapterTauri implements NDKCacheAdapter {
public async setEvent( public async setEvent(
event: NDKEvent, event: NDKEvent,
_filter: NDKFilter, filters: NDKFilter[],
relay?: NDKRelay relay?: NDKRelay
): Promise<void> { ): Promise<void> {
if (event.kind === 0) { if (event.kind === 0) {

View File

@@ -23,7 +23,7 @@ export function Repost({ event }: { event: NDKEvent }) {
try { try {
if (event.content.length > 50) { if (event.content.length > 50) {
const embed = JSON.parse(event.content) as NostrEvent; const embed = JSON.parse(event.content) as NostrEvent;
return ark.createNDKEvent({ event: embed }); return new NDKEvent(ark.ndk, embed);
} }
const id = event.tags.find((el) => el[0] === 'e')[1]; const id = event.tags.find((el) => el[0] === 'e')[1];

View File

@@ -1,7 +1,5 @@
import { NDKEvent, NostrEvent } from '@nostr-dev-kit/ndk'; import { NDKEvent, NostrEvent } from '@nostr-dev-kit/ndk';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { nip19 } from 'nostr-tools';
import { AddressPointer } from 'nostr-tools/lib/types/nip19';
import { useArk } from '@libs/ark'; import { useArk } from '@libs/ark';
export function useEvent(id: undefined | string, embed?: undefined | string) { export function useEvent(id: undefined | string, embed?: undefined | string) {
@@ -9,32 +7,14 @@ export function useEvent(id: undefined | string, embed?: undefined | string) {
const { status, isFetching, isError, data } = useQuery({ const { status, isFetching, isError, data } = useQuery({
queryKey: ['event', id], queryKey: ['event', id],
queryFn: async () => { queryFn: async () => {
let event: NDKEvent = undefined;
const naddr = id.startsWith('naddr')
? (nip19.decode(id).data as AddressPointer)
: null;
// return event refer from naddr
if (naddr) {
const events = await ark.getAllEvents({
filter: {
kinds: [naddr.kind],
'#d': [naddr.identifier],
authors: [naddr.pubkey],
},
});
event = events.slice(-1)[0];
}
// return embed event (nostr.band api) // return embed event (nostr.band api)
if (embed) { if (embed) {
const embedEvent: NostrEvent = JSON.parse(embed); const embedEvent: NostrEvent = JSON.parse(embed);
event = ark.createNDKEvent({ event: embedEvent }); return new NDKEvent(ark.ndk, embedEvent);
} }
// get event from relay // get event from relay
event = await ark.getEventById({ id }); const event = await ark.getEventById({ id });
if (!event) if (!event)
throw new Error(`Cannot get event with ${id}, will be retry after 10 seconds`); throw new Error(`Cannot get event with ${id}, will be retry after 10 seconds`);

View File

@@ -1,6 +1,5 @@
import { NDKUserProfile } from '@nostr-dev-kit/ndk'; import { NDKUserProfile } from '@nostr-dev-kit/ndk';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { nip19 } from 'nostr-tools';
import { useArk } from '@libs/ark'; import { useArk } from '@libs/ark';
export function useProfile(pubkey: string, embed?: string) { export function useProfile(pubkey: string, embed?: string) {
@@ -19,16 +18,7 @@ export function useProfile(pubkey: string, embed?: string) {
return profile; return profile;
} }
// get clean pubkey without any special characters const profile = await ark.getUserProfile({ pubkey });
let hexstring = pubkey.replace(/[^a-zA-Z0-9]/g, '');
if (hexstring.startsWith('npub1') || hexstring.startsWith('nprofile1')) {
const decoded = nip19.decode(hexstring);
if (decoded.type === 'nprofile') hexstring = decoded.data.pubkey;
if (decoded.type === 'npub') hexstring = decoded.data;
}
const profile = await ark.getUserProfile({ pubkey: hexstring });
if (!profile) if (!profile)
throw new Error( throw new Error(

View File

@@ -22,7 +22,6 @@ export function useRelay() {
await ark.createEvent({ await ark.createEvent({
kind: NDKKind.RelayList, kind: NDKKind.RelayList,
tags: [['r', relay, purpose ?? '']], tags: [['r', relay, purpose ?? '']],
publish: true,
}); });
} }
@@ -33,7 +32,6 @@ export function useRelay() {
await ark.createEvent({ await ark.createEvent({
kind: NDKKind.RelayList, kind: NDKKind.RelayList,
tags: [...prevRelays, ['r', relay, purpose ?? '']], tags: [...prevRelays, ['r', relay, purpose ?? '']],
publish: true,
}); });
// Optimistically update to the new value // Optimistically update to the new value
@@ -69,7 +67,6 @@ export function useRelay() {
await ark.createEvent({ await ark.createEvent({
kind: NDKKind.RelayList, kind: NDKKind.RelayList,
tags: prevRelays, tags: prevRelays,
publish: true,
}); });
// Optimistically update to the new value // Optimistically update to the new value

View File

@@ -3,9 +3,13 @@ export function fileType(url: string) {
return 'image'; return 'image';
} }
if (url.match(/\.(mp4|mov|webm|wmv|flv|mts|avi|ogv|mkv|mp3|m3u8)$/)) { if (url.match(/\.(mp4|mov|webm|wmv|flv|mts|avi|ogv|mkv)$/)) {
return 'video'; return 'video';
} }
if (url.match(/\.(mp3|ogg|wav)$/)) {
return 'audio';
}
return 'link'; return 'link';
} }