From f646684f4d97baed215515dd5a4403d4d38bc888 Mon Sep 17 00:00:00 2001 From: tk103331 Date: Thu, 5 Jan 2023 10:39:46 +0800 Subject: [PATCH] auto update policy --- src-tauri/src/app/cmd.rs | 4 ++-- src-tauri/src/app/menu.rs | 46 +++++++++++++++++++++++++++++++++++++- src-tauri/src/app/setup.rs | 6 ++--- src-tauri/src/conf.rs | 10 ++++----- src-tauri/src/utils.rs | 37 ++++++++++++++++++++++++++---- src-tauri/tauri.conf.json | 2 +- src/layout/index.tsx | 2 +- src/view/General.tsx | 19 ++++++++++++---- 8 files changed, 105 insertions(+), 21 deletions(-) diff --git a/src-tauri/src/app/cmd.rs b/src-tauri/src/app/cmd.rs index 28efd05..677827b 100644 --- a/src-tauri/src/app/cmd.rs +++ b/src-tauri/src/app/cmd.rs @@ -44,8 +44,8 @@ pub fn reset_chat_conf() -> ChatConfJson { } #[command] -pub fn run_check_update(app: AppHandle) { - utils::run_check_update(app).unwrap(); +pub fn run_check_update(app: AppHandle, silent: bool) { + utils::run_check_update(app, silent).unwrap(); } #[command] diff --git a/src-tauri/src/app/menu.rs b/src-tauri/src/app/menu.rs index a80fee2..b5ef78d 100644 --- a/src-tauri/src/app/menu.rs +++ b/src-tauri/src/app/menu.rs @@ -47,6 +47,10 @@ pub fn init() -> Menu { let is_dark = chat_conf.theme == "Dark"; let is_system = chat_conf.theme == "System"; + let update_prompt = CustomMenuItem::new("update_prompt".to_string(), "Prompt"); + let update_silent = CustomMenuItem::new("update_silent".to_string(), "Silent"); + let _update_disable = CustomMenuItem::new("update_disable".to_string(), "Disable"); + let stay_on_top_menu = if chat_conf.stay_on_top { stay_on_top.selected() } else { @@ -87,6 +91,26 @@ pub fn init() -> Menu { }), ) .into(), + Submenu::new( + "Auto Update", + Menu::new() + .add_item(if chat_conf.auto_update == "Prompt" { + update_prompt.selected() + } else { + update_prompt + }) + .add_item(if chat_conf.auto_update == "Silent" { + update_silent.selected() + } else { + update_silent + }) + // .add_item(if chat_conf.auto_update == "Disable" { + // update_disable.selected() + // } else { + // update_disable + // }) + , + ).into(), stay_on_top_menu.into(), #[cfg(target_os = "macos")] titlebar_menu.into(), @@ -204,7 +228,7 @@ pub fn menu_handler(event: WindowMenuEvent) { ); } "check_update" => { - utils::run_check_update(app).unwrap(); + utils::run_check_update(app, false).unwrap(); } // Preferences "control_center" => window::control_window(&app), @@ -248,6 +272,26 @@ pub fn menu_handler(event: WindowMenuEvent) { }; ChatConfJson::amend(&serde_json::json!({ "theme": theme }), Some(app)).unwrap(); } + "update_prompt" | "update_silent" | "update_disable" => { + for id in ["update_prompt" , "update_silent" , "update_disable"] { + menu_handle.get_item(id).set_selected(false).unwrap(); + } + let auto_update = match menu_id { + "update_silent" => { + menu_handle.get_item("update_silent").set_selected(true).unwrap(); + "Silent" + }, + "update_disable" => { + menu_handle.get_item("update_disable").set_selected(true).unwrap(); + "Disable" + }, + _ => { + menu_handle.get_item("update_prompt").set_selected(true).unwrap(); + "Prompt" + }, + }; + ChatConfJson::amend(&serde_json::json!({ "auto_update": auto_update }), None).unwrap(); + } "stay_on_top" => { let mut stay_on_top = state.stay_on_top.lock().unwrap(); *stay_on_top = !*stay_on_top; diff --git a/src-tauri/src/app/setup.rs b/src-tauri/src/app/setup.rs index b926a9f..8f37981 100644 --- a/src-tauri/src/app/setup.rs +++ b/src-tauri/src/app/setup.rs @@ -89,10 +89,10 @@ pub fn init(app: &mut App) -> std::result::Result<(), Box .unwrap(); }); } - // auto_check_update - if chat_conf.auto_check_update { + // auto_update + if chat_conf.auto_update != "Disable" { let app = app.handle(); - utils::run_check_update(app).unwrap(); + utils::run_check_update(app, chat_conf.auto_update == "Silent").unwrap(); } Ok(()) diff --git a/src-tauri/src/conf.rs b/src-tauri/src/conf.rs index 3b3708a..f71a188 100644 --- a/src-tauri/src/conf.rs +++ b/src-tauri/src/conf.rs @@ -18,7 +18,7 @@ pub const GITHUB_PROMPTS_CSV_URL: &str = "https://raw.githubusercontent.com/f/awesome-chatgpt-prompts/main/prompts.csv"; pub const DEFAULT_CHAT_CONF: &str = r#"{ "stay_on_top": false, - "auto_check_update": true, + "auto_update": "Prompt", "theme": "Light", "titlebar": true, "global_shortcut": "", @@ -30,7 +30,7 @@ pub const DEFAULT_CHAT_CONF: &str = r#"{ }"#; pub const DEFAULT_CHAT_CONF_MAC: &str = r#"{ "stay_on_top": false, - "auto_check_update": true, + "auto_update": "Prompt", "theme": "Light", "titlebar": false, "global_shortcut": "", @@ -59,10 +59,10 @@ pub struct ChatConfJson { pub titlebar: bool, pub hide_dock_icon: bool, - // macOS and Windows + // macOS and Windows, Light/Dark/System pub theme: String, - - pub auto_check_update: bool, + // auto update policy, Prompt/Silent/Disable + pub auto_update: String, pub stay_on_top: bool, pub default_origin: String, pub origin: String, diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs index cf53456..a23c668 100644 --- a/src-tauri/src/utils.rs +++ b/src-tauri/src/utils.rs @@ -130,14 +130,20 @@ pub async fn get_data( } } -pub fn run_check_update(app: AppHandle) -> Result<()> { +pub fn run_check_update(app: AppHandle, silent: bool) -> Result<()> { tauri::async_runtime::spawn(async move { let result = app.updater().check().await; let update_resp = result.unwrap(); if update_resp.is_update_available() { - tauri::async_runtime::spawn(async move { - prompt_for_install(app, update_resp).await.unwrap(); - }); + if silent { + tauri::async_runtime::spawn(async move { + silent_install(app, update_resp).await.unwrap(); + }); + } else { + tauri::async_runtime::spawn(async move { + prompt_for_install(app, update_resp).await.unwrap(); + }); + } } }); Ok(()) @@ -191,3 +197,26 @@ Release Notes: Ok(()) } + +pub async fn silent_install(app: AppHandle, update: UpdateResponse) -> Result<()> { + let windows = app.windows(); + let parent_window = windows.values().next(); + + // Launch updater download process + // macOS we display the `Ready to restart dialog` asking to restart + // Windows is closing the current App and launch the downloaded MSI when ready (the process stop here) + // Linux we replace the AppImage by launching a new install, it start a new AppImage instance, so we're closing the previous. (the process stop here) + update.download_and_install().await?; + + // Ask user if we need to restart the application + let should_exit = tauri::api::dialog::blocking::ask( + parent_window, + "Ready to Restart", + "The silent installation was successful, do you want to restart the application now?", + ); + if should_exit { + app.restart(); + } + + Ok(()) +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index c6611f7..406486b 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -68,7 +68,7 @@ }, "updater": { "active": true, - "dialog": true, + "dialog": false, "endpoints": [ "https://lencx.github.io/ChatGPT/install.json" ], diff --git a/src/layout/index.tsx b/src/layout/index.tsx index 667792a..82cf74a 100644 --- a/src/layout/index.tsx +++ b/src/layout/index.tsx @@ -23,7 +23,7 @@ const ChatLayout: FC = ({ children }) => { const go = useNavigate(); const checkAppUpdate = async () => { - await invoke('run_check_update'); + await invoke('run_check_update', {silent: false}); } return ( diff --git a/src/view/General.tsx b/src/view/General.tsx index 084c947..1291baf 100644 --- a/src/view/General.tsx +++ b/src/view/General.tsx @@ -10,10 +10,17 @@ import { clone, omit, isEqual } from 'lodash'; import useInit from '@/hooks/useInit'; import { DISABLE_AUTO_COMPLETE, chatRoot } from '@/utils'; -const CheckUpdateLabel = () => { +const AutoUpdateLabel = () => { return ( - Auto Check Update + Auto Update +
Auto Update Policy
+ Prompt: prompt to install
+ Silent: install silently
+ {/*Disable: disable auto update
*/} + + )}>
) } @@ -121,8 +128,12 @@ export default function General() { - } name="auto_check_update" valuePropName="checked"> - + } name="auto_update"> + + Prompt + Silent + {/*Disable*/} + } name="global_shortcut">