From 98ce928f0cdbb010dcc967d9640f951ae514c6e8 Mon Sep 17 00:00:00 2001 From: reya <123083837+reyamir@users.noreply.github.com> Date: Fri, 26 Sep 2025 14:17:31 +0700 Subject: [PATCH] chore: fix double message on sent (#166) * . * fix * update --- Cargo.lock | 215 +++++++++++++++--------------- crates/coop/src/chatspace.rs | 6 +- crates/coop/src/views/chat/mod.rs | 103 +++++++------- crates/global/src/lib.rs | 6 +- crates/registry/src/room.rs | 42 +++++- 5 files changed, 199 insertions(+), 173 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5ee8da3..f934be4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -224,9 +224,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" +checksum = "9611ec0b6acea03372540509035db2f7f1e9f04da5d27728436fa994033c00a0" dependencies = [ "compression-codecs", "compression-core", @@ -275,7 +275,7 @@ dependencies = [ "polling", "rustix 1.1.2", "slab", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -344,7 +344,7 @@ dependencies = [ "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -472,9 +472,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b8ff6c09cd57b16da53641caa860168b88c172a5ee163b0288d3d6eea12786" +checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" dependencies = [ "aws-lc-sys", "zeroize", @@ -482,22 +482,23 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e44d16778acaf6a9ec9899b92cebd65580b83f685446bf2e1f5d3d732f99dcd" +checksum = "ee74396bee4da70c2e27cf94762714c911725efe69d9e2672f998512a67a4ce4" dependencies = [ "bindgen 0.72.1", "cc", "cmake", "dunce", "fs_extra", + "libloading", ] [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -505,7 +506,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.0", ] [[package]] @@ -541,7 +542,7 @@ dependencies = [ "bitflags 2.9.4", "cexpr", "clang-sys", - "itertools 0.11.0", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", @@ -561,7 +562,7 @@ dependencies = [ "bitflags 2.9.4", "cexpr", "clang-sys", - "itertools 0.11.0", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", @@ -1128,7 +1129,7 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "indexmap", "rustc-hash 2.1.1", @@ -1546,9 +1547,9 @@ checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", ] @@ -1569,7 +1570,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "proc-macro2", "quote", @@ -1837,7 +1838,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -1979,9 +1980,9 @@ checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "flatbuffers" -version = "25.2.10" +version = "25.9.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1045398c1bfd89168b5fd3f1fc11f6e70b34f6f66300c87d44d3de849463abf1" +checksum = "09b6620799e7340ebd9968d2e0708eb82cf1971e9a16821e2091b6d6e475eed5" dependencies = [ "bitflags 2.9.4", "rustc_version", @@ -2400,9 +2401,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" @@ -2505,7 +2506,7 @@ dependencies = [ [[package]] name = "gpui" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "anyhow", "as-raw-xcb-connection", @@ -2599,7 +2600,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2611,7 +2612,7 @@ dependencies = [ [[package]] name = "gpui_tokio" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "anyhow", "gpui", @@ -2831,7 +2832,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "anyhow", "bytes", @@ -2851,7 +2852,7 @@ dependencies = [ [[package]] name = "http_client_tls" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "rustls", "rustls-platform-verifier", @@ -2971,7 +2972,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.0", + "windows-core 0.62.1", ] [[package]] @@ -3148,9 +3149,9 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" [[package]] name = "indexmap" @@ -3349,9 +3350,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -3410,9 +3411,9 @@ checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libfuzzer-sys" @@ -3426,12 +3427,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-link 0.2.0", + "windows-targets 0.53.4", ] [[package]] @@ -3656,7 +3657,7 @@ dependencies = [ [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "anyhow", "bindgen 0.71.1", @@ -3671,9 +3672,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" @@ -3898,13 +3899,13 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf23ab2b905654b4cb177e30b629937b3868311d4e1cba859f899c041046e69b" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] name = "nostr" version = "0.43.0" -source = "git+https://github.com/rust-nostr/nostr#418e34bcab62869c80cd86bf7c6ace1b9960b09d" +source = "git+https://github.com/rust-nostr/nostr#75345c65c645d33d15f6a5ec10fa6ffd0d8f4cac" dependencies = [ "aes", "base64", @@ -3928,7 +3929,7 @@ dependencies = [ [[package]] name = "nostr-connect" version = "0.43.0" -source = "git+https://github.com/rust-nostr/nostr#418e34bcab62869c80cd86bf7c6ace1b9960b09d" +source = "git+https://github.com/rust-nostr/nostr#75345c65c645d33d15f6a5ec10fa6ffd0d8f4cac" dependencies = [ "async-utility", "nostr", @@ -3940,7 +3941,7 @@ dependencies = [ [[package]] name = "nostr-database" version = "0.43.0" -source = "git+https://github.com/rust-nostr/nostr#418e34bcab62869c80cd86bf7c6ace1b9960b09d" +source = "git+https://github.com/rust-nostr/nostr#75345c65c645d33d15f6a5ec10fa6ffd0d8f4cac" dependencies = [ "flatbuffers", "lru", @@ -3951,7 +3952,7 @@ dependencies = [ [[package]] name = "nostr-lmdb" version = "0.43.0" -source = "git+https://github.com/rust-nostr/nostr#418e34bcab62869c80cd86bf7c6ace1b9960b09d" +source = "git+https://github.com/rust-nostr/nostr#75345c65c645d33d15f6a5ec10fa6ffd0d8f4cac" dependencies = [ "async-utility", "flume", @@ -3965,7 +3966,7 @@ dependencies = [ [[package]] name = "nostr-relay-pool" version = "0.43.0" -source = "git+https://github.com/rust-nostr/nostr#418e34bcab62869c80cd86bf7c6ace1b9960b09d" +source = "git+https://github.com/rust-nostr/nostr#75345c65c645d33d15f6a5ec10fa6ffd0d8f4cac" dependencies = [ "async-utility", "async-wsocket", @@ -3982,7 +3983,7 @@ dependencies = [ [[package]] name = "nostr-sdk" version = "0.43.0" -source = "git+https://github.com/rust-nostr/nostr#418e34bcab62869c80cd86bf7c6ace1b9960b09d" +source = "git+https://github.com/rust-nostr/nostr#75345c65c645d33d15f6a5ec10fa6ffd0d8f4cac" dependencies = [ "async-utility", "nostr", @@ -4258,9 +4259,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -4499,7 +4500,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "collections", "serde", @@ -4641,7 +4642,7 @@ dependencies = [ "hermit-abi", "pin-project-lite", "rustix 1.1.2", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -5107,7 +5108,7 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "derive_refineable", "workspace-hack", @@ -5115,9 +5116,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -5127,9 +5128,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -5261,7 +5262,7 @@ dependencies = [ [[package]] name = "reqwest_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "anyhow", "bytes", @@ -5316,7 +5317,7 @@ dependencies = [ [[package]] name = "rope" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "arrayvec", "log", @@ -5483,7 +5484,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -5664,7 +5665,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -5811,7 +5812,7 @@ checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" [[package]] name = "semantic_version" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "anyhow", "serde", @@ -5826,9 +5827,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245" dependencies = [ "serde_core", "serde_derive", @@ -5836,18 +5837,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04" dependencies = [ "proc-macro2", "quote", @@ -6263,7 +6264,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "arrayvec", "log", @@ -6533,15 +6534,15 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.22.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand 2.3.0", "getrandom 0.3.3", "once_cell", "rustix 1.1.2", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -7309,7 +7310,7 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "util" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "anyhow", "async-fs", @@ -7344,7 +7345,7 @@ dependencies = [ [[package]] name = "util_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#5612a961b02522a5e3f6292873fec1f853643734" +source = "git+https://github.com/zed-industries/zed#0891a7142db60b9c78247d9034b292c9d9b96dca" dependencies = [ "perf", "quote", @@ -7513,9 +7514,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -7526,9 +7527,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -7540,9 +7541,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.53" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -7553,9 +7554,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7563,9 +7564,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -7576,9 +7577,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -7683,9 +7684,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -7792,7 +7793,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -7864,8 +7865,8 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", + "windows-implement 0.60.1", + "windows-interface 0.59.2", "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", @@ -7873,12 +7874,12 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.62.0" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", + "windows-implement 0.60.1", + "windows-interface 0.59.2", "windows-link 0.2.0", "windows-result 0.4.0", "windows-strings 0.5.0", @@ -7908,9 +7909,9 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ "proc-macro2", "quote", @@ -7930,9 +7931,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" dependencies = [ "proc-macro2", "quote", @@ -7969,7 +7970,7 @@ checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result 0.3.4", "windows-strings 0.3.1", - "windows-targets 0.53.3", + "windows-targets 0.53.4", ] [[package]] @@ -8079,14 +8080,14 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.4", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" dependencies = [ "windows-link 0.2.0", ] @@ -8139,11 +8140,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ - "windows-link 0.1.3", + "windows-link 0.2.0", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", diff --git a/crates/coop/src/chatspace.rs b/crates/coop/src/chatspace.rs index 729691f..24fa1b4 100644 --- a/crates/coop/src/chatspace.rs +++ b/crates/coop/src/chatspace.rs @@ -676,7 +676,7 @@ impl ChatSpace { } /// Stores an unwrapped event in local database with reference to original - async fn set_unwrapped_event(root: EventId, unwrapped: &Event) -> Result<(), Error> { + async fn set_unwrapped_event(gift_wrap: EventId, unwrapped: &Event) -> Result<(), Error> { let client = nostr_client(); // Save unwrapped event @@ -684,7 +684,7 @@ impl ChatSpace { // Create a reference event pointing to the unwrapped event let event = EventBuilder::new(Kind::ApplicationSpecificData, "") - .tags(vec![Tag::identifier(root), Tag::event(unwrapped.id)]) + .tags(vec![Tag::identifier(gift_wrap), Tag::event(unwrapped.id)]) .sign(&Keys::generate()) .await?; @@ -744,8 +744,6 @@ impl ChatSpace { match event.created_at >= app_state.init_at { // New message: send a signal to notify the UI true => { - // A small delay to prevent UI flickering - smol::Timer::after(Duration::from_millis(200)).await; app_state .signal .send(SignalKind::NewMessage((target.id, event))) diff --git a/crates/coop/src/views/chat/mod.rs b/crates/coop/src/views/chat/mod.rs index a879a0c..92596f1 100644 --- a/crates/coop/src/views/chat/mod.rs +++ b/crates/coop/src/views/chat/mod.rs @@ -164,9 +164,21 @@ impl Chat { cx.subscribe_in(&room, window, move |this, _, signal, window, cx| { match signal { RoomSignal::NewMessage((gift_wrap_id, event)) => { - if !this.is_sent_by_coop(gift_wrap_id) { - this.insert_message(Message::user(event), false, cx); - } + let gift_wrap_id = gift_wrap_id.to_owned(); + let message = Message::user(event); + + cx.spawn_in(window, async move |this, cx| { + let app_state = app_state(); + let sent_ids = app_state.sent_ids.read().await; + + this.update_in(cx, |this, _window, cx| { + if !sent_ids.contains(&gift_wrap_id) { + this.insert_message(message, false, cx); + } + }) + .ok(); + }) + .detach(); } RoomSignal::Refresh => { this.load_messages(window, cx); @@ -242,20 +254,19 @@ impl Chat { self._tasks.push( // Run the task in the background cx.spawn_in(window, async move |this, cx| { - match load_messages.await { - Ok(events) => { - this.update(cx, |this, cx| { + let result = load_messages.await; + + this.update_in(cx, |this, window, cx| { + match result { + Ok(events) => { this.insert_messages(events, cx); - }) - .ok(); - } - Err(e) => { - cx.update(|window, cx| { - window.push_notification(e.to_string(), cx); - }) - .ok(); - } - }; + } + Err(e) => { + window.push_notification(Notification::error(e.to_string()), cx); + } + }; + }) + .ok(); }), ); } @@ -289,11 +300,6 @@ impl Chat { content } - /// Check if the event is sent by Coop - fn is_sent_by_coop(&self, gift_wrap_id: &EventId) -> bool { - app_state().sent_ids.read_blocking().contains(gift_wrap_id) - } - /// Send a message to all members of the chat fn send_message(&mut self, window: &mut Window, cx: &mut Context) { // Get the message which includes all attachments @@ -305,12 +311,6 @@ impl Chat { return; } - // Temporary disable input - self.input.update(cx, |this, cx| { - this.set_loading(true, cx); - this.set_disabled(true, cx); - }); - // Get the backup setting let backup = AppSettings::get_backup_messages(cx); @@ -328,29 +328,27 @@ impl Chat { // Create a task for sending the message in the background let send_message = room.send_in_background(&content, replies, backup, cx); - cx.defer_in(window, |this, window, cx| { - // Optimistically update message list - this.insert_message(Message::user(temp_message), true, cx); + // Optimistically update message list + self.insert_message(Message::user(temp_message), true, cx); - // Remove all replies - this.remove_all_replies(cx); + // Remove all replies + self.remove_all_replies(cx); - // remove all attachments - this.remove_all_attachments(cx); + // remove all attachments + self.remove_all_attachments(cx); - // Reset the input state - this.input.update(cx, |this, cx| { - this.set_loading(false, cx); - this.set_disabled(false, cx); - this.set_value("", window, cx); - }); + // Reset the input state + self.input.update(cx, |this, cx| { + this.set_value("", window, cx); }); // Continue sending the message in the background cx.spawn_in(window, async move |this, cx| { - match send_message.await { - Ok(reports) => { - this.update(cx, |this, cx| { + let result = send_message.await; + + this.update_in(cx, |this, window, cx| { + match result { + Ok(reports) => { this.room.update(cx, |this, cx| { if this.kind != RoomKind::Ongoing { // Update the room kind to ongoing @@ -366,16 +364,13 @@ impl Chat { this.reports_by_id.insert(temp_id, reports); cx.notify(); - }) - .ok(); - } - Err(e) => { - cx.update(|window, cx| { + } + Err(e) => { window.push_notification(e.to_string(), cx); - }) - .ok(); + } } - } + }) + .ok(); }) .detach(); } @@ -430,8 +425,9 @@ impl Chat { item_ix: self.list_state.item_count(), offset_in_item: px(0.0), }); - cx.notify(); } + + cx.notify(); } } @@ -439,11 +435,12 @@ impl Chat { fn insert_messages(&mut self, events: Vec, cx: &mut Context) { for event in events.into_iter() { let m = Message::user(event); + // Bulk inserting messages, so no need to scroll to the latest message self.insert_message(m, false, cx); } - cx.notify(); } + /// Insert a warning message into the chat panel fn insert_warning(&mut self, content: impl Into, cx: &mut Context) { let m = Message::warning(content.into()); self.insert_message(m, true, cx); diff --git a/crates/global/src/lib.rs b/crates/global/src/lib.rs index 01985c3..a1f2251 100644 --- a/crates/global/src/lib.rs +++ b/crates/global/src/lib.rs @@ -159,10 +159,10 @@ pub struct AppState { pub auto_close_opts: Option, - pub seen_on_relays: RwLock>>, - pub sent_ids: RwLock>, + pub seen_on_relays: RwLock>>, + pub resent_ids: RwLock>>, pub resend_queue: RwLock>, @@ -196,8 +196,8 @@ impl AppState { gift_wrap_sub_id: SubscriptionId::new("inbox"), gift_wrap_processing: AtomicBool::new(false), auto_close_opts: Some(opts), - seen_on_relays: RwLock::new(HashMap::new()), sent_ids: RwLock::new(HashSet::new()), + seen_on_relays: RwLock::new(HashMap::new()), resent_ids: RwLock::new(Vec::new()), resend_queue: RwLock::new(HashMap::new()), } diff --git a/crates/registry/src/room.rs b/crates/registry/src/room.rs index f90fdf4..e413982 100644 --- a/crates/registry/src/room.rs +++ b/crates/registry/src/room.rs @@ -365,21 +365,51 @@ impl Room { cx.background_spawn(async move { let client = nostr_client(); - let public_key = members[members.len() - 1]; + let signer = client.signer().await?; + let public_key = signer.get_public_key().await?; + let sent_ids = app_state() + .sent_ids + .read() + .await + .iter() + .copied() + .collect_vec(); - let sent = Filter::new() + // Get seen events from database + let filter = Filter::new() + .kind(Kind::ApplicationSpecificData) + .identifiers(sent_ids); + + let seen_events = client.database().query(filter).await?; + + // Extract seen event IDs + let seen_ids: Vec = seen_events + .into_iter() + .filter_map(|event| event.tags.event_ids().next().copied()) + .collect(); + + // Get events that sent by current user + let filter = Filter::new() .kind(Kind::PrivateDirectMessage) .author(public_key) .pubkeys(members.clone()); - let recv = Filter::new() + let sent_events = client.database().query(filter).await?; + + // Get events that received by current user + let filter = Filter::new() .kind(Kind::PrivateDirectMessage) .authors(members) .pubkey(public_key); - let sent_events = client.database().query(sent).await?; - let recv_events = client.database().query(recv).await?; - let events: Vec = sent_events.merge(recv_events).into_iter().collect(); + let recv_events = client.database().query(filter).await?; + + // Merge events + let events: Vec = sent_events + .merge(recv_events) + .into_iter() + .filter(|event| !seen_ids.contains(&event.id)) + .collect(); Ok(events) })