From 2aa21965658eb9e8a14c8b5c74b866fd1b260f48 Mon Sep 17 00:00:00 2001 From: reya Date: Thu, 13 Feb 2025 07:54:38 +0700 Subject: [PATCH] feat: add edit messages relay button --- Cargo.lock | 295 +++++++++++++++++++++++++++++---- assets/icons/relays.svg | 3 + crates/app/src/main.rs | 1 + crates/app/src/views/app.rs | 133 +++++++++++++-- crates/app/src/views/relays.rs | 24 ++- crates/ui/src/button.rs | 2 +- crates/ui/src/icon.rs | 2 + 7 files changed, 405 insertions(+), 55 deletions(-) create mode 100644 assets/icons/relays.svg diff --git a/Cargo.lock b/Cargo.lock index 6baf487..2b06fc1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -443,6 +443,31 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "aws-lc-rs" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b7ddaa2c56a367ad27a094ad8ef4faacf8a617c2575acb2ba88949df999ca" +dependencies = [ + "aws-lc-sys", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54ac4f13dad353b209b34cbec082338202cbc01c8f00336b55c750c13ac91f8f" +dependencies = [ + "bindgen 0.69.5", + "cc", + "cmake", + "dunce", + "fs_extra", + "paste", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -476,6 +501,29 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.8.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.98", + "which", +] + [[package]] name = "bindgen" version = "0.70.1" @@ -839,6 +887,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cexpr" version = "0.6.0" @@ -952,9 +1006,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.28" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" +checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" dependencies = [ "clap_builder", "clap_derive", @@ -962,9 +1016,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" dependencies = [ "anstream", "anstyle", @@ -990,6 +1044,15 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + [[package]] name = "cocoa" version = "0.25.0" @@ -1063,7 +1126,7 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "indexmap", "rustc-hash 2.1.1", @@ -1081,6 +1144,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "common" version = "0.1.0" @@ -1380,7 +1453,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "proc-macro2", "quote", @@ -1661,9 +1734,9 @@ dependencies = [ [[package]] name = "filedescriptor" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" dependencies = [ "libc", "thiserror 1.0.69", @@ -1841,6 +1914,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futf" version = "0.1.5" @@ -2105,13 +2184,13 @@ dependencies = [ [[package]] name = "gpui" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "anyhow", "as-raw-xcb-connection", "ashpd", "async-task", - "bindgen", + "bindgen 0.70.1", "blade-graphics", "blade-macros", "blade-util", @@ -2192,7 +2271,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "proc-macro2", "quote", @@ -2202,7 +2281,7 @@ dependencies = [ [[package]] name = "gpui_tokio" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "gpui", "tokio", @@ -2370,6 +2449,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "html-escape" version = "0.2.13" @@ -2416,7 +2504,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "anyhow", "bytes", @@ -2424,6 +2512,8 @@ dependencies = [ "futures", "http", "log", + "rustls", + "rustls-platform-verifier", "serde", "serde_json", "url", @@ -2817,6 +2907,28 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.32" @@ -2877,6 +2989,12 @@ dependencies = [ "spin", ] +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "lebe" version = "0.5.2" @@ -3074,10 +3192,10 @@ dependencies = [ [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "anyhow", - "bindgen", + "bindgen 0.70.1", "core-foundation 0.9.4", "ctor", "foreign-types", @@ -3154,9 +3272,9 @@ checksum = "6367d84fb54d4242af283086402907277715b8fe46976963af5ebf173f8efba3" [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", "simd-adler32", @@ -3259,7 +3377,7 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "nostr" version = "0.39.0" -source = "git+https://github.com/rust-nostr/nostr#6caf231eca951f2c6909382c46f43edffbd6e730" +source = "git+https://github.com/rust-nostr/nostr#b390bcf7bf15aaab4b8417c410779b059842c364" dependencies = [ "aes", "base64", @@ -3287,7 +3405,7 @@ dependencies = [ [[package]] name = "nostr-connect" version = "0.39.0" -source = "git+https://github.com/rust-nostr/nostr#6caf231eca951f2c6909382c46f43edffbd6e730" +source = "git+https://github.com/rust-nostr/nostr#b390bcf7bf15aaab4b8417c410779b059842c364" dependencies = [ "async-utility", "nostr", @@ -3299,7 +3417,7 @@ dependencies = [ [[package]] name = "nostr-database" version = "0.39.0" -source = "git+https://github.com/rust-nostr/nostr#6caf231eca951f2c6909382c46f43edffbd6e730" +source = "git+https://github.com/rust-nostr/nostr#b390bcf7bf15aaab4b8417c410779b059842c364" dependencies = [ "flatbuffers", "lru", @@ -3310,7 +3428,7 @@ dependencies = [ [[package]] name = "nostr-lmdb" version = "0.39.0" -source = "git+https://github.com/rust-nostr/nostr#6caf231eca951f2c6909382c46f43edffbd6e730" +source = "git+https://github.com/rust-nostr/nostr#b390bcf7bf15aaab4b8417c410779b059842c364" dependencies = [ "async-utility", "heed", @@ -3323,7 +3441,7 @@ dependencies = [ [[package]] name = "nostr-relay-pool" version = "0.39.0" -source = "git+https://github.com/rust-nostr/nostr#6caf231eca951f2c6909382c46f43edffbd6e730" +source = "git+https://github.com/rust-nostr/nostr#b390bcf7bf15aaab4b8417c410779b059842c364" dependencies = [ "async-utility", "async-wsocket", @@ -3340,7 +3458,7 @@ dependencies = [ [[package]] name = "nostr-sdk" version = "0.39.0" -source = "git+https://github.com/rust-nostr/nostr#6caf231eca951f2c6909382c46f43edffbd6e730" +source = "git+https://github.com/rust-nostr/nostr#b390bcf7bf15aaab4b8417c410779b059842c364" dependencies = [ "async-utility", "nostr", @@ -4377,7 +4495,7 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "derive_refineable", ] @@ -4510,7 +4628,7 @@ dependencies = [ [[package]] name = "reqwest_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "anyhow", "bytes", @@ -4644,10 +4762,12 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.22" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "ring", "rustls-pki-types", @@ -4686,12 +4806,40 @@ dependencies = [ "web-time", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e012c45844a1790332c9386ed4ca3a06def221092eda277e6f079728f8ea99da" +dependencies = [ + "core-foundation 0.10.0", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -4860,7 +5008,7 @@ checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" [[package]] name = "semantic_version" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "anyhow", "serde", @@ -5185,7 +5333,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "arrayvec", "log", @@ -6055,7 +6203,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "util" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#c1f162abc6cb41a0c765aa76c3af3e83a994ce18" +source = "git+https://github.com/zed-industries/zed#7ba1492f0af820eb8d558ba4c6b3c4f780be0de0" dependencies = [ "anyhow", "async-fs", @@ -6403,6 +6551,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09aed61f5e8d2c18344b3faa33a4c837855fe56642757754775548fee21386c4" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.26.8" @@ -6418,6 +6575,18 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "winapi" version = "0.3.9" @@ -6533,6 +6702,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -6560,6 +6738,21 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -6591,6 +6784,12 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -6603,6 +6802,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -6615,6 +6820,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -6633,6 +6844,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -6645,6 +6862,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -6657,6 +6880,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -6669,6 +6898,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" diff --git a/assets/icons/relays.svg b/assets/icons/relays.svg new file mode 100644 index 0000000..d8cd78a --- /dev/null +++ b/assets/icons/relays.svg @@ -0,0 +1,3 @@ + + + diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 25edb57..a215d01 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -48,6 +48,7 @@ fn main() { _ = client.add_relay("wss://relay.primal.net/").await; _ = client.add_relay("wss://user.kindpag.es/").await; _ = client.add_relay("wss://directory.yabu.me/").await; + _ = client.add_discovery_relay("wss://relaydiscovery.com").await; // Connect to all relays _ = client.connect().await diff --git a/crates/app/src/views/app.rs b/crates/app/src/views/app.rs index 6cc1d2f..0385934 100644 --- a/crates/app/src/views/app.rs +++ b/crates/app/src/views/app.rs @@ -4,8 +4,9 @@ use common::{ profile::NostrProfile, }; use gpui::{ - actions, div, img, impl_internal_actions, px, App, AppContext, Axis, Context, Entity, - InteractiveElement, IntoElement, ObjectFit, ParentElement, Render, Styled, StyledImage, Window, + actions, div, img, impl_internal_actions, prelude::FluentBuilder, px, App, AppContext, Axis, + Context, Entity, InteractiveElement, IntoElement, ObjectFit, ParentElement, Render, Styled, + StyledImage, Window, }; use log::info; use nostr_sdk::prelude::*; @@ -17,7 +18,7 @@ use ui::{ button::{Button, ButtonRounded, ButtonVariants}, dock_area::{dock::DockPlacement, DockArea, DockItem}, popup_menu::PopupMenuExt, - theme::{scale::ColorScaleStep, ActiveTheme}, + theme::{scale::ColorScaleStep, ActiveTheme, Appearance, Theme}, ContextModal, Icon, IconName, Root, Sizable, TitleBar, }; @@ -52,6 +53,7 @@ pub fn init(account: NostrProfile, window: &mut Window, cx: &mut App) -> Entity< pub struct AppView { account: NostrProfile, + relays: Entity>>, dock: Entity, } @@ -107,14 +109,21 @@ impl AppView { .detach(); cx.new(|cx| { + let public_key = account.public_key(); + let relays = cx.new(|_| None); + let async_relays = relays.downgrade(); + // Check user's messaging relays and determine user is ready for NIP17 or not. // If not, show the setup modal and instruct user setup inbox relays let client = get_client(); - let public_key = account.public_key(); let window_handle = window.window_handle(); - let (tx, rx) = oneshot::channel::(); + let (tx, rx) = oneshot::channel::>>(); - let this = Self { account, dock }; + let this = Self { + account, + relays, + dock, + }; cx.background_spawn(async move { let filter = Filter::new() @@ -122,22 +131,43 @@ impl AppView { .author(public_key) .limit(1); - let is_ready = if let Ok(events) = client.database().query(filter).await { - events.first_owned().is_some() + let relays = if let Ok(events) = client.database().query(filter).await { + if let Some(event) = events.first_owned() { + Some( + event + .tags + .filter_standardized(TagKind::Relay) + .filter_map(|t| match t { + TagStandard::Relay(url) => Some(url.to_string()), + + _ => None, + }) + .collect::>(), + ) + } else { + None + } } else { - false + None }; - _ = tx.send(is_ready); + _ = tx.send(relays); }) .detach(); cx.spawn(|this, mut cx| async move { - if let Ok(is_ready) = rx.await { - if !is_ready { + if let Ok(result) = rx.await { + if let Some(relays) = result { + _ = cx.update(|cx| { + _ = async_relays.update(cx, |this, cx| { + *this = Some(relays); + cx.notify(); + }); + }); + } else { _ = cx.update_window(window_handle, |_, window, cx| { this.update(cx, |this: &mut Self, cx| { - this.render_relays_setup(window, cx) + this.render_setup_relays(window, cx) }) }); } @@ -149,8 +179,8 @@ impl AppView { }) } - fn render_relays_setup(&self, window: &mut Window, cx: &mut Context) { - let relays = cx.new(|cx| Relays::new(window, cx)); + fn render_setup_relays(&self, window: &mut Window, cx: &mut Context) { + let relays = cx.new(|cx| Relays::new(None, window, cx)); window.open_modal(cx, move |this, window, cx| { let is_loading = relays.read(cx).loading(); @@ -181,6 +211,75 @@ impl AppView { }); } + fn render_edit_relay(&self, window: &mut Window, cx: &mut Context) { + let relays = self.relays.read(cx).clone(); + let view = cx.new(|cx| Relays::new(relays, window, cx)); + + window.open_modal(cx, move |this, window, cx| { + let is_loading = view.read(cx).loading(); + + this.width(px(420.)) + .title("Edit your Messaging Relays") + .child(view.clone()) + .footer( + div() + .p_2() + .border_t_1() + .border_color(cx.theme().base.step(cx, ColorScaleStep::FIVE)) + .child( + Button::new("update_inbox_relays_btn") + .label("Update") + .primary() + .bold() + .rounded(ButtonRounded::Large) + .w_full() + .loading(is_loading) + .on_click(window.listener_for(&view, |this, _, window, cx| { + this.update(window, cx); + })), + ), + ) + }); + } + + fn render_appearance_button( + &self, + _window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + Button::new("appearance") + .xsmall() + .ghost() + .map(|this| { + if cx.theme().appearance.is_dark() { + this.icon(IconName::Sun) + } else { + this.icon(IconName::Moon) + } + }) + .on_click(cx.listener(|_, _, window, cx| { + if cx.theme().appearance.is_dark() { + Theme::change(Appearance::Light, Some(window), cx); + } else { + Theme::change(Appearance::Dark, Some(window), cx); + } + })) + } + + fn render_relays_button( + &self, + _window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + Button::new("relays") + .xsmall() + .ghost() + .icon(IconName::Relays) + .on_click(cx.listener(|this, _, window, cx| { + this.render_edit_relay(window, cx); + })) + } + fn render_account(&self) -> impl IntoElement { Button::new("account") .ghost() @@ -276,8 +375,10 @@ impl Render for AppView { .flex() .items_center() .justify_end() - .gap_1() + .gap_2() .px_2() + .child(self.render_appearance_button(window, cx)) + .child(self.render_relays_button(window, cx)) .child(self.render_account()), ), ) diff --git a/crates/app/src/views/relays.rs b/crates/app/src/views/relays.rs index 14dd472..1ff88d5 100644 --- a/crates/app/src/views/relays.rs +++ b/crates/app/src/views/relays.rs @@ -12,6 +12,8 @@ use ui::{ ContextModal, IconName, Sizable, }; +const MESSAGE: &str = "In order to receive messages from others, you need to setup Messaging Relays. You can use the recommend relays or add more."; + pub struct Relays { relays: Entity>, input: Entity, @@ -20,12 +22,20 @@ pub struct Relays { } impl Relays { - pub fn new(window: &mut Window, cx: &mut Context<'_, Self>) -> Self { + pub fn new( + relays: Option>, + window: &mut Window, + cx: &mut Context<'_, Self>, + ) -> Self { let relays = cx.new(|_| { - vec![ - Url::parse("wss://auth.nostr1.com").unwrap(), - Url::parse("wss://relay.0xchat.com").unwrap(), - ] + if let Some(value) = relays { + value.into_iter().map(|v| Url::parse(&v).unwrap()).collect() + } else { + vec![ + Url::parse("wss://auth.nostr1.com").unwrap(), + Url::parse("wss://relay.0xchat.com").unwrap(), + ] + } }); let input = cx.new(|cx| { @@ -136,8 +146,6 @@ impl Relays { impl Render for Relays { fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { - let msg = "In order to receive messages from others, you need to setup Messaging Relays. You can use the recommend relays or add more."; - div() .track_focus(&self.focus_handle) .flex() @@ -148,7 +156,7 @@ impl Render for Relays { .px_2() .text_xs() .text_color(cx.theme().base.step(cx, ColorScaleStep::ELEVEN)) - .child(msg), + .child(MESSAGE), ) .child( div() diff --git a/crates/ui/src/button.rs b/crates/ui/src/button.rs index 8e7b693..36fb246 100644 --- a/crates/ui/src/button.rs +++ b/crates/ui/src/button.rs @@ -500,7 +500,7 @@ impl ButtonVariant { _ => cx.theme().accent.step(cx, ColorScaleStep::ONE), }, ButtonVariant::Link => cx.theme().accent.step(cx, ColorScaleStep::NINE), - ButtonVariant::Ghost => cx.theme().base.step(cx, ColorScaleStep::ELEVEN), + ButtonVariant::Ghost => cx.theme().base.step(cx, ColorScaleStep::TWELVE), ButtonVariant::Custom(colors) => colors.foreground, _ => cx.theme().base.step(cx, ColorScaleStep::TWELVE), } diff --git a/crates/ui/src/icon.rs b/crates/ui/src/icon.rs index 31588d7..d70bf04 100644 --- a/crates/ui/src/icon.rs +++ b/crates/ui/src/icon.rs @@ -60,6 +60,7 @@ pub enum IconName { Minimize, Minus, Moon, + Relays, Palette, PanelBottom, PanelBottomOpen, @@ -143,6 +144,7 @@ impl IconName { Self::Minimize => "icons/minimize.svg", Self::Minus => "icons/minus.svg", Self::Moon => "icons/moon.svg", + Self::Relays => "icons/relays.svg", Self::Palette => "icons/palette.svg", Self::PanelBottom => "icons/panel-bottom.svg", Self::PanelBottomOpen => "icons/panel-bottom-open.svg",