mirror of
https://github.com/FranP-code/ChatGPT.git
synced 2025-10-13 00:13:25 +00:00
chore: window
This commit is contained in:
@@ -137,16 +137,12 @@ pub fn init() -> Menu {
|
|||||||
CustomMenuItem::new("go_conf".to_string(), "Go to Config")
|
CustomMenuItem::new("go_conf".to_string(), "Go to Config")
|
||||||
.accelerator("CmdOrCtrl+Shift+G")
|
.accelerator("CmdOrCtrl+Shift+G")
|
||||||
.into(),
|
.into(),
|
||||||
CustomMenuItem::new("clear_conf".to_string(), "Clear Config")
|
|
||||||
.accelerator("CmdOrCtrl+Shift+D")
|
|
||||||
.into(),
|
|
||||||
CustomMenuItem::new("restart".to_string(), "Restart ChatGPT")
|
CustomMenuItem::new("restart".to_string(), "Restart ChatGPT")
|
||||||
.accelerator("CmdOrCtrl+Shift+R")
|
.accelerator("CmdOrCtrl+Shift+R")
|
||||||
.into(),
|
.into(),
|
||||||
|
CustomMenuItem::new("clear_conf".to_string(), "Clear Config").into(),
|
||||||
MenuItem::Separator.into(),
|
MenuItem::Separator.into(),
|
||||||
CustomMenuItem::new("awesome".to_string(), "Awesome ChatGPT")
|
CustomMenuItem::new("awesome".to_string(), "Awesome ChatGPT").into(),
|
||||||
.accelerator("CmdOrCtrl+Shift+A")
|
|
||||||
.into(),
|
|
||||||
CustomMenuItem::new("buy_coffee".to_string(), "Buy lencx a coffee").into(),
|
CustomMenuItem::new("buy_coffee".to_string(), "Buy lencx a coffee").into(),
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ pub fn init(app: &mut App) -> std::result::Result<(), Box<dyn std::error::Error>
|
|||||||
} else {
|
} else {
|
||||||
let app = app.handle();
|
let app = app.handle();
|
||||||
tauri::async_runtime::spawn(async move {
|
tauri::async_runtime::spawn(async move {
|
||||||
let mut main_win = WindowBuilder::new(&app, "core", WindowUrl::App(url.into()))
|
let mut main_win = WindowBuilder::new(&app, "core", WindowUrl::App(url.clone().into()))
|
||||||
.title("ChatGPT")
|
.title("ChatGPT")
|
||||||
.resizable(true)
|
.resizable(true)
|
||||||
.fullscreen(false)
|
.fullscreen(false)
|
||||||
@@ -60,22 +60,26 @@ pub fn init(app: &mut App) -> std::result::Result<(), Box<dyn std::error::Error>
|
|||||||
main_win = main_win.hidden_title(true);
|
main_win = main_win.hidden_title(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if url == "https://chat.openai.com" {
|
||||||
|
main_win = main_win
|
||||||
|
.initialization_script(include_str!("../vendors/floating-ui-core.js"))
|
||||||
|
.initialization_script(include_str!("../vendors/floating-ui-dom.js"))
|
||||||
|
.initialization_script(include_str!("../vendors/html2canvas.js"))
|
||||||
|
.initialization_script(include_str!("../vendors/jspdf.js"))
|
||||||
|
.initialization_script(include_str!("../vendors/turndown.js"))
|
||||||
|
.initialization_script(include_str!("../vendors/turndown-plugin-gfm.js"))
|
||||||
|
.initialization_script(include_str!("../scripts/popup.core.js"))
|
||||||
|
.initialization_script(include_str!("../scripts/export.js"))
|
||||||
|
.initialization_script(include_str!("../scripts/markdown.export.js"))
|
||||||
|
.initialization_script(include_str!("../scripts/cmd.js"))
|
||||||
|
}
|
||||||
|
|
||||||
main_win
|
main_win
|
||||||
.theme(theme)
|
.theme(theme)
|
||||||
.always_on_top(chat_conf.stay_on_top)
|
.always_on_top(chat_conf.stay_on_top)
|
||||||
.title_bar_style(ChatConfJson::titlebar())
|
.title_bar_style(ChatConfJson::titlebar())
|
||||||
.initialization_script(&utils::user_script())
|
.initialization_script(&utils::user_script())
|
||||||
.initialization_script(include_str!("../vendors/floating-ui-core.js"))
|
|
||||||
.initialization_script(include_str!("../vendors/floating-ui-dom.js"))
|
|
||||||
.initialization_script(include_str!("../vendors/html2canvas.js"))
|
|
||||||
.initialization_script(include_str!("../vendors/jspdf.js"))
|
|
||||||
.initialization_script(include_str!("../vendors/turndown.js"))
|
|
||||||
.initialization_script(include_str!("../vendors/turndown-plugin-gfm.js"))
|
|
||||||
.initialization_script(include_str!("../scripts/core.js"))
|
.initialization_script(include_str!("../scripts/core.js"))
|
||||||
.initialization_script(include_str!("../scripts/popup.core.js"))
|
|
||||||
.initialization_script(include_str!("../scripts/export.js"))
|
|
||||||
.initialization_script(include_str!("../scripts/markdown.export.js"))
|
|
||||||
.initialization_script(include_str!("../scripts/cmd.js"))
|
|
||||||
.user_agent(&chat_conf.ua_window)
|
.user_agent(&chat_conf.ua_window)
|
||||||
.build()
|
.build()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|||||||
@@ -9,20 +9,30 @@ pub fn tray_window(handle: &tauri::AppHandle) {
|
|||||||
let app = handle.clone();
|
let app = handle.clone();
|
||||||
|
|
||||||
tauri::async_runtime::spawn(async move {
|
tauri::async_runtime::spawn(async move {
|
||||||
WindowBuilder::new(&app, "tray", WindowUrl::App(chat_conf.origin.into()))
|
let mut tray_win = WindowBuilder::new(
|
||||||
.title("ChatGPT")
|
&app,
|
||||||
.resizable(false)
|
"tray",
|
||||||
.fullscreen(false)
|
WindowUrl::App(chat_conf.tray_origin.clone().into()),
|
||||||
.inner_size(360.0, 540.0)
|
)
|
||||||
.decorations(false)
|
.title("ChatGPT")
|
||||||
.always_on_top(true)
|
.resizable(false)
|
||||||
.theme(theme)
|
.fullscreen(false)
|
||||||
.initialization_script(&utils::user_script())
|
.inner_size(360.0, 540.0)
|
||||||
.initialization_script(include_str!("../vendors/floating-ui-core.js"))
|
.decorations(false)
|
||||||
.initialization_script(include_str!("../vendors/floating-ui-dom.js"))
|
.always_on_top(true)
|
||||||
.initialization_script(include_str!("../scripts/core.js"))
|
.theme(theme)
|
||||||
.initialization_script(include_str!("../scripts/cmd.js"))
|
.initialization_script(&utils::user_script())
|
||||||
.initialization_script(include_str!("../scripts/popup.core.js"))
|
.initialization_script(include_str!("../scripts/core.js"));
|
||||||
|
|
||||||
|
if chat_conf.tray_origin == "https://chat.openai.com" {
|
||||||
|
tray_win = tray_win
|
||||||
|
.initialization_script(include_str!("../vendors/floating-ui-core.js"))
|
||||||
|
.initialization_script(include_str!("../vendors/floating-ui-dom.js"))
|
||||||
|
.initialization_script(include_str!("../scripts/cmd.js"))
|
||||||
|
.initialization_script(include_str!("../scripts/popup.core.js"))
|
||||||
|
}
|
||||||
|
|
||||||
|
tray_win
|
||||||
.user_agent(&chat_conf.ua_tray)
|
.user_agent(&chat_conf.ua_tray)
|
||||||
.build()
|
.build()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|||||||
@@ -26,10 +26,11 @@ pub const DEFAULT_CHAT_CONF: &str = r#"{
|
|||||||
"popup_search": false,
|
"popup_search": false,
|
||||||
"global_shortcut": "",
|
"global_shortcut": "",
|
||||||
"hide_dock_icon": false,
|
"hide_dock_icon": false,
|
||||||
"default_origin": "https://chat.openai.com",
|
|
||||||
"origin": "https://chat.openai.com",
|
"origin": "https://chat.openai.com",
|
||||||
|
"tray_origin": "https://chat.openai.com",
|
||||||
|
"default_origin": "https://chat.openai.com",
|
||||||
"ua_window": "",
|
"ua_window": "",
|
||||||
"ua_tray": ""
|
"ua_tray": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1"
|
||||||
}"#;
|
}"#;
|
||||||
pub const DEFAULT_CHAT_CONF_MAC: &str = r#"{
|
pub const DEFAULT_CHAT_CONF_MAC: &str = r#"{
|
||||||
"stay_on_top": false,
|
"stay_on_top": false,
|
||||||
@@ -40,10 +41,11 @@ pub const DEFAULT_CHAT_CONF_MAC: &str = r#"{
|
|||||||
"popup_search": false,
|
"popup_search": false,
|
||||||
"global_shortcut": "",
|
"global_shortcut": "",
|
||||||
"hide_dock_icon": false,
|
"hide_dock_icon": false,
|
||||||
"default_origin": "https://chat.openai.com",
|
|
||||||
"origin": "https://chat.openai.com",
|
"origin": "https://chat.openai.com",
|
||||||
|
"tray_origin": "https://chat.openai.com",
|
||||||
|
"default_origin": "https://chat.openai.com",
|
||||||
"ua_window": "",
|
"ua_window": "",
|
||||||
"ua_tray": ""
|
"ua_tray": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1"
|
||||||
}"#;
|
}"#;
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
|
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
|
||||||
@@ -59,8 +61,9 @@ pub struct ChatConfJson {
|
|||||||
pub tray: bool,
|
pub tray: bool,
|
||||||
pub popup_search: bool,
|
pub popup_search: bool,
|
||||||
pub stay_on_top: bool,
|
pub stay_on_top: bool,
|
||||||
pub default_origin: String,
|
|
||||||
pub origin: String,
|
pub origin: String,
|
||||||
|
pub tray_origin: String,
|
||||||
|
pub default_origin: String,
|
||||||
pub ua_window: String,
|
pub ua_window: String,
|
||||||
pub ua_tray: String,
|
pub ua_tray: String,
|
||||||
pub global_shortcut: Option<String>,
|
pub global_shortcut: Option<String>,
|
||||||
|
|||||||
@@ -84,9 +84,10 @@ pub fn open_file(path: PathBuf) {
|
|||||||
|
|
||||||
pub fn clear_conf(app: &tauri::AppHandle) {
|
pub fn clear_conf(app: &tauri::AppHandle) {
|
||||||
let root = chat_root();
|
let root = chat_root();
|
||||||
let app2 = app.clone();
|
|
||||||
let msg = format!(
|
let msg = format!(
|
||||||
"Path: {}\nAre you sure to clear all ChatGPT configurations? Please backup in advance if necessary!",
|
"Path: {}\n
|
||||||
|
Are you sure you want to clear all ChatGPT configurations? Performing this operation data can not be restored, please back up in advance.\n
|
||||||
|
Note: The application will exit automatically after the configuration cleanup!",
|
||||||
root.to_string_lossy()
|
root.to_string_lossy()
|
||||||
);
|
);
|
||||||
tauri::api::dialog::ask(
|
tauri::api::dialog::ask(
|
||||||
@@ -96,7 +97,7 @@ pub fn clear_conf(app: &tauri::AppHandle) {
|
|||||||
move |is_ok| {
|
move |is_ok| {
|
||||||
if is_ok {
|
if is_ok {
|
||||||
fs::remove_dir_all(root).unwrap();
|
fs::remove_dir_all(root).unwrap();
|
||||||
tauri::api::process::restart(&app2.env());
|
std::process::exit(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
30
src/components/SwitchOrigin/index.tsx
vendored
Normal file
30
src/components/SwitchOrigin/index.tsx
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
import { Form, Select, Tag } from 'antd';
|
||||||
|
|
||||||
|
import useJson from '@/hooks/useJson';
|
||||||
|
import { DISABLE_AUTO_COMPLETE, CHAT_CONF_JSON, CHAT_AWESOME_JSON } from '@/utils';
|
||||||
|
|
||||||
|
interface SwitchOriginProps {
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SwitchOrigin: FC<SwitchOriginProps> = ({ name }) => {
|
||||||
|
const { json: list = [] } = useJson<any[]>(CHAT_AWESOME_JSON);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Form.Item
|
||||||
|
label={<span>Switch Origin ({name === 'origin' ? 'Main' : 'SystemTray'})</span>}
|
||||||
|
name={name}
|
||||||
|
>
|
||||||
|
<Select showSearch {...DISABLE_AUTO_COMPLETE} optionLabelProp="url">
|
||||||
|
{[{ title: 'ChatGPT', url: 'https://chat.openai.com' }, ...list].map((i) => (
|
||||||
|
<Select.Option key={i.url} label={i.title} value={i.url}>
|
||||||
|
<Tag color="geekblue">{i.title}</Tag> {i.url}
|
||||||
|
</Select.Option>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</Form.Item>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SwitchOrigin;
|
||||||
2
src/view/awesome/config.tsx
vendored
2
src/view/awesome/config.tsx
vendored
@@ -1,4 +1,5 @@
|
|||||||
import { Tag, Space, Popconfirm, Switch } from 'antd';
|
import { Tag, Space, Popconfirm, Switch } from 'antd';
|
||||||
|
import { open } from '@tauri-apps/api/shell';
|
||||||
|
|
||||||
export const awesomeColumns = () => [
|
export const awesomeColumns = () => [
|
||||||
{
|
{
|
||||||
@@ -13,6 +14,7 @@ export const awesomeColumns = () => [
|
|||||||
dataIndex: 'url',
|
dataIndex: 'url',
|
||||||
key: 'url',
|
key: 'url',
|
||||||
width: 200,
|
width: 200,
|
||||||
|
render: (v: string) => <a onClick={() => open(v)}>{v}</a>,
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
// title: 'Icon',
|
// title: 'Icon',
|
||||||
|
|||||||
5
src/view/settings/General.tsx
vendored
5
src/view/settings/General.tsx
vendored
@@ -68,6 +68,11 @@ export default function General() {
|
|||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
)}
|
)}
|
||||||
|
{platformInfo === 'darwin' && (
|
||||||
|
<Form.Item label="Hide Dock Icon" name="hide_dock_icon" valuePropName="checked">
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
)}
|
||||||
<Form.Item label="Theme" name="theme">
|
<Form.Item label="Theme" name="theme">
|
||||||
<Radio.Group>
|
<Radio.Group>
|
||||||
<Radio value="Light">Light</Radio>
|
<Radio value="Light">Light</Radio>
|
||||||
|
|||||||
26
src/view/settings/MainWindow.tsx
vendored
26
src/view/settings/MainWindow.tsx
vendored
@@ -1,22 +1,9 @@
|
|||||||
import { useState } from 'react';
|
|
||||||
import { Form, Switch, Input, Tooltip } from 'antd';
|
import { Form, Switch, Input, Tooltip } from 'antd';
|
||||||
import { QuestionCircleOutlined } from '@ant-design/icons';
|
import { QuestionCircleOutlined } from '@ant-design/icons';
|
||||||
import { invoke } from '@tauri-apps/api';
|
|
||||||
|
|
||||||
import useInit from '@/hooks/useInit';
|
import SwitchOrigin from '@/components/SwitchOrigin';
|
||||||
import { DISABLE_AUTO_COMPLETE } from '@/utils';
|
import { DISABLE_AUTO_COMPLETE } from '@/utils';
|
||||||
|
|
||||||
const OriginLabel = ({ url }: { url: string }) => {
|
|
||||||
return (
|
|
||||||
<span>
|
|
||||||
Switch Origin{' '}
|
|
||||||
<Tooltip title={`Default: ${url}`}>
|
|
||||||
<QuestionCircleOutlined style={{ color: '#1677ff' }} />
|
|
||||||
</Tooltip>
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const PopupSearchLabel = () => {
|
const PopupSearchLabel = () => {
|
||||||
return (
|
return (
|
||||||
<span>
|
<span>
|
||||||
@@ -44,21 +31,12 @@ const PopupSearchLabel = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default function General() {
|
export default function General() {
|
||||||
const [chatConf, setChatConf] = useState<any>(null);
|
|
||||||
|
|
||||||
useInit(async () => {
|
|
||||||
const chatData = await invoke('get_chat_conf');
|
|
||||||
setChatConf(chatData);
|
|
||||||
});
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Form.Item label={<PopupSearchLabel />} name="popup_search" valuePropName="checked">
|
<Form.Item label={<PopupSearchLabel />} name="popup_search" valuePropName="checked">
|
||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={<OriginLabel url={chatConf?.default_origin} />} name="origin">
|
<SwitchOrigin name="origin" />
|
||||||
<Input placeholder="https://chat.openai.com" {...DISABLE_AUTO_COMPLETE} />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item label="User Agent (Main)" name="ua_window">
|
<Form.Item label="User Agent (Main)" name="ua_window">
|
||||||
<Input.TextArea
|
<Input.TextArea
|
||||||
autoSize={{ minRows: 4, maxRows: 4 }}
|
autoSize={{ minRows: 4, maxRows: 4 }}
|
||||||
|
|||||||
2
src/view/settings/TrayWindow.tsx
vendored
2
src/view/settings/TrayWindow.tsx
vendored
@@ -1,6 +1,7 @@
|
|||||||
import { Form, Switch, Input } from 'antd';
|
import { Form, Switch, Input } from 'antd';
|
||||||
|
|
||||||
import { DISABLE_AUTO_COMPLETE } from '@/utils';
|
import { DISABLE_AUTO_COMPLETE } from '@/utils';
|
||||||
|
import SwitchOrigin from '@/components/SwitchOrigin';
|
||||||
|
|
||||||
export default function General() {
|
export default function General() {
|
||||||
return (
|
return (
|
||||||
@@ -8,6 +9,7 @@ export default function General() {
|
|||||||
<Form.Item label="Enable SystemTray" name="tray" valuePropName="checked">
|
<Form.Item label="Enable SystemTray" name="tray" valuePropName="checked">
|
||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<SwitchOrigin name="tray_origin" />
|
||||||
<Form.Item label="User Agent (SystemTray)" name="ua_tray">
|
<Form.Item label="User Agent (SystemTray)" name="ua_tray">
|
||||||
<Input.TextArea
|
<Input.TextArea
|
||||||
autoSize={{ minRows: 4, maxRows: 4 }}
|
autoSize={{ minRows: 4, maxRows: 4 }}
|
||||||
|
|||||||
4
src/view/settings/index.tsx
vendored
4
src/view/settings/index.tsx
vendored
@@ -61,8 +61,8 @@ export default function Settings() {
|
|||||||
form={form}
|
form={form}
|
||||||
style={{ maxWidth: 500 }}
|
style={{ maxWidth: 500 }}
|
||||||
onFinish={onFinish}
|
onFinish={onFinish}
|
||||||
labelCol={{ span: 8 }}
|
labelCol={{ span: 10 }}
|
||||||
wrapperCol={{ span: 15, offset: 1 }}
|
wrapperCol={{ span: 13, offset: 1 }}
|
||||||
>
|
>
|
||||||
<Tabs
|
<Tabs
|
||||||
items={[
|
items={[
|
||||||
|
|||||||
Reference in New Issue
Block a user