244 lines
6.1 KiB
JavaScript
244 lines
6.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: () => {
|
||
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('托盘图标不存在,无需销毁')
|
||
}
|
||
}
|