Files
dify_market_manager_gui/src/main/tray.js
2025-07-22 17:53:26 +08:00

244 lines
6.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Tray, Menu, app, BrowserWindow, shell } from 'electron'
import { join } from 'path'
import icon from '../../resources/icon.png?asset'
import { getMainWindow, createWindow, createApiConfigWindow, createConfigWindow ,getDragWindow} from './window.js'
import { getStoreValue, setStoreValue, clearStore } from './store.js'
import { createDrageWindow, getDrageWindow } from './window.js'
import logger from './utils/logger'
import { clearAllWindowsCache } from './utils/cacheUtils.js'
import fs from 'fs'
import path from 'path'
let tray = null
import {checkForUpdates} from "./utils/updateUtils"
// 安全重启应用函数
function safeRestartApp() {
return new Promise((resolve) => {
try {
logger.info('开始安全重启应用')
// 标记为正在重启,避免其他退出逻辑干扰
app.isRestarting = true
// 确保所有窗口都被正确关闭
const windows = BrowserWindow.getAllWindows()
logger.info(`准备关闭 ${windows.length} 个窗口`)
windows.forEach(window => {
if (!window.isDestroyed()) {
try {
window.close()
logger.info('窗口关闭成功')
} catch (error) {
logger.warn('关闭窗口时出错:', error)
}
}
})
// 延迟执行重启,确保窗口关闭完成
setTimeout(() => {
try {
logger.info('执行应用重启')
app.relaunch()
app.exit(0)
resolve(true)
} catch (error) {
logger.error('重启应用失败,尝试强制退出:', error)
try {
app.quit()
} catch (quitError) {
logger.error('强制退出也失败:', quitError)
process.exit(0)
}
resolve(false)
}
}, 1000) // 增加延迟时间到1秒
} catch (error) {
logger.error('安全重启失败:', error)
try {
app.quit()
} catch (quitError) {
logger.error('强制退出失败:', quitError)
process.exit(0)
}
resolve(false)
}
})
}
export async function clearBrowserCache() {
try {
// 使用统一的缓存清理函数
await clearAllWindowsCache('tray-clear-cache');
} catch (error) {
logger.error('清除浏览器缓存失败:', error)
}
}
export function createTray() {
// 防止重复创建托盘
if (tray) {
logger.info('托盘已存在,跳过创建')
return
}
logger.info('开始创建托盘图标')
// 创建托盘图标
tray = new Tray(icon)
// 设置托盘图标的提示文本
tray.setToolTip('Dify Market Manager')
// 创建右键菜单
const contextMenu = Menu.buildFromTemplate([
{
label: '显示主窗口',
click: () => {
const mainWindow = getMainWindow()
if (mainWindow) {
mainWindow.show()
} else {
createWindow()
}
}
},
{
label: '隐藏主窗口',
click: () => {
const mainWindow = getMainWindow()
if (mainWindow) {
mainWindow.hide()
}
}
},
{ type: 'separator' },
{
label: '配置',
submenu: [
{ type: 'separator' },
{
label: '配置客户端地址',
click: () => {
createConfigWindow()
}
}
]
},
{ type: 'separator' },
{
label: '显示隐藏桌面悬浮',
click: () => {
const drageWindow = getDrageWindow()
if (!drageWindow) {
createDrageWindow()
} else {
if (drageWindow.isVisible()) {
drageWindow.hide()
setStoreValue('showDrageWindow', false)
} else {
drageWindow.show()
setStoreValue('showDrageWindow', true)
}
}
}
},
{ type: 'separator' },
{
label: '检查更新',
click: async (menuItem) => {
checkForUpdates(menuItem,true)
}
},
{ type: 'separator' },
{
label: '退出登录',
click: async () => {
await clearBrowserCache()
// 重新加载主窗口
const mainWindow = getMainWindow()
if (mainWindow) {
mainWindow.reload()
}
logger.info('用户已退出登录')
}
},
{ type: 'separator' },
{
label: '退出应用',
click: () => {
logger.info('用户点击退出应用')
app.isQuiting = true
// 确保所有窗口都被关闭
const windows = BrowserWindow.getAllWindows()
logger.info(`准备关闭 ${windows.length} 个窗口`)
windows.forEach(window => {
if (!window.isDestroyed()) {
try {
window.destroy()
logger.info('窗口销毁成功')
} catch (error) {
logger.warn('销毁窗口时出错:', error)
}
}
})
// 延迟执行退出,确保窗口销毁完成
setTimeout(() => {
try {
logger.info('执行应用退出')
// 使用 exit 而不是 quit确保完全退出
app.exit(0)
} catch (error) {
logger.error('应用退出失败,尝试强制退出:', error)
try {
process.exit(0)
} catch (processError) {
logger.error('强制退出也失败:', processError)
// 最后的强制退出
process.kill(process.pid, 'SIGKILL')
}
}
}, 500) // 延迟500ms确保窗口销毁完成
}
}
])
// 设置托盘图标的右键菜单
tray.setContextMenu(contextMenu)
// 点击托盘图标时显示/隐藏主窗口
tray.on('click', () => {
const mainWindow = getMainWindow()
if (mainWindow) {
if (mainWindow.isVisible()) {
mainWindow.hide()
} else {
mainWindow.show()
}
} else {
createWindow()
}
})
}
export function destroyTray() {
if (tray) {
logger.info('销毁托盘图标')
tray.destroy()
tray = null
logger.info('托盘图标已销毁')
} else {
logger.info('托盘图标不存在,无需销毁')
}
}