PicList/src/main/lifeCycle/index.ts

192 lines
5.6 KiB
TypeScript
Raw Normal View History

import './errorHandler'
2020-04-24 23:34:04 -04:00
import {
app,
globalShortcut,
protocol,
Notification
2020-04-24 23:34:04 -04:00
} from 'electron'
import {
createProtocol
2020-04-24 23:34:04 -04:00
} from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
2020-04-24 23:34:04 -04:00
import beforeOpen from '~/main/utils/beforeOpen'
import ipcList from '~/main/events/ipcList'
import busEventList from '~/main/events/busEventList'
2022-10-30 04:08:29 -04:00
import { IRemoteNoticeTriggerHook, IWindowList } from '#/types/enum'
2020-04-24 23:34:04 -04:00
import windowManager from 'apis/app/window/windowManager'
import {
2021-07-26 12:15:11 -04:00
updateShortKeyFromVersion212,
migrateGalleryFromVersion230
2020-04-24 23:34:04 -04:00
} from '~/main/migrate'
import {
uploadChoosedFiles,
uploadClipboardFiles
} from 'apis/app/uploader/apis'
import {
createTray
} from 'apis/app/system'
import server from '~/main/server/index'
import updateChecker from '~/main/utils/updateChecker'
import shortKeyHandler from 'apis/app/shortKey/shortKeyHandler'
import { getUploadFiles } from '~/main/utils/handleArgv'
2021-07-26 12:15:11 -04:00
import db, { GalleryDB } from '~/main/apis/core/datastore'
2020-04-24 23:34:04 -04:00
import bus from '@core/bus'
import logger from 'apis/core/picgo/logger'
import picgo from 'apis/core/picgo'
2022-01-09 21:20:56 -05:00
import fixPath from './fixPath'
2022-02-20 08:30:22 -05:00
import { initI18n } from '~/main/utils/handleI18n'
2022-10-30 04:08:29 -04:00
import { remoteNoticeHandler } from 'apis/app/remoteNotice'
2020-04-24 23:34:04 -04:00
const isDevelopment = process.env.NODE_ENV !== 'production'
const handleStartUpFiles = (argv: string[], cwd: string) => {
const files = getUploadFiles(argv, cwd, logger)
if (files === null || files.length > 0) { // 如果有文件列表作为参数,说明是命令行启动
if (files === null) {
logger.info('cli -> uploading file from clipboard')
uploadClipboardFiles()
} else {
logger.info('cli -> uploading files from cli', ...files.map(item => item.path))
const win = windowManager.getAvailableWindow()
uploadChoosedFiles(win.webContents, files)
}
return true
} else {
return false
}
}
2020-04-24 23:34:04 -04:00
class LifeCycle {
private async beforeReady () {
2020-04-24 23:34:04 -04:00
protocol.registerSchemesAsPrivileged([{ scheme: 'picgo', privileges: { secure: true, standard: true } }])
// fix the $PATH in macOS & linux
2020-04-24 23:34:04 -04:00
fixPath()
beforeOpen()
2022-02-20 08:30:22 -05:00
initI18n()
2020-04-24 23:34:04 -04:00
ipcList.listen()
busEventList.listen()
updateShortKeyFromVersion212(db, db.get('settings.shortKey'))
await migrateGalleryFromVersion230(db, GalleryDB.getInstance(), picgo)
2020-04-24 23:34:04 -04:00
}
2020-04-24 23:34:04 -04:00
private onReady () {
const readyFunction = async () => {
2021-08-01 02:50:25 -04:00
console.log('on ready')
2020-04-24 23:34:04 -04:00
createProtocol('picgo')
if (isDevelopment && !process.env.IS_TEST) {
// Install Vue Devtools
try {
await installExtension(VUEJS_DEVTOOLS)
} catch (e: any) {
2020-04-24 23:34:04 -04:00
console.error('Vue Devtools failed to install:', e.toString())
}
}
windowManager.create(IWindowList.TRAY_WINDOW)
windowManager.create(IWindowList.SETTING_WINDOW)
createTray()
2020-04-24 23:34:04 -04:00
db.set('needReload', false)
updateChecker()
// 不需要阻塞
process.nextTick(() => {
shortKeyHandler.init()
})
server.startup()
if (process.env.NODE_ENV !== 'development') {
handleStartUpFiles(process.argv, process.cwd())
2020-04-24 23:34:04 -04:00
}
if (global.notificationList && global.notificationList?.length > 0) {
while (global.notificationList?.length) {
const option = global.notificationList.pop()
const notice = new Notification(option!)
notice.show()
}
}
2022-10-30 04:08:29 -04:00
await remoteNoticeHandler.init()
remoteNoticeHandler.triggerHook(IRemoteNoticeTriggerHook.APP_START)
}
app.whenReady().then(readyFunction)
2020-04-24 23:34:04 -04:00
}
2020-04-24 23:34:04 -04:00
private onRunning () {
app.on('second-instance', (event, commandLine, workingDirectory) => {
logger.info('detect second instance')
const result = handleStartUpFiles(commandLine, workingDirectory)
if (!result) {
2020-04-24 23:34:04 -04:00
if (windowManager.has(IWindowList.SETTING_WINDOW)) {
const settingWindow = windowManager.get(IWindowList.SETTING_WINDOW)!
if (settingWindow.isMinimized()) {
settingWindow.restore()
}
settingWindow.focus()
}
}
})
app.on('activate', () => {
createProtocol('picgo')
if (!windowManager.has(IWindowList.TRAY_WINDOW)) {
windowManager.create(IWindowList.TRAY_WINDOW)
}
if (!windowManager.has(IWindowList.SETTING_WINDOW)) {
windowManager.create(IWindowList.SETTING_WINDOW)
}
})
app.setLoginItemSettings({
openAtLogin: db.get('settings.autoStart') || false
})
if (process.platform === 'win32') {
app.setAppUserModelId('com.molunerfinn.picgo')
}
if (process.env.XDG_CURRENT_DESKTOP && process.env.XDG_CURRENT_DESKTOP.includes('Unity')) {
process.env.XDG_CURRENT_DESKTOP = 'Unity'
}
}
2020-04-24 23:34:04 -04:00
private onQuit () {
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('will-quit', () => {
globalShortcut.unregisterAll()
bus.removeAllListeners()
server.shutdown()
})
// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
if (process.platform === 'win32') {
process.on('message', data => {
if (data === 'graceful-exit') {
app.quit()
}
})
} else {
process.on('SIGTERM', () => {
app.quit()
})
}
}
}
2021-07-26 12:15:11 -04:00
async launchApp () {
2020-04-24 23:34:04 -04:00
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
app.quit()
} else {
await this.beforeReady()
2020-04-24 23:34:04 -04:00
this.onReady()
this.onRunning()
this.onQuit()
}
}
}
const bootstrap = new LifeCycle()
export {
bootstrap
}