From 78f8daab86dea09b75082ddb789836c5b1e25086 Mon Sep 17 00:00:00 2001 From: lencx Date: Mon, 12 Dec 2022 01:32:41 +0800 Subject: [PATCH] feat: switch origin --- src-tauri/Cargo.toml | 4 +- src-tauri/src/app/cmd.rs | 27 +++++++++++++ src-tauri/src/app/menu.rs | 3 +- src-tauri/src/app/setup.rs | 6 +-- src-tauri/src/app/window.rs | 11 ++++-- src-tauri/src/assets/export.js | 23 ++++++----- src-tauri/src/assets/origin.js | 71 ++++++++++++++++++++++++++++++++++ src-tauri/src/conf.rs | 20 ++++++++-- src-tauri/src/main.rs | 14 ++++--- 9 files changed, 150 insertions(+), 29 deletions(-) diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 47bb13b..1e861a8 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -14,11 +14,11 @@ rust-version = "1.57" tauri-build = {version = "1.2.1", features = [] } [dependencies] +anyhow = "1.0.66" serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.2.1", features = ["api-all", "devtools", "system-tray", "updater"] } +tauri = { version = "1.2.2", features = ["api-all", "devtools", "system-tray", "updater"] } tauri-plugin-positioner = { version = "1.0.4", features = ["system-tray"] } -anyhow = "1.0.66" [features] # by default Tauri runs in production mode diff --git a/src-tauri/src/app/cmd.rs b/src-tauri/src/app/cmd.rs index 70061fa..4c883c7 100644 --- a/src-tauri/src/app/cmd.rs +++ b/src-tauri/src/app/cmd.rs @@ -33,3 +33,30 @@ pub fn open_link(app: AppHandle, url: String) { pub fn get_chat_conf() -> ChatConfJson { ChatConfJson::get_chat_conf() } + +#[command] +pub fn form_confirm(app: AppHandle, data: serde_json::Value) { + ChatConfJson::amend(&serde_json::json!(data)).unwrap(); + tauri::api::process::restart(&app.env()); +} + +#[command] +pub fn form_cancel(app: AppHandle, label: &str, title: &str, msg: &str) { + let win = app.app_handle().get_window(label).unwrap(); + tauri::api::dialog::ask( + app.app_handle().get_window(label).as_ref(), + title, + msg, + move |is_cancel| { + if is_cancel { + win.close().unwrap(); + } + }, + ); +} + +#[command] +pub fn form_msg(app: AppHandle, label: &str, title: &str, msg: &str) { + let win = app.app_handle().get_window(label); + tauri::api::dialog::message(win.as_ref(), title, msg); +} diff --git a/src-tauri/src/app/menu.rs b/src-tauri/src/app/menu.rs index 2ddd391..bc23916 100644 --- a/src-tauri/src/app/menu.rs +++ b/src-tauri/src/app/menu.rs @@ -10,7 +10,8 @@ use tauri::{ use tauri_plugin_positioner::{on_tray_event, Position, WindowExt}; // --- Menu -pub fn init(chat_conf: &conf::ChatConfJson, context: &Context) -> Menu { +pub fn init(context: &Context) -> Menu { + let chat_conf = ChatConfJson::get_chat_conf(); let name = &context.package_info().name; let app_menu = Submenu::new( name, diff --git a/src-tauri/src/app/setup.rs b/src-tauri/src/app/setup.rs index 440c415..3418a8f 100644 --- a/src-tauri/src/app/setup.rs +++ b/src-tauri/src/app/setup.rs @@ -5,10 +5,8 @@ use crate::{ }; use tauri::{utils::config::WindowUrl, window::WindowBuilder, App, Manager}; -pub fn init( - app: &mut App, - chat_conf: ChatConfJson, -) -> std::result::Result<(), Box> { +pub fn init(app: &mut App) -> std::result::Result<(), Box> { + let chat_conf = ChatConfJson::get_chat_conf(); let url = chat_conf.origin.to_string(); let theme = ChatConfJson::theme(); window::mini_window(&app.app_handle()); diff --git a/src-tauri/src/app/window.rs b/src-tauri/src/app/window.rs index 69a0c2b..2fc6af3 100644 --- a/src-tauri/src/app/window.rs +++ b/src-tauri/src/app/window.rs @@ -25,14 +25,17 @@ pub fn mini_window(handle: &tauri::AppHandle) { } pub fn origin_window(handle: &tauri::AppHandle) { - let theme = conf::ChatConfJson::theme(); - - WindowBuilder::new(handle, "main", WindowUrl::External("/".parse().unwrap())) + let chat_conf = conf::ChatConfJson::get_chat_conf(); + // tauri://localhost/origin + // let url = chat_conf.origin; + WindowBuilder::new(handle, "origin", WindowUrl::App(chat_conf.origin.into())) .resizable(false) .fullscreen(false) .inner_size(400.0, 300.0) .always_on_top(true) - .theme(theme) + .decorations(false) + .initialization_script(include_str!("../assets/core.js")) + .initialization_script(include_str!("../assets/origin.js")) .build() .unwrap(); } diff --git a/src-tauri/src/assets/export.js b/src-tauri/src/assets/export.js index 819675a..41a1851 100644 --- a/src-tauri/src/assets/export.js +++ b/src-tauri/src/assets/export.js @@ -2,6 +2,7 @@ // @ref: https://github.com/liady/ChatGPT-pdf/blob/main/src/content_script.js async function init() { + const chatConf = await invoke('get_chat_conf') || {}; if (window.buttonsInterval) { clearInterval(window.buttonsInterval); } @@ -16,7 +17,7 @@ async function init() { }); if (hasTryAgainButton && buttons.length === 1) { const TryAgainButton = actionsArea.querySelector("button"); - addActionsButtons(actionsArea, TryAgainButton); + addActionsButtons(actionsArea, TryAgainButton, chatConf); } else if (!hasTryAgainButton) { removeButtons(); } @@ -28,7 +29,7 @@ const Format = { PDF: "pdf", }; -function addActionsButtons(actionsArea, TryAgainButton) { +function addActionsButtons(actionsArea, TryAgainButton, chatConf) { const downloadButton = TryAgainButton.cloneNode(true); downloadButton.id = "download-png-button"; downloadButton.innerText = "Generate PNG"; @@ -36,6 +37,7 @@ function addActionsButtons(actionsArea, TryAgainButton) { downloadThread(); }; actionsArea.appendChild(downloadButton); + const downloadPdfButton = TryAgainButton.cloneNode(true); downloadPdfButton.id = "download-pdf-button"; downloadPdfButton.innerText = "Download PDF"; @@ -43,13 +45,16 @@ function addActionsButtons(actionsArea, TryAgainButton) { downloadThread({ as: Format.PDF }); }; actionsArea.appendChild(downloadPdfButton); - const exportHtml = TryAgainButton.cloneNode(true); - exportHtml.id = "download-html-button"; - exportHtml.innerText = "Share Link"; - exportHtml.onclick = () => { - sendRequest(); - }; - actionsArea.appendChild(exportHtml); + + if (new RegExp('//chat.openai.com').test(chatConf.origin)) { + const exportHtml = TryAgainButton.cloneNode(true); + exportHtml.id = "download-html-button"; + exportHtml.innerText = "Share Link"; + exportHtml.onclick = () => { + sendRequest(); + }; + actionsArea.appendChild(exportHtml); + } } function removeButtons() { diff --git a/src-tauri/src/assets/origin.js b/src-tauri/src/assets/origin.js index e69de29..3b3b90d 100644 --- a/src-tauri/src/assets/origin.js +++ b/src-tauri/src/assets/origin.js @@ -0,0 +1,71 @@ +function init() { + document.body.innerHTML = ` +

Switch Origin

+ +
+ + +
`; + + const srcipt = document.createElement('script'); + srcipt.innerHTML = `const input = document.getElementById('input'); + const cancelBtn = document.getElementById('cancel'); + const confirmBtn = document.getElementById('confirm'); + cancelBtn.addEventListener('click', () => { + window.invoke('form_cancel', { label: 'origin', title: 'Switch Origin', msg: 'Sure you want to give up the switch?' }); + }) + confirmBtn.addEventListener('click', () => { + if (/^https?:\\/\\//.test(input.value)) { + window.invoke('form_confirm', { data: { origin: input.value } }); + } else { + window.invoke('form_msg', { label: 'origin', title: 'Switch Origin', msg: 'Invalid URL!' }); + } + })`; + document.head.appendChild(srcipt); +} + +// run init +if ( + document.readyState === "complete" || + document.readyState === "interactive" +) { + init(); +} else { + document.addEventListener("DOMContentLoaded", init); +} \ No newline at end of file diff --git a/src-tauri/src/conf.rs b/src-tauri/src/conf.rs index ee14f00..ba4f535 100644 --- a/src-tauri/src/conf.rs +++ b/src-tauri/src/conf.rs @@ -12,7 +12,8 @@ pub const DEFAULT_CHAT_CONF: &str = r#"{ "always_on_top": false, "theme": "Light", "titlebar": true, - "origin": "https://chat.openai.com/" + "default_origin": "https://chat.openai.com", + "origin": "https://chat.openai.com" }"#; pub struct ChatState { @@ -32,6 +33,7 @@ pub struct ChatConfJson { pub always_on_top: bool, pub theme: String, pub titlebar: bool, + pub default_origin: String, pub origin: String, } @@ -42,10 +44,22 @@ 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")] - ChatConfJson::amend(&serde_json::json!({ "titlebar": false })).unwrap(); + fs::write( + &conf_file, + r#"{ + "always_on_top": false, + "theme": "Light", + "titlebar": false, + "default_origin": "https://chat.openai.com", + "origin": "https://chat.openai.com" + }"#, + ) + .unwrap(); + + #[cfg(not(target_os = "macos"))] + fs::write(&conf_file, DEFAULT_CHAT_CONF).unwrap(); } conf_file } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 3ec00ed..ce3ad3e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -8,26 +8,28 @@ mod conf; mod utils; use app::{cmd, menu, setup}; -use conf::ChatConfJson; +use conf::{ChatConfJson, ChatState}; fn main() { ChatConfJson::init(); - let context = tauri::generate_context!(); let chat_conf = ChatConfJson::get_chat_conf(); - let chat_conf2 = chat_conf.clone(); + let context = tauri::generate_context!(); tauri::Builder::default() - .manage(conf::ChatState::default(chat_conf.clone())) + .manage(ChatState::default(chat_conf)) .invoke_handler(tauri::generate_handler![ cmd::drag_window, cmd::fullscreen, cmd::download, cmd::open_link, cmd::get_chat_conf, + cmd::form_cancel, + cmd::form_confirm, + cmd::form_msg, ]) - .setup(|app| setup::init(app, chat_conf2)) + .setup(setup::init) .plugin(tauri_plugin_positioner::init()) - .menu(menu::init(&chat_conf, &context)) + .menu(menu::init(&context)) .system_tray(menu::tray_menu()) .on_menu_event(menu::menu_handler) .on_system_tray_event(menu::tray_handler)