diff --git a/package.json b/package.json index a3651b0..79f4083 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,15 @@ }, "license": "MIT", "author": "lencx ", - "keywords": ["chatgpt", "app", "desktop", "tauri", "macos", "linux", "windows"], + "keywords": [ + "chatgpt", + "app", + "desktop", + "tauri", + "macos", + "linux", + "windows" + ], "homepage": "https://github.com/lencx/ChatGPT", "bugs": "https://github.com/lencx/ChatGPT/issues", "repository": { diff --git a/src-tauri/src/app/menu.rs b/src-tauri/src/app/menu.rs index 32ccf21..2ddd391 100644 --- a/src-tauri/src/app/menu.rs +++ b/src-tauri/src/app/menu.rs @@ -1,4 +1,5 @@ use crate::{ + app::window, conf::{self, ChatConfJson}, utils, }; @@ -69,6 +70,9 @@ pub fn init(chat_conf: &conf::ChatConfJson, context: &Context) - always_on_top_menu.into(), #[cfg(target_os = "macos")] titlebar_menu.into(), + CustomMenuItem::new("switch_origin".to_string(), "Switch Origin") + .accelerator("CmdOrCtrl+O") + .into(), CustomMenuItem::new("inject_script".to_string(), "Inject Script") .accelerator("CmdOrCtrl+J") .into(), @@ -152,6 +156,10 @@ pub fn menu_handler(event: WindowMenuEvent) { // Preferences "inject_script" => open(&app, script_path), "awesome" => open(&app, conf::AWESOME_URL.to_string()), + "switch_origin" => { + window::origin_window(&app); + // app.get_window("origin").unwrap().show(); + } "titlebar" => { let chat_conf = conf::ChatConfJson::get_chat_conf(); ChatConfJson::amend(&serde_json::json!({ "titlebar": !chat_conf.titlebar })).unwrap(); diff --git a/src-tauri/src/app/setup.rs b/src-tauri/src/app/setup.rs index 8cc5fd6..440c415 100644 --- a/src-tauri/src/app/setup.rs +++ b/src-tauri/src/app/setup.rs @@ -1,13 +1,16 @@ -use crate::{app::window, conf, utils}; +use crate::{ + app::window, + conf::{ChatConfJson, USER_AGENT}, + utils, +}; use tauri::{utils::config::WindowUrl, window::WindowBuilder, App, Manager}; pub fn init( app: &mut App, - chat_conf: conf::ChatConfJson, + chat_conf: ChatConfJson, ) -> std::result::Result<(), Box> { - let tauri_conf = utils::get_tauri_conf().unwrap(); - let url = tauri_conf.build.dev_path.to_string(); - let theme = conf::ChatConfJson::theme(); + let url = chat_conf.origin.to_string(); + let theme = ChatConfJson::theme(); window::mini_window(&app.app_handle()); #[cfg(target_os = "macos")] @@ -18,13 +21,13 @@ pub fn init( .hidden_title(true) .theme(theme) .always_on_top(chat_conf.always_on_top) - .title_bar_style(conf::ChatConfJson::titlebar()) + .title_bar_style(ChatConfJson::titlebar()) .initialization_script(&utils::user_script()) .initialization_script(include_str!("../assets/html2canvas.js")) .initialization_script(include_str!("../assets/jspdf.js")) .initialization_script(include_str!("../assets/core.js")) .initialization_script(include_str!("../assets/export.js")) - .user_agent(conf::USER_AGENT) + .user_agent(USER_AGENT) .build()?; #[cfg(not(target_os = "macos"))] @@ -40,7 +43,7 @@ pub fn init( .initialization_script(include_str!("../assets/jspdf.js")) .initialization_script(include_str!("../assets/core.js")) .initialization_script(include_str!("../assets/export.js")) - .user_agent(conf::USER_AGENT) + .user_agent(USER_AGENT) .build()?; Ok(()) diff --git a/src-tauri/src/app/window.rs b/src-tauri/src/app/window.rs index 1789934..69a0c2b 100644 --- a/src-tauri/src/app/window.rs +++ b/src-tauri/src/app/window.rs @@ -2,12 +2,10 @@ use crate::{conf, utils}; use tauri::{utils::config::WindowUrl, window::WindowBuilder}; pub fn mini_window(handle: &tauri::AppHandle) { - let tauri_conf = utils::get_tauri_conf().unwrap(); - let url = tauri_conf.build.dev_path.to_string(); - // let chat_conf = conf::ChatConfJson::get_chat_conf(); + let chat_conf = conf::ChatConfJson::get_chat_conf(); let theme = conf::ChatConfJson::theme(); - WindowBuilder::new(handle, "mini", WindowUrl::App(url.into())) + WindowBuilder::new(handle, "mini", WindowUrl::App(chat_conf.origin.into())) .resizable(false) .fullscreen(false) .inner_size(360.0, 540.0) @@ -25,3 +23,16 @@ pub fn mini_window(handle: &tauri::AppHandle) { .hide() .unwrap(); } + +pub fn origin_window(handle: &tauri::AppHandle) { + let theme = conf::ChatConfJson::theme(); + + WindowBuilder::new(handle, "main", WindowUrl::External("/".parse().unwrap())) + .resizable(false) + .fullscreen(false) + .inner_size(400.0, 300.0) + .always_on_top(true) + .theme(theme) + .build() + .unwrap(); +} diff --git a/src-tauri/src/assets/core.js b/src-tauri/src/assets/core.js index 46c83d4..854b1aa 100644 --- a/src-tauri/src/assets/core.js +++ b/src-tauri/src/assets/core.js @@ -71,7 +71,7 @@ async function init() { document.addEventListener("click", (e) => { const origin = e.target.closest("a"); if (origin && origin.href && origin.target !== '_self') { - origin.target = "_self"; + invoke('open_link', { url: origin.href }); } }); diff --git a/src-tauri/src/assets/origin.js b/src-tauri/src/assets/origin.js new file mode 100644 index 0000000..e69de29 diff --git a/src-tauri/src/conf.rs b/src-tauri/src/conf.rs index 18dcb64..ee14f00 100644 --- a/src-tauri/src/conf.rs +++ b/src-tauri/src/conf.rs @@ -8,6 +8,12 @@ pub const USER_AGENT: &str = "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKi pub const PHONE_USER_AGENT: &str = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"; pub const ISSUES_URL: &str = "https://github.com/lencx/ChatGPT/issues"; pub const AWESOME_URL: &str = "https://github.com/lencx/ChatGPT/blob/main/AWESOME.md"; +pub const DEFAULT_CHAT_CONF: &str = r#"{ + "always_on_top": false, + "theme": "Light", + "titlebar": true, + "origin": "https://chat.openai.com/" +}"#; pub struct ChatState { pub always_on_top: Mutex, @@ -26,6 +32,7 @@ pub struct ChatConfJson { pub always_on_top: bool, pub theme: String, pub titlebar: bool, + pub origin: String, } impl ChatConfJson { @@ -35,22 +42,10 @@ impl ChatConfJson { let conf_file = ChatConfJson::conf_path(); if !exists(&conf_file) { create_file(&conf_file).unwrap(); + fs::write(&conf_file, DEFAULT_CHAT_CONF).unwrap(); #[cfg(target_os = "macos")] - let content = r#"{ - "always_on_top": false, - "theme": "Light", - "titlebar": false - }"#; - - #[cfg(not(target_os = "macos"))] - let content = r#"{ - "always_on_top": false, - "theme": "Light", - "titlebar": true - }"#; - - fs::write(&conf_file, content).unwrap(); + ChatConfJson::amend(&serde_json::json!({ "titlebar": false })).unwrap(); } conf_file } @@ -77,7 +72,10 @@ impl ChatConfJson { config.insert(k, v); } - fs::write(ChatConfJson::conf_path(), serde_json::to_string(&config)?)?; + fs::write( + ChatConfJson::conf_path(), + serde_json::to_string_pretty(&config)?, + )?; Ok(()) } @@ -100,11 +98,6 @@ impl ChatConfJson { } pub fn chat_conf_default() -> Self { - serde_json::from_value(serde_json::json!({ - "always_on_top": false, - "theme": "Light", - "titlebar": true - })) - .unwrap() + serde_json::from_value(serde_json::json!(DEFAULT_CHAT_CONF)).unwrap() } } diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs index 15e80a8..58f37fe 100644 --- a/src-tauri/src/utils.rs +++ b/src-tauri/src/utils.rs @@ -4,18 +4,18 @@ use std::{ path::{Path, PathBuf}, process::Command, }; -use tauri::utils::config::Config; +// use tauri::utils::config::Config; pub fn chat_root() -> PathBuf { tauri::api::path::home_dir().unwrap().join(".chatgpt") } -pub fn get_tauri_conf() -> Option { - let config_file = include_str!("../tauri.conf.json"); - let config: Config = - serde_json::from_str(config_file).expect("failed to parse tauri.conf.json"); - Some(config) -} +// pub fn get_tauri_conf() -> Option { +// let config_file = include_str!("../tauri.conf.json"); +// let config: Config = +// serde_json::from_str(config_file).expect("failed to parse tauri.conf.json"); +// Some(config) +// } pub fn exists(path: &Path) -> bool { Path::new(path).exists() diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 5d4b0fd..ffd0b32 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -2,7 +2,7 @@ "build": { "beforeDevCommand": "", "beforeBuildCommand": "", - "devPath": "https://chat.openai.com/", + "devPath": "../dist", "distDir": "../dist" }, "package": {