From a453bd35e5dede6f74a6c4e7cd4ef09e89f58196 Mon Sep 17 00:00:00 2001 From: reya <123083837+reyamir@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:12:30 +0700 Subject: [PATCH] feat: add updater --- package.json | 2 + pnpm-lock.yaml | 20 ++++++ src-tauri/Cargo.lock | 140 +++++++++++++++++++++++++++++++++++++- src-tauri/Cargo.toml | 2 + src-tauri/src/main.rs | 2 + src-tauri/tauri.conf.json | 36 +++++++++- src/commons.ts | 40 +++++++++++ src/routes/index.tsx | 5 ++ 8 files changed, 243 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 4c4f6fc..40cfaa8 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,9 @@ "@tauri-apps/plugin-clipboard-manager": "2.1.0-beta.5", "@tauri-apps/plugin-dialog": "2.0.0-beta.7", "@tauri-apps/plugin-os": "2.0.0-beta.7", + "@tauri-apps/plugin-process": "2.0.0-beta.7", "@tauri-apps/plugin-shell": "2.0.0-beta.8", + "@tauri-apps/plugin-updater": "2.0.0-beta.7", "dayjs": "^1.11.12", "lru-cache": "^11.0.0", "minidenticons": "^4.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f7b4ab..a51b74b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,9 +44,15 @@ importers: '@tauri-apps/plugin-os': specifier: 2.0.0-beta.7 version: 2.0.0-beta.7 + '@tauri-apps/plugin-process': + specifier: 2.0.0-beta.7 + version: 2.0.0-beta.7 '@tauri-apps/plugin-shell': specifier: 2.0.0-beta.8 version: 2.0.0-beta.8 + '@tauri-apps/plugin-updater': + specifier: 2.0.0-beta.7 + version: 2.0.0-beta.7 dayjs: specifier: ^1.11.12 version: 1.11.12 @@ -913,9 +919,15 @@ packages: '@tauri-apps/plugin-os@2.0.0-beta.7': resolution: {integrity: sha512-CHo09ecxUU0NFkAqctXeQzdaXw02EXulqcaZnbjrBfRJ2ulmGq7zaUCsHihfcqWcdnmNwmP9Wh/gyznMc1JF9Q==} + '@tauri-apps/plugin-process@2.0.0-beta.7': + resolution: {integrity: sha512-iK4HYnzeyqAZE5HAKd0mDI7ekYXUqA9azjA9AgL4LscOEHma1XGEP0DlcHn+RrXIvVbI4LwCol9DSNNoIrB0+w==} + '@tauri-apps/plugin-shell@2.0.0-beta.8': resolution: {integrity: sha512-rFXI6MvsCdSGbuKbDu/NaOePREb9YTVTdeugHdvvljnKWW3dvmThBb2h/8Hxj+Z7Cd8MUoRxPeJWUZbPbJ2Imw==} + '@tauri-apps/plugin-updater@2.0.0-beta.7': + resolution: {integrity: sha512-wnIVPPMuD33Wf8Q1CyvAQLAT2sVH0sefTNrYF5ITqzUxzeH54MaiVIu+e8/zBaRFcuBpJv7exljLlrcNW47ybQ==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2426,10 +2438,18 @@ snapshots: dependencies: '@tauri-apps/api': 2.0.0-beta.15 + '@tauri-apps/plugin-process@2.0.0-beta.7': + dependencies: + '@tauri-apps/api': 2.0.0-beta.15 + '@tauri-apps/plugin-shell@2.0.0-beta.8': dependencies: '@tauri-apps/api': 2.0.0-beta.15 + '@tauri-apps/plugin-updater@2.0.0-beta.7': + dependencies: + '@tauri-apps/api': 2.0.0-beta.15 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.25.0 diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index fe9cee9..096394c 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -107,6 +107,15 @@ version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arboard" version = "3.4.0" @@ -930,7 +939,9 @@ dependencies = [ "tauri-plugin-dialog", "tauri-plugin-os", "tauri-plugin-prevent-default", + "tauri-plugin-process", "tauri-plugin-shell", + "tauri-plugin-updater", "tauri-specta", ] @@ -1141,6 +1152,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "derive_more" version = "0.99.18" @@ -1234,6 +1256,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "dlopen2" version = "0.7.0" @@ -1458,6 +1491,18 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", +] + [[package]] name = "flatbuffers" version = "23.5.26" @@ -2779,6 +2824,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minisign-verify" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -3405,7 +3456,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.3", "smallvec", "windows-targets 0.52.6", ] @@ -3960,6 +4011,15 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.3" @@ -4636,7 +4696,7 @@ dependencies = [ "objc2-foundation", "objc2-quartz-core", "raw-window-handle 0.6.2", - "redox_syscall", + "redox_syscall 0.5.3", "wasm-bindgen", "web-sys", "windows-sys 0.52.0", @@ -4897,6 +4957,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "tar" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "target-lexicon" version = "0.12.15" @@ -5163,6 +5234,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "tauri-plugin-process" +version = "2.0.0-beta.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96007dd73e62441c7695c864831e600c382f2bf831defa84e8f9aa642f1a19c0" +dependencies = [ + "tauri", + "tauri-plugin", +] + [[package]] name = "tauri-plugin-shell" version = "2.0.0-beta.9" @@ -5184,6 +5265,35 @@ dependencies = [ "tokio", ] +[[package]] +name = "tauri-plugin-updater" +version = "2.0.0-beta.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcd8bad59390a1da0efb4fe82d6c697747925dd8f8cd841d74d21325d4dd36c7" +dependencies = [ + "base64 0.22.1", + "dirs", + "flate2", + "futures-util", + "http 1.1.0", + "infer", + "minisign-verify", + "reqwest", + "semver", + "serde", + "serde_json", + "tar", + "tauri", + "tauri-plugin", + "tempfile", + "thiserror", + "time", + "tokio", + "url", + "windows-sys 0.52.0", + "zip", +] + [[package]] name = "tauri-runtime" version = "2.0.0-beta.20" @@ -6665,6 +6775,17 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + [[package]] name = "xdg-home" version = "1.2.0" @@ -6766,6 +6887,21 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zip" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b895748a3ebcb69b9d38dcfdf21760859a4b0d0b0015277640c2ef4c69640e6f" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "indexmap 2.2.6", + "memchr", + "thiserror", +] + [[package]] name = "zvariant" version = "4.0.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index be77dc9..0f29610 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -28,6 +28,8 @@ tauri-plugin-os = "2.0.0-beta" tauri-plugin-clipboard-manager = "2.0.0-beta" tauri-plugin-dialog = "2.0.0-beta" tauri-plugin-shell = "2.0.0-beta" +tauri-plugin-updater = "2.0.0-beta" +tauri-plugin-process = "2.0.0-beta" tauri-plugin-decorum = "0.1.5" serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 3342812..5e89aa5 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -109,6 +109,8 @@ fn main() { }) .enable_macos_default_menu(false) .plugin(tauri_plugin_prevent_default::init()) + .plugin(tauri_plugin_process::init()) + .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_os::init()) .plugin(tauri_plugin_clipboard_manager::init()) .plugin(tauri_plugin_dialog::init()) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index f3b6687..76c811c 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -33,14 +33,46 @@ } }, "bundle": { - "active": true, + "homepage": "https://lume.nu/coop", + "longDescription": "direct message client for desktop", + "shortDescription": "nostr client", "targets": "all", + "active": true, + "category": "SocialNetworking", "icon": [ "icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico" - ] + ], + "linux": { + "appimage": { + "bundleMediaFramework": true, + "files": {} + }, + "deb": { + "files": {} + }, + "rpm": { + "epoch": 0, + "files": {}, + "release": "1" + } + }, + "macOS": { + "minimumSystemVersion": "10.15" + }, + "createUpdaterArtifacts": true + }, + "plugins": { + "updater": { + "active": true, + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEY2OUJBNzZDOUYwNzREOApSV1RZZFBESmRycHBEMDV0NVZodllibXZNT21YTXBVOG1kRjdpUEpVS1ZkOGVuT295RENrWkpBRAo=", + "endpoints": [ + "https://tauri-updater.coop-updater-service.workers.dev/check/lumehq/coop/{{target}}/{{arch}}/{{current_version}}", + "https://github.com/lumehq/coop/releases/latest/download/latest.json" + ] + } } } diff --git a/src/commons.ts b/src/commons.ts index ffb52d5..c420f17 100644 --- a/src/commons.ts +++ b/src/commons.ts @@ -1,3 +1,6 @@ +import { ask, message } from "@tauri-apps/plugin-dialog"; +import { relaunch } from "@tauri-apps/plugin-process"; +import { check } from "@tauri-apps/plugin-updater"; import { type ClassValue, clsx } from "clsx"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; @@ -88,9 +91,46 @@ export function groupEventByDate(events: NostrEvent[]) { return groups; } +/* export function isEmojiOnly(str: string) { const stringToTest = str.replace(/ /g, ""); const emojiRegex = /^(?:(?:\p{RI}\p{RI}|\p{Emoji}(?:\p{Emoji_Modifier}|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?(?:\u{200D}\p{Emoji}(?:\p{Emoji_Modifier}|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?)*)|[\u{1f900}-\u{1f9ff}\u{2600}-\u{26ff}\u{2700}-\u{27bf}])+$/u; return emojiRegex.test(stringToTest) && Number.isNaN(Number(stringToTest)); } +*/ + +export async function checkForAppUpdates(silent: boolean) { + const update = await check(); + + if (!update) { + if (silent) return; + + await message("You are on the latest version. Stay awesome!", { + title: "No Update Available", + kind: "info", + okLabel: "OK", + }); + + return; + } + + if (update?.available) { + const yes = await ask( + `Update to ${update.version} is available!\n\nRelease notes: ${update.body}`, + { + title: "Update Available", + kind: "info", + okLabel: "Update", + cancelLabel: "Cancel", + }, + ); + + if (yes) { + await update.downloadAndInstall(); + await relaunch(); + } + + return; + } +} diff --git a/src/routes/index.tsx b/src/routes/index.tsx index f258624..a4efcf1 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -1,8 +1,13 @@ import { commands } from "@/commands"; +import { checkForAppUpdates } from "@/commons"; import { createFileRoute, redirect } from "@tanstack/react-router"; export const Route = createFileRoute("/")({ beforeLoad: async () => { + // Check for app updates + // TODO: move this function to rust + await checkForAppUpdates(true); + const accounts = await commands.getAccounts(); if (!accounts.length) {