From 32f6c59ca81713a54ff96cbde1ea10cadd248263 Mon Sep 17 00:00:00 2001 From: JSKitty Date: Sat, 19 Jul 2025 19:33:11 +0100 Subject: [PATCH 1/3] fix: swap lock icon --- src/js/misc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/misc.js b/src/js/misc.js index c9573051..c765433d 100644 --- a/src/js/misc.js +++ b/src/js/misc.js @@ -661,7 +661,7 @@ function buildXIntentUrl(inviteCode, hashtags = ['Vector', 'Privacy'], via = 'Ve const baseUrl = 'https://x.com/intent/post'; // Build tweet text with proper handling of special characters - const tweetText = `🐇 Wake up, the Matrix has you... 🔓 Use my Vector Invite Code: ${inviteCode}`; + const tweetText = `🐇 Wake up, the Matrix has you... 🔐 Use my Vector Invite Code: ${inviteCode}`; // Create URLSearchParams for reliable encoding const params = new URLSearchParams({ From e9ff00e8f42b7ab96c01ef0d7ffadb0ce3663304 Mon Sep 17 00:00:00 2001 From: JSKitty Date: Mon, 21 Jul 2025 20:48:41 +0100 Subject: [PATCH 2/3] add: Windows Auto-Updater (test) An unfinished, experimental commit adding the Vector auto-updater system, primarily targetting Windows for initial addition. --- package-lock.json | 26 +- package.json | 4 +- src-tauri/Cargo.lock | 434 +++++++++++++++++++--------- src-tauri/Cargo.toml | 4 + src-tauri/capabilities/default.json | 4 +- src-tauri/src/lib.rs | 5 + src-tauri/tauri.conf.json | 12 + src/index.html | 24 ++ src/js/updater.js | 263 +++++++++++++++++ src/main.js | 19 +- src/styles.css | 77 ++++- 11 files changed, 722 insertions(+), 150 deletions(-) create mode 100644 src/js/updater.js diff --git a/package-lock.json b/package-lock.json index 02e54d45..934906dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,16 +11,18 @@ "@tauri-apps/plugin-clipboard-manager": "^2.2.2", "@tauri-apps/plugin-dialog": "^2.2.1", "@tauri-apps/plugin-fs": "^2.2.1", - "@tauri-apps/plugin-store": "^2.2.0" + "@tauri-apps/plugin-process": "^2.3.0", + "@tauri-apps/plugin-store": "^2.2.0", + "@tauri-apps/plugin-updater": "^2.9.0" }, "devDependencies": { "@tauri-apps/cli": "^2.4.1" } }, "node_modules/@tauri-apps/api": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.2.0.tgz", - "integrity": "sha512-R8epOeZl1eJEl603aUMIGb4RXlhPjpgxbGVEaqY+0G5JG9vzV/clNlzTeqc+NLYXVqXcn8mb4c5b9pJIUDEyAg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.7.0.tgz", + "integrity": "sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/tauri" @@ -255,6 +257,14 @@ "@tauri-apps/api": "^2.0.0" } }, + "node_modules/@tauri-apps/plugin-process": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-process/-/plugin-process-2.3.0.tgz", + "integrity": "sha512-0DNj6u+9csODiV4seSxxRbnLpeGYdojlcctCuLOCgpH9X3+ckVZIEj6H7tRQ7zqWr7kSTEWnrxtAdBb0FbtrmQ==", + "dependencies": { + "@tauri-apps/api": "^2.6.0" + } + }, "node_modules/@tauri-apps/plugin-store": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-store/-/plugin-store-2.2.0.tgz", @@ -262,6 +272,14 @@ "dependencies": { "@tauri-apps/api": "^2.0.0" } + }, + "node_modules/@tauri-apps/plugin-updater": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.9.0.tgz", + "integrity": "sha512-j++sgY8XpeDvzImTrzWA08OqqGqgkNyxczLD7FjNJJx/uXxMZFz5nDcfkyoI/rCjYuj2101Tci/r/HFmOmoxCg==", + "dependencies": { + "@tauri-apps/api": "^2.6.0" + } } } } diff --git a/package.json b/package.json index 8b44b52a..f7d6c057 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "@tauri-apps/plugin-clipboard-manager": "^2.2.2", "@tauri-apps/plugin-dialog": "^2.2.1", "@tauri-apps/plugin-fs": "^2.2.1", - "@tauri-apps/plugin-store": "^2.2.0" + "@tauri-apps/plugin-process": "^2.3.0", + "@tauri-apps/plugin-store": "^2.2.0", + "@tauri-apps/plugin-updater": "^2.9.0" } } diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 92c9e4cb..aec3298e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -119,6 +119,15 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arboard" version = "3.5.0" @@ -580,9 +589,9 @@ checksum = "e79769241dcd44edf79a732545e8b5cec84c247ac060f5252cd51885d093a8fc" [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -591,9 +600,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.3" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1019,15 +1028,15 @@ dependencies = [ [[package]] name = "cssparser" -version = "0.27.2" +version = "0.29.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa 0.4.8", + "itoa", "matches", - "phf 0.8.0", + "phf 0.10.1", "proc-macro2", "quote", "smallvec", @@ -1042,7 +1051,7 @@ checksum = "b7c66d1cd8ed61bf80b38432613a7a2f09401ab8d0501110655f8b341484a3e3" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa 1.0.15", + "itoa", "phf 0.11.3", "smallvec", ] @@ -1133,6 +1142,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "derive_more" version = "0.99.19" @@ -1175,7 +1195,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1434,6 +1454,18 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -2079,20 +2111,6 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" -[[package]] -name = "html5ever" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" -dependencies = [ - "log", - "mac", - "markup5ever 0.11.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "html5ever" version = "0.29.1" @@ -2101,7 +2119,7 @@ checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", - "markup5ever 0.14.1", + "markup5ever", "match_token", ] @@ -2113,7 +2131,7 @@ checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", - "itoa 1.0.15", + "itoa", ] [[package]] @@ -2164,7 +2182,7 @@ dependencies = [ "http", "http-body", "httparse", - "itoa 1.0.15", + "itoa", "pin-project-lite", "smallvec", "tokio", @@ -2535,12 +2553,6 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.15" @@ -2643,15 +2655,14 @@ dependencies = [ [[package]] name = "kuchikiki" -version = "0.8.2" +version = "0.8.8-speedreader" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ - "cssparser 0.27.2", - "html5ever 0.26.0", - "indexmap 1.9.3", - "matches", - "selectors 0.22.0", + "cssparser 0.29.6", + "html5ever", + "indexmap 2.9.0", + "selectors 0.24.0", ] [[package]] @@ -2724,6 +2735,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.9.0", "libc", + "redox_syscall", ] [[package]] @@ -2793,20 +2805,6 @@ dependencies = [ "libc", ] -[[package]] -name = "markup5ever" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" -dependencies = [ - "log", - "phf 0.10.1", - "phf_codegen 0.10.0", - "string_cache", - "string_cache_codegen", - "tendril", -] - [[package]] name = "markup5ever" version = "0.14.1" @@ -2875,6 +2873,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "minisign-verify" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e856fdd13623a2f5f2f54676a4ee49502a96a80ef4a62bcedd23d52427c44d43" + [[package]] name = "miniz_oxide" version = "0.8.8" @@ -2898,9 +2902,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de14a9b5d569ca68d7c891d613b390cf5ab4f851c77aaa2f9e435555d3d9492" +checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" dependencies = [ "crossbeam-channel", "dpi", @@ -3180,9 +3184,9 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5906f93257178e2f7ae069efb89fbd6ee94f0592740b5f8a1512ca498814d0fb" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ "bitflags 2.9.0", "block2 0.6.1", @@ -3194,7 +3198,7 @@ dependencies = [ "objc2-core-graphics", "objc2-core-image", "objc2-foundation 0.3.1", - "objc2-quartz-core 0.3.0", + "objc2-quartz-core 0.3.1", ] [[package]] @@ -3214,9 +3218,9 @@ dependencies = [ [[package]] name = "objc2-cloud-kit" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1948a9be5f469deadbd6bcb86ad7ff9e47b4f632380139722f7d9840c0d42c" +checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" dependencies = [ "bitflags 2.9.0", "objc2 0.6.1", @@ -3247,9 +3251,9 @@ dependencies = [ [[package]] name = "objc2-core-data" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f860f8e841f6d32f754836f51e6bc7777cd7e7053cf18528233f6811d3eceb4" +checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" dependencies = [ "bitflags 2.9.0", "objc2 0.6.1", @@ -3269,11 +3273,12 @@ dependencies = [ [[package]] name = "objc2-core-graphics" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dca602628b65356b6513290a21a6405b4d4027b8b250f0b98dddbb28b7de02" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" dependencies = [ "bitflags 2.9.0", + "dispatch2 0.3.0", "objc2 0.6.1", "objc2-core-foundation", "objc2-io-surface", @@ -3281,9 +3286,9 @@ dependencies = [ [[package]] name = "objc2-core-image" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffa6bea72bf42c78b0b34e89c0bafac877d5f80bf91e159a5d96ea7f693ca56" +checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" dependencies = [ "objc2 0.6.1", "objc2-foundation 0.3.1", @@ -3331,9 +3336,9 @@ dependencies = [ [[package]] name = "objc2-io-surface" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161a8b87e32610086e1a7a9e9ec39f84459db7b3a0881c1f16ca5a2605581c19" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" dependencies = [ "bitflags 2.9.0", "objc2 0.6.1", @@ -3352,6 +3357,18 @@ dependencies = [ "objc2-foundation 0.2.2", ] +[[package]] +name = "objc2-osa-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26bb88504b5a050dbba515d2414607bf5e57dd56b107bc5f0351197a3e7bdc5d" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-app-kit", + "objc2-foundation 0.3.1", +] + [[package]] name = "objc2-quartz-core" version = "0.2.2" @@ -3367,9 +3384,9 @@ dependencies = [ [[package]] name = "objc2-quartz-core" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb3794501bb1bee12f08dcad8c61f2a5875791ad1c6f47faa71a0f033f20071" +checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" dependencies = [ "bitflags 2.9.0", "objc2 0.6.1", @@ -3515,6 +3532,20 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "osakit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b" +dependencies = [ + "objc2 0.6.1", + "objc2-foundation 0.3.1", + "objc2-osa-kit", + "serde", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "pango" version = "0.18.3" @@ -3618,9 +3649,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ - "phf_macros 0.8.0", "phf_shared 0.8.0", - "proc-macro-hack", ] [[package]] @@ -3629,7 +3658,9 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ + "phf_macros 0.10.0", "phf_shared 0.10.0", + "proc-macro-hack", ] [[package]] @@ -3652,16 +3683,6 @@ dependencies = [ "phf_shared 0.8.0", ] -[[package]] -name = "phf_codegen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - [[package]] name = "phf_codegen" version = "0.11.3" @@ -3704,12 +3725,12 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro-hack", "proc-macro2", "quote", @@ -4506,7 +4527,7 @@ dependencies = [ "cssparser 0.34.0", "ego-tree", "getopts", - "html5ever 0.29.1", + "html5ever", "precomputed-hash", "selectors 0.26.0", "tendril", @@ -4569,22 +4590,20 @@ dependencies = [ [[package]] name = "selectors" -version = "0.22.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" dependencies = [ "bitflags 1.3.2", - "cssparser 0.27.2", + "cssparser 0.29.6", "derive_more", "fxhash", "log", - "matches", "phf 0.8.0", "phf_codegen 0.8.0", "precomputed-hash", - "servo_arc 0.1.1", + "servo_arc 0.2.0", "smallvec", - "thin-slice", ] [[package]] @@ -4663,7 +4682,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "itoa 1.0.15", + "itoa", "memchr", "ryu", "serde", @@ -4696,7 +4715,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.15", + "itoa", "ryu", "serde", ] @@ -4755,9 +4774,9 @@ dependencies = [ [[package]] name = "servo_arc" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" dependencies = [ "nodrop", "stable_deref_trait", @@ -5190,9 +5209,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e59c1f38e657351a2e822eadf40d6a2ad4627b9c25557bc1180ec1b3295ef82" +checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" dependencies = [ "bitflags 2.9.0", "core-foundation 0.10.0", @@ -5238,6 +5257,17 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "target-lexicon" version = "0.12.16" @@ -5246,17 +5276,16 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.5.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7b0bc1aec81bda6bc455ea98fcaed26b3c98c1648c627ad6ff1c704e8bf8cbc" +checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" dependencies = [ "anyhow", "bytes", "dirs", "dunce", "embed_plist", - "futures-util", - "getrandom 0.2.15", + "getrandom 0.3.2", "glob", "gtk", "heck 0.5.0", @@ -5299,9 +5328,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a0350f0df1db385ca5c02888a83e0e66655c245b7443db8b78a70da7d7f8fc" +checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" dependencies = [ "anyhow", "cargo_toml", @@ -5321,9 +5350,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93f035551bf7b11b3f51ad9bc231ebbe5e085565527991c16cf326aa38cdf47" +checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" dependencies = [ "base64 0.22.1", "brotli", @@ -5348,9 +5377,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.2.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db4df25e2d9d45de0c4c910da61cd5500190da14ae4830749fee3466dddd112" +checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -5362,9 +5391,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a5ebe6a610d1b78a94650896e6f7c9796323f408800cef436e0fa0539de601" +checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" dependencies = [ "anyhow", "glob", @@ -5473,6 +5502,16 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7461c622a5ea00eb9cd9f7a08dbd3bf79484499fd5c21aa2964677f64ca651ab" +dependencies = [ + "tauri", + "tauri-plugin", +] + [[package]] name = "tauri-plugin-store" version = "2.2.0" @@ -5489,11 +5528,43 @@ dependencies = [ "tracing", ] +[[package]] +name = "tauri-plugin-updater" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27cbc31740f4d507712550694749572ec0e43bdd66992db7599b89fbfd6b167b" +dependencies = [ + "base64 0.22.1", + "dirs", + "flate2", + "futures-util", + "http", + "infer", + "log", + "minisign-verify", + "osakit", + "percent-encoding", + "reqwest", + "semver", + "serde", + "serde_json", + "tar", + "tauri", + "tauri-plugin", + "tempfile", + "thiserror 2.0.12", + "time", + "tokio", + "url", + "windows-sys 0.60.2", + "zip", +] + [[package]] name = "tauri-runtime" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f004905d549854069e6774533d742b03cacfd6f03deb08940a8677586cbe39" +checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" dependencies = [ "cookie", "dpi", @@ -5513,9 +5584,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.6.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85d056f4d4b014fe874814034f3416d57114b617a493a4fe552580851a3f3a2" +checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" dependencies = [ "gtk", "http", @@ -5540,9 +5611,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2900399c239a471bcff7f15c4399eb1a8c4fe511ba2853e07c996d771a5e0a4" +checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" dependencies = [ "anyhow", "brotli", @@ -5550,7 +5621,7 @@ dependencies = [ "ctor", "dunce", "glob", - "html5ever 0.26.0", + "html5ever", "http", "infer", "json-patch", @@ -5622,12 +5693,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "thin-slice" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" - [[package]] name = "thiserror" version = "1.0.69" @@ -5686,7 +5751,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", - "itoa 1.0.15", + "itoa", "num-conv", "powerfmt", "serde", @@ -5969,9 +6034,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7eee98ec5c90daf179d55c20a49d8c0d043054ce7c26336c09a24d31f14fa0" +checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" dependencies = [ "crossbeam-channel", "dirs", @@ -6235,7 +6300,9 @@ dependencies = [ "tauri-plugin-fs", "tauri-plugin-notification", "tauri-plugin-opener", + "tauri-plugin-process", "tauri-plugin-store", + "tauri-plugin-updater", "tokio", "whisper-rs", ] @@ -6550,9 +6617,9 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.37.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b542b5cfbd9618c46c2784e4d41ba218c336ac70d44c55e47b251033e7d85601" +checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" dependencies = [ "webview2-com-macros", "webview2-com-sys", @@ -6575,9 +6642,9 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.37.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae2d11c4a686e4409659d7891791254cf9286d3cfe0eef54df1523533d22295" +checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ "thiserror 2.0.12", "windows 0.61.1", @@ -6846,6 +6913,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -6885,13 +6961,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows-version" version = "0.1.4" @@ -6919,6 +7011,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -6937,6 +7035,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -6955,12 +7059,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -6979,6 +7095,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -6997,6 +7119,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -7015,6 +7143,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -7033,6 +7167,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.5.40" @@ -7103,9 +7243,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.51.2" +version = "0.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886a0a9d2a94fd90cfa1d929629b79cfefb1546e2c7430c63a47f0664c0e4e2" +checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" dependencies = [ "base64 0.22.1", "block2 0.6.1", @@ -7115,7 +7255,7 @@ dependencies = [ "dunce", "gdkx11", "gtk", - "html5ever 0.26.0", + "html5ever", "http", "javascriptcore-rs", "jni", @@ -7183,6 +7323,16 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" +[[package]] +name = "xattr" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" +dependencies = [ + "libc", + "rustix 1.0.5", +] + [[package]] name = "xdg-home" version = "1.3.0" @@ -7350,6 +7500,18 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "zip" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aed4ac33e8eb078c89e6cbb1d5c4c7703ec6d299fc3e7c3695af8f8b423468b" +dependencies = [ + "arbitrary", + "crc32fast", + "indexmap 2.9.0", + "memchr", +] + [[package]] name = "zune-core" version = "0.4.12" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 1cc74378..a1530841 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -53,6 +53,7 @@ cpal = "0.16.0" hound = "3.5.1" rubato = "0.16.2" symphonia = { version = "0.5.4", features = ["mp3", "wav", "flac", "pcm"] } +tauri-plugin-process = "2.3.0" # Android-only dependencies [target.'cfg(target_os = "android")'.dependencies] @@ -73,3 +74,6 @@ whisper-rs = { version = "0.13.2", features = ["vulkan"], optional = true } # For other platforms (not Android, macOS, Windows, or Linux) [target.'cfg(all(not(target_os = "android"), not(target_os = "macos"), not(windows), not(target_os = "linux")))'.dependencies] whisper-rs = { version = "0.13.2", optional = true } + +[target.'cfg(any(target_os = "macos", windows, target_os = "linux"))'.dependencies] +tauri-plugin-updater = "2.9.0" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 39cd3b0e..1a50a713 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -14,6 +14,8 @@ "dialog:default", "fs:default", "clipboard-manager:default", - "clipboard-manager:allow-read-image" + "clipboard-manager:allow-read-image", + "updater:default", + "process:default" ] } \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 6df1513d..b06a0f7f 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -2557,6 +2557,11 @@ pub fn run() { .plugin(tauri_plugin_notification::init()) .plugin(tauri_plugin_store::Builder::new().build()) .setup(|app| { + #[cfg(desktop)] + app.handle().plugin(tauri_plugin_updater::Builder::new().build())?; + #[cfg(desktop)] + app.handle().plugin(tauri_plugin_process::init())?; + let handle = app.app_handle().clone(); // Check if we need to migrate files diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 1d5eb9e1..3a026316 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -29,6 +29,7 @@ "bundle": { "active": true, "targets": "all", + "createUpdaterArtifacts": true, "category": "SocialNetworking", "macOS": { "entitlements": "./Entitlements.plist", @@ -58,5 +59,16 @@ "icons/icon.icns", "icons/icon.ico" ] + }, + "plugins": { + "updater": { + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDQwRUU4N0Y0RTFEN0VCRTQKUldUazY5Zmg5SWZ1UUk0bEhjRlc2cWZsRWJpb3BSNXVjaFBKYzdmZzF4VENuREkrbEV4aFoxTXgK", + "endpoints": [ + "https://github.com/VectorPrivacy/Vector/releases/latest/download/latest.json" + ], + "windows": { + "installMode": "passive" + } + } } } diff --git a/src/index.html b/src/index.html index bfc1e4fb..2b235303 100644 --- a/src/index.html +++ b/src/index.html @@ -11,6 +11,7 @@ + @@ -228,6 +229,29 @@

Network

+ + + +
+
+

Updates

+
+

Current Version: Loading...

+ + + + + + + + + +

diff --git a/src/js/updater.js b/src/js/updater.js new file mode 100644 index 00000000..de51397c --- /dev/null +++ b/src/js/updater.js @@ -0,0 +1,263 @@ +// Updater functionality for Vector +const { check } = window.__TAURI__.updater; +const { relaunch } = window.__TAURI__.process; + +// Store update state +let currentUpdate = null; +let updateState = 'idle'; // idle, checking, available, downloading, ready + +// Get current version +async function getCurrentVersion() { + try { + return await window.__TAURI__.app.getVersion(); + } catch (error) { + console.error('Error getting version:', error); + return 'Unknown'; + } +} + +// Initialize updater UI elements +function initializeUpdaterUI() { + const updateSection = document.getElementById('settings-updates'); + if (!updateSection) return; + + // Update current version display + getCurrentVersion().then(version => { + const versionElement = document.getElementById('current-version'); + if (versionElement) { + versionElement.textContent = `v${version}`; + } + }); + + // Add click handler for check updates button + const checkButton = document.getElementById('check-updates-btn'); + if (checkButton) { + checkButton.addEventListener('click', () => checkForUpdates(false)); + } + + // Add click handler for download button + const downloadButton = document.getElementById('download-update-btn'); + if (downloadButton) { + downloadButton.addEventListener('click', downloadUpdate); + } + + // Add click handler for restart button + const restartButton = document.getElementById('restart-update-btn'); + if (restartButton) { + restartButton.addEventListener('click', () => relaunch()); + } +} + +// Update UI state +function updateUI(state, message = '', progress = 0) { + updateState = state; + + const statusText = document.getElementById('update-status-text'); + const progressContainer = document.getElementById('update-progress-container'); + const progressBar = document.getElementById('update-progress-bar'); + const progressText = document.getElementById('update-progress-text'); + const checkButton = document.getElementById('check-updates-btn'); + const downloadButton = document.getElementById('download-update-btn'); + const restartButton = document.getElementById('restart-update-btn'); + + // Hide all action buttons by default + if (downloadButton) downloadButton.style.display = 'none'; + if (restartButton) restartButton.style.display = 'none'; + + switch (state) { + case 'idle': + if (statusText) { + statusText.textContent = message || 'Click to check for updates'; + statusText.style.display = 'none'; + } + if (progressContainer) progressContainer.style.display = 'none'; + if (checkButton) { + checkButton.disabled = false; + checkButton.textContent = 'Check for Updates'; + } + break; + + case 'checking': + if (statusText) { + statusText.textContent = 'Checking for updates...'; + statusText.style.display = 'block'; + } + if (progressContainer) progressContainer.style.display = 'none'; + if (checkButton) { + checkButton.disabled = true; + checkButton.textContent = 'Checking...'; + } + break; + + case 'available': + if (statusText) { + statusText.textContent = message; + statusText.style.display = 'block'; + } + if (progressContainer) progressContainer.style.display = 'none'; + if (checkButton) { + checkButton.disabled = false; + checkButton.textContent = 'Check for Updates'; + } + if (downloadButton) downloadButton.style.display = 'block'; + break; + + case 'downloading': + if (statusText) { + statusText.textContent = 'Downloading update...'; + statusText.style.display = 'block'; + } + if (progressContainer) progressContainer.style.display = 'block'; + if (progressBar) progressBar.style.width = `${progress}%`; + if (progressText) progressText.textContent = `${progress}%`; + if (checkButton) checkButton.disabled = true; + if (downloadButton) downloadButton.style.display = 'none'; + break; + + case 'ready': + if (statusText) { + statusText.textContent = 'Update ready! Restart to apply.'; + statusText.style.display = 'block'; + } + if (progressContainer) progressContainer.style.display = 'none'; + if (checkButton) { + checkButton.disabled = false; + checkButton.textContent = 'Check for Updates'; + } + if (restartButton) restartButton.style.display = 'block'; + break; + + case 'error': + if (statusText) { + statusText.textContent = message; + statusText.style.display = 'block'; + statusText.style.color = '#ff5252'; + } + if (progressContainer) progressContainer.style.display = 'none'; + if (checkButton) { + checkButton.disabled = false; + checkButton.textContent = 'Check for Updates'; + } + setTimeout(() => { + if (statusText) statusText.style.color = ''; + updateUI('idle'); + }, 5000); + break; + + case 'no-updates': + if (statusText) { + statusText.textContent = 'You are running the latest version'; + statusText.style.display = 'block'; + statusText.style.color = '#59fcb3'; + } + if (progressContainer) progressContainer.style.display = 'none'; + if (checkButton) { + checkButton.disabled = false; + checkButton.textContent = 'Check for Updates'; + } + setTimeout(() => { + if (statusText) statusText.style.color = ''; + updateUI('idle'); + }, 3000); + break; + } +} + +// Check for updates +async function checkForUpdates(silent = false) { + if (updateState === 'checking' || updateState === 'downloading') return; + + if (!silent) { + updateUI('checking'); + } + + try { + const update = await check(); + + if (!update) { + if (!silent) { + updateUI('no-updates'); + } + return false; + } + + // Found an update + currentUpdate = update; + console.log(`Update available: ${update.version} from ${update.date}`); + + if (!silent) { + const message = `Version ${update.version} is available`; + updateUI('available', message); + } + + return true; + } catch (error) { + console.error('Error checking for updates:', error); + if (!silent) { + updateUI('error', 'Failed to check for updates'); + } + return false; + } +} + +// Download update +async function downloadUpdate() { + if (!currentUpdate || updateState === 'downloading') return; + + updateUI('downloading', '', 0); + + try { + let downloaded = 0; + let contentLength = 0; + + await currentUpdate.downloadAndInstall((event) => { + switch (event.event) { + case 'Started': + contentLength = event.data.contentLength || 0; + console.log(`Started downloading ${contentLength} bytes`); + break; + + case 'Progress': + downloaded += event.data.chunkLength; + const percentage = contentLength > 0 ? Math.round((downloaded / contentLength) * 100) : 0; + console.log(`Downloaded ${downloaded} of ${contentLength} bytes (${percentage}%)`); + updateUI('downloading', '', percentage); + break; + + case 'Finished': + console.log('Download finished'); + break; + } + }); + + console.log('Update installed successfully'); + updateUI('ready'); + + } catch (error) { + console.error('Error installing update:', error); + updateUI('error', 'Failed to download update'); + } +} + +// Auto-check for updates on app start (silent check) +function initializeUpdater() { + // Initialize UI when DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeUpdaterUI); + } else { + initializeUpdaterUI(); + } + + // Check for updates 10 seconds after app start + setTimeout(() => { + checkForUpdates(true); + }, 10000); + + // Check for updates every 4 hours + setInterval(() => { + checkForUpdates(true); + }, 4 * 60 * 60 * 1000); +} + +// Make initializeUpdater available globally +window.initializeUpdater = initializeUpdater; diff --git a/src/main.js b/src/main.js index 496d080d..35619666 100644 --- a/src/main.js +++ b/src/main.js @@ -1252,6 +1252,11 @@ async function login() { // Render the initial relay list renderRelayList(); + + // Initialize the updater + if (window.initializeUpdater) { + window.initializeUpdater(); + } }, { once: true }); }); @@ -3032,14 +3037,14 @@ window.addEventListener("DOMContentLoaded", async () => { domSettingsBtn.onclick = openSettings; domLoginAccountCreationBtn.onclick = async () => { try { - const { public, private } = await invoke("create_account"); - strPubkey = public; + const { public: pubKey, private: privKey } = await invoke("create_account"); + strPubkey = pubKey; // Connect to Nostr network early for invite validation await invoke("connect"); // Open the Invite Flow for new accounts - openInviteFlow(private); + openInviteFlow(privKey); } catch (e) { // Display the backend error popupConfirm(e, '', true, '', 'vector_warning.svg'); @@ -3052,8 +3057,8 @@ window.addEventListener("DOMContentLoaded", async () => { domLoginBtn.onclick = async () => { // Import and derive our keys try { - const { public, private } = await invoke("login", { importKey: domLoginInput.value.trim() }); - strPubkey = public; + const { public: pubKey, private: privKey } = await invoke("login", { importKey: domLoginInput.value.trim() }); + strPubkey = pubKey; // Connect to Nostr await invoke("connect"); @@ -3061,10 +3066,10 @@ window.addEventListener("DOMContentLoaded", async () => { // Check if user has an existing account (has encrypted private key) if (await hasKey()) { // Existing user - skip invite flow - openEncryptionFlow(private); + openEncryptionFlow(privKey); } else { // New user logging in - show invite flow - openInviteFlow(private); + openInviteFlow(privKey); } } catch (e) { // Display the backend error diff --git a/src/styles.css b/src/styles.css index 69a5e2dd..91be2299 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1562,6 +1562,81 @@ select:focus::-ms-value { transform: translateY(-50%) scale(1.1); } +/* Update Settings Section Styles */ +.update-info { + text-align: center; + padding: 20px 0; +} + +.update-info p { + margin-bottom: 15px; + font-size: 16px; +} + +#current-version { + color: #59fcb3; + font-weight: 600; +} + +#check-updates-btn { + margin: 10px auto; + padding: 12px 24px; + background: rgba(89, 252, 179, 0.1); + border: 1px solid rgba(89, 252, 179, 0.3); + color: #59fcb3; + font-weight: 600; + transition: all 0.3s ease; +} + +#check-updates-btn:hover:not(:disabled) { + background: rgba(89, 252, 179, 0.2); + border-color: rgba(89, 252, 179, 0.5); + transform: translateY(-1px); +} + +#check-updates-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; +} + +#update-status-text { + font-size: 14px; + color: rgba(255, 255, 255, 0.8); + margin-top: 10px; + transition: color 0.3s ease; +} + +#update-progress-container { + margin: 20px auto; + max-width: 300px; +} + +#update-progress-bar { + background: linear-gradient(90deg, #59fcb3 0%, #2b976c 100%); + box-shadow: 0 0 10px rgba(89, 252, 179, 0.4); +} + +#download-update-btn, +#restart-update-btn { + color: #000; + font-weight: bold; + border: none; + box-shadow: 0 4px 12px rgba(89, 252, 179, 0.3); + transition: all 0.3s ease; +} + +#download-update-btn:hover, +#restart-update-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(89, 252, 179, 0.5); +} + +#download-update-btn:active, +#restart-update-btn:active { + transform: translateY(0); +} + /* Adjust select to accommodate delete button */ #whisper-model { padding-right: 30px; @@ -1569,7 +1644,7 @@ select:focus::-ms-value { -webkit-appearance: none; } -/* Fix to not get white border in model selection dropdown*/ +/* Fix to not get white border in model selection dropdown */ #whisper-model:focus, #whisper-model:active, #whisper-model:focus-visible { From ee44aeada199d218a17dfba1ad7bb0d8f21abee7 Mon Sep 17 00:00:00 2001 From: JSKitty Date: Tue, 22 Jul 2025 01:05:15 +0100 Subject: [PATCH 3/3] improve: polished update UX In-app changelog, Setting notification icon on pending updates, and a beautified Updates section - all of the UI and functionality has had a general overhaul to be production-ready. --- src-tauri/tauri.conf.json | 3 ++ src/index.html | 14 +++-- src/js/updater.js | 107 ++++++++++++++++++++++++-------------- src/main.js | 18 +++++-- src/styles.css | 34 +++++++++++- 5 files changed, 130 insertions(+), 46 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 3a026316..2d9ff73c 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -68,6 +68,9 @@ ], "windows": { "installMode": "passive" + }, + "macos": { + "minimumSystemVersion": "10.15" } } } diff --git a/src/index.html b/src/index.html index 2b235303..7ee34d1b 100644 --- a/src/index.html +++ b/src/index.html @@ -236,7 +236,15 @@

Network


Updates

-

Current Version: Loading...

+

Current Version: Loading...

+ + + + + @@ -249,7 +257,6 @@

Updates

-
@@ -305,6 +312,7 @@

Your Invite Code