mirror of
https://mirror.suhoan.cn/https://github.com/EasyTier/EasyTier.git
synced 2025-12-16 06:37:23 +08:00
1. Add vpnservice tauri plugin for android. 2. add workflow for android. 3. Easytier Core support android, allow set tun fd.
100 lines
2.4 KiB
TypeScript
100 lines
2.4 KiB
TypeScript
import { getCurrent } from '@tauri-apps/api/window'
|
|
import { Menu, MenuItem, PredefinedMenuItem } from '@tauri-apps/api/menu'
|
|
import { TrayIcon } from '@tauri-apps/api/tray'
|
|
import pkg from '~/../package.json'
|
|
|
|
const DEFAULT_TRAY_NAME = 'main'
|
|
|
|
async function toggleVisibility() {
|
|
if (await getCurrent().isVisible()) {
|
|
await getCurrent().hide()
|
|
} else {
|
|
await getCurrent().show()
|
|
await getCurrent().setFocus()
|
|
}
|
|
}
|
|
|
|
export async function useTray(init: boolean = false) {
|
|
let tray;
|
|
try {
|
|
tray = await TrayIcon.getById(DEFAULT_TRAY_NAME)
|
|
if (!tray) {
|
|
tray = await TrayIcon.new({
|
|
tooltip: `EasyTier\n${pkg.version}`,
|
|
title: `EasyTier\n${pkg.version}`,
|
|
id: DEFAULT_TRAY_NAME,
|
|
menu: await Menu.new({
|
|
id: 'main',
|
|
items: await generateMenuItem(),
|
|
}),
|
|
action: async () => {
|
|
toggleVisibility()
|
|
}
|
|
})
|
|
}
|
|
} catch (error) {
|
|
console.warn('Error while creating tray icon:', error)
|
|
return null
|
|
}
|
|
|
|
if (init) {
|
|
tray.setTooltip(`EasyTier\n${pkg.version}`)
|
|
tray.setMenuOnLeftClick(false);
|
|
tray.setMenu(await Menu.new({
|
|
id: 'main',
|
|
items: await generateMenuItem(),
|
|
}))
|
|
}
|
|
|
|
return tray
|
|
}
|
|
|
|
export async function generateMenuItem() {
|
|
return [
|
|
await MenuItemExit('Exit'),
|
|
await PredefinedMenuItem.new({ item: 'Separator' }),
|
|
await MenuItemShow('Show / Hide'),
|
|
] || []
|
|
}
|
|
|
|
export async function MenuItemExit(text: string) {
|
|
return await PredefinedMenuItem.new({
|
|
text: text,
|
|
item: 'Quit',
|
|
})
|
|
}
|
|
|
|
export async function MenuItemShow(text: string) {
|
|
return await MenuItem.new({
|
|
id: 'show',
|
|
text,
|
|
action: async () => {
|
|
await toggleVisibility();
|
|
},
|
|
})
|
|
}
|
|
|
|
export async function setTrayMenu(items: (MenuItem | PredefinedMenuItem)[] | undefined = undefined) {
|
|
const tray = await useTray()
|
|
if (!tray) return
|
|
const menu = await Menu.new({
|
|
id: 'main',
|
|
items: items || await generateMenuItem(),
|
|
})
|
|
tray.setMenu(menu)
|
|
}
|
|
|
|
export async function setTrayRunState(isRunning: boolean = false) {
|
|
const tray = await useTray()
|
|
if (!tray) return
|
|
tray.setIcon(isRunning ? 'icons/icon-inactive.ico' : 'icons/icon.ico')
|
|
}
|
|
|
|
export async function setTrayTooltip(tooltip: string) {
|
|
if (tooltip) {
|
|
const tray = await useTray()
|
|
if (!tray) return
|
|
tray.setTooltip(`EasyTier\n${pkg.version}\n${tooltip}`)
|
|
tray.setTitle(`EasyTier\n${pkg.version}\n${tooltip}`)
|
|
}
|
|
} |