From cb6b167fd5463fb7f639c9391bdd8f74bf6b3fa9 Mon Sep 17 00:00:00 2001 From: pompurin404 Date: Tue, 30 Jul 2024 20:41:06 +0800 Subject: [PATCH] add tray icon --- resources/icon.ico | Bin 0 -> 25649 bytes src/main/index.ts | 69 ++++++++++++++---- src/renderer/src/App.tsx | 59 +++++++++------ src/renderer/src/assets/main.css | 7 ++ .../src/components/sider/conn-card.tsx | 35 +++++++++ .../src/components/sider/log-card.tsx | 32 ++++++++ .../src/components/sider/override-card.tsx | 33 +++++++++ ...{profile-switcher.tsx => profile-card.tsx} | 4 +- .../src/components/sider/proxy-card.tsx | 29 ++++++++ .../src/components/sider/route-item.tsx | 28 ------- .../src/components/sider/rule-card.tsx | 35 +++++++++ .../components/sider/sysproxy-switcher.tsx | 2 +- .../src/components/sider/tun-switcher.tsx | 2 +- src/renderer/src/pages/connections.tsx | 3 + src/renderer/src/pages/logs.tsx | 3 + src/renderer/src/pages/override.tsx | 3 + src/renderer/src/pages/overview.tsx | 3 - src/renderer/src/routes/index.tsx | 22 ++++-- 18 files changed, 292 insertions(+), 77 deletions(-) create mode 100644 resources/icon.ico create mode 100644 src/renderer/src/components/sider/conn-card.tsx create mode 100644 src/renderer/src/components/sider/log-card.tsx create mode 100644 src/renderer/src/components/sider/override-card.tsx rename src/renderer/src/components/sider/{profile-switcher.tsx => profile-card.tsx} (88%) create mode 100644 src/renderer/src/components/sider/proxy-card.tsx delete mode 100644 src/renderer/src/components/sider/route-item.tsx create mode 100644 src/renderer/src/components/sider/rule-card.tsx create mode 100644 src/renderer/src/pages/connections.tsx create mode 100644 src/renderer/src/pages/logs.tsx create mode 100644 src/renderer/src/pages/override.tsx delete mode 100644 src/renderer/src/pages/overview.tsx diff --git a/resources/icon.ico b/resources/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..93b62a34ea08453575282dcdcaa4f3b75b4570b2 GIT binary patch literal 25649 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 { - mainWindow.show() + window.on('ready-to-show', () => { + window?.show() + window?.focusOnWebView() }) - mainWindow.webContents.setWindowOpenHandler((details) => { + window.on('close', (event) => { + event.preventDefault() + window?.hide() + }) + + window.webContents.setWindowOpenHandler((details) => { shell.openExternal(details.url) return { action: 'deny' } }) @@ -31,12 +41,44 @@ function createWindow(): void { // HMR for renderer base on electron-vite cli. // Load the remote URL for development or the local html file for production. if (is.dev && process.env['ELECTRON_RENDERER_URL']) { - mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + window.loadURL(process.env['ELECTRON_RENDERER_URL']) } else { - mainWindow.loadFile(join(__dirname, '../renderer/index.html')) + window.loadFile(join(__dirname, '../renderer/index.html')) } } +function createTray(): void { + tray = new Tray(icon) + trayContextMenu = Menu.buildFromTemplate([ + { + label: '显示窗口', + type: 'normal', + click: (): void => { + window?.show() + window?.focusOnWebView() + } + }, + { + label: '重启应用', + type: 'normal', + click: (): void => { + app.relaunch() + app.quit() + } + }, + { type: 'separator' }, + { label: '退出应用', type: 'normal', click: (): void => app.quit() } + ]) + + tray.setContextMenu(trayContextMenu) + tray.setIgnoreDoubleClickEvents(true) + tray.setToolTip('Another Mihomo GUI.') + tray.setTitle('Mihomo Party') + tray.addListener('click', () => { + window?.isVisible() ? window?.hide() : window?.show() + }) +} + // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. @@ -51,10 +93,8 @@ app.whenReady().then(() => { optimizer.watchWindowShortcuts(window) }) - // IPC test - ipcMain.on('ping', () => console.log('pong')) - createWindow() + createTray() app.on('activate', function () { // On macOS it's common to re-create a window in the app when the @@ -72,5 +112,6 @@ app.on('window-all-closed', () => { } }) -// In this file you can include the rest of your app"s specific main process -// code. You can also put them in separate files and require them here. +app.on('before-quit', () => { + app.exit() +}) diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 0b7b9d6..e80cb48 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -1,21 +1,23 @@ import { useTheme } from 'next-themes' import { useEffect } from 'react' -import { useRoutes } from 'react-router-dom' +import { useLocation, useNavigate, useRoutes } from 'react-router-dom' import OutboundModeSwitcher from '@renderer/components/sider/outbound-mode-switcher' import SysproxySwitcher from '@renderer/components/sider/sysproxy-switcher' import TunSwitcher from '@renderer/components/sider/tun-switcher' import { Button } from '@nextui-org/react' -import { IoHome, IoSettings } from 'react-icons/io5' -import { IoWifi } from 'react-icons/io5' -import { IoGitNetwork } from 'react-icons/io5' -import { IoLogoGithub } from 'react-icons/io5' +import { IoSettings } from 'react-icons/io5' import routes from '@renderer/routes' -import RouteItem from './components/sider/route-item' -import ProfileSwitcher from './components/sider/profile-switcher' +import ProfileCard from '@renderer/components/sider/profile-card' +import ProxyCard from '@renderer/components/sider/proxy-card' +import RuleCard from '@renderer/components/sider/rule-card' +import OverrideCard from '@renderer/components/sider/override-card' +import ConnCard from '@renderer/components/sider/conn-card' +import LogCard from '@renderer/components/sider/log-card' function App(): JSX.Element { const { setTheme } = useTheme() - + const navigate = useNavigate() + const location = useLocation() const page = useRoutes(routes) useEffect(() => { @@ -39,32 +41,45 @@ function App(): JSX.Element { return (
-
-
+
+

出站

+
+ +
- -

代理

-
+

代理

+
-

配置

- - - - - +

配置

+
+
+ + +
+ +
+ + +
+
+ + +
+
{page}
diff --git a/src/renderer/src/assets/main.css b/src/renderer/src/assets/main.css index b5c61c9..20a0bcd 100644 --- a/src/renderer/src/assets/main.css +++ b/src/renderer/src/assets/main.css @@ -1,3 +1,10 @@ @tailwind base; @tailwind components; @tailwind utilities; + +@layer utilities { + /* Hide scrollbar for Chrome, Safari and Opera */ + .no-scrollbar::-webkit-scrollbar { + display: none; + } +} diff --git a/src/renderer/src/components/sider/conn-card.tsx b/src/renderer/src/components/sider/conn-card.tsx new file mode 100644 index 0000000..02fb78a --- /dev/null +++ b/src/renderer/src/components/sider/conn-card.tsx @@ -0,0 +1,35 @@ +import { Button, Card, CardBody, CardFooter, Chip } from '@nextui-org/react' +import { IoLink } from 'react-icons/io5' +import { useLocation, useNavigate } from 'react-router-dom' + +export default function ConnCard(): JSX.Element { + const navigate = useNavigate() + const location = useLocation() + + return ( + navigate('/connections')} + > + +
+ + + 1103 + +
+
+ +

连接

+
+
+ ) +} diff --git a/src/renderer/src/components/sider/log-card.tsx b/src/renderer/src/components/sider/log-card.tsx new file mode 100644 index 0000000..0182497 --- /dev/null +++ b/src/renderer/src/components/sider/log-card.tsx @@ -0,0 +1,32 @@ +import { Button, Card, CardBody, CardFooter } from '@nextui-org/react' +import { IoJournal } from 'react-icons/io5' +import { useLocation, useNavigate } from 'react-router-dom' + +export default function LogCard(): JSX.Element { + const navigate = useNavigate() + const location = useLocation() + + return ( + navigate('/logs')} + > + +
+ +
+
+ +

日志

+
+
+ ) +} diff --git a/src/renderer/src/components/sider/override-card.tsx b/src/renderer/src/components/sider/override-card.tsx new file mode 100644 index 0000000..59b9ca6 --- /dev/null +++ b/src/renderer/src/components/sider/override-card.tsx @@ -0,0 +1,33 @@ +import { Button, Card, CardBody, CardFooter, Switch } from '@nextui-org/react' +import { MdFormatOverline } from 'react-icons/md' +import { useLocation, useNavigate } from 'react-router-dom' + +export default function OverrideCard(): JSX.Element { + const navigate = useNavigate() + const location = useLocation() + + return ( + navigate('/override')} + > + +
+ + +
+
+ +

覆写

+
+
+ ) +} diff --git a/src/renderer/src/components/sider/profile-switcher.tsx b/src/renderer/src/components/sider/profile-card.tsx similarity index 88% rename from src/renderer/src/components/sider/profile-switcher.tsx rename to src/renderer/src/components/sider/profile-card.tsx index a61fe9a..8834593 100644 --- a/src/renderer/src/components/sider/profile-switcher.tsx +++ b/src/renderer/src/components/sider/profile-card.tsx @@ -2,7 +2,7 @@ import { Button, Card, CardBody, CardFooter, Slider } from '@nextui-org/react' import { IoMdRefresh } from 'react-icons/io' import { useLocation, useNavigate } from 'react-router-dom' -export default function ProfileSwitcher(): JSX.Element { +export default function ProfileCard(): JSX.Element { const navigate = useNavigate() const location = useLocation() @@ -17,7 +17,7 @@ export default function ProfileSwitcher(): JSX.Element {

订阅名称

diff --git a/src/renderer/src/components/sider/proxy-card.tsx b/src/renderer/src/components/sider/proxy-card.tsx new file mode 100644 index 0000000..ee4acde --- /dev/null +++ b/src/renderer/src/components/sider/proxy-card.tsx @@ -0,0 +1,29 @@ +import { Button, Card, CardBody, CardFooter } from '@nextui-org/react' +import { SiSpeedtest } from 'react-icons/si' +import { useLocation, useNavigate } from 'react-router-dom' + +export default function ProxyCard(): JSX.Element { + const navigate = useNavigate() + const location = useLocation() + + return ( + navigate('/proxies')} + > + +
+

节点名称

+ +
+
+ + 二级节点 + +
+ ) +} diff --git a/src/renderer/src/components/sider/route-item.tsx b/src/renderer/src/components/sider/route-item.tsx deleted file mode 100644 index c66955c..0000000 --- a/src/renderer/src/components/sider/route-item.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { Button } from '@nextui-org/react' -import { IconType } from 'react-icons' -import { useLocation, useNavigate } from 'react-router-dom' - -interface Props { - title: string - pathname: string - icon: IconType -} - -export default function RouteItem(props: Props): JSX.Element { - const { pathname, icon: Icon, title } = props - const navigate = useNavigate() - const location = useLocation() - - return ( - - ) -} diff --git a/src/renderer/src/components/sider/rule-card.tsx b/src/renderer/src/components/sider/rule-card.tsx new file mode 100644 index 0000000..5bd7ed8 --- /dev/null +++ b/src/renderer/src/components/sider/rule-card.tsx @@ -0,0 +1,35 @@ +import { Button, Card, CardBody, CardFooter, Chip } from '@nextui-org/react' +import { IoGitNetwork } from 'react-icons/io5' +import { useLocation, useNavigate } from 'react-router-dom' + +export default function RuleCard(): JSX.Element { + const navigate = useNavigate() + const location = useLocation() + + return ( + navigate('/rules')} + > + +
+ + + 1103 + +
+
+ +

规则

+
+
+ ) +} diff --git a/src/renderer/src/components/sider/sysproxy-switcher.tsx b/src/renderer/src/components/sider/sysproxy-switcher.tsx index 2a2b990..31a98da 100644 --- a/src/renderer/src/components/sider/sysproxy-switcher.tsx +++ b/src/renderer/src/components/sider/sysproxy-switcher.tsx @@ -3,7 +3,7 @@ import { IoSettings } from 'react-icons/io5' export default function SysproxySwitcher(): JSX.Element { return ( - +