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('托盘图标不存在,无需销毁') } }