Files
dify_market_manager_gui/src/main/tray.js
2025-07-18 18:27:37 +08:00

215 lines
5.1 KiB
JavaScript

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: () => {
app.isQuiting = true
// 确保所有窗口都被关闭
BrowserWindow.getAllWindows().forEach(window => {
window.destroy()
})
app.quit()
}
}
])
// 设置托盘图标的右键菜单
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('托盘图标不存在,无需销毁')
}
}