diff --git a/electron-builder.json b/electron-builder.json index 7fb82081..311b5eac 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -12,19 +12,19 @@ }, "mac": { "target": ["default"], - "icon": "./resources/installer/woori.icns" + "icon": "./dist/ucap-webmessenger-electron/resources/installer/woori.icns" }, "dmg": { "title": "UCapMessenger", - "icon": "./resources/installer/woori.icns" + "icon": "./dist/ucap-webmessenger-electron/resources/installer/woori.icns" }, "win": { "target": ["zip", "nsis"], - "icon": "./resources/installer/woori_256x256.ico" + "icon": "./dist/ucap-webmessenger-electron/resources/installer/woori_256x256.ico" }, "linux": { "target": ["AppImage", "deb", "rpm", "zip", "tar.gz"], - "icon": "./resources/linuxicon" + "icon": "./dist/ucap-webmessenger-electron/resources/linuxicon" }, "nsis": { "oneClick": false, @@ -33,7 +33,7 @@ "differentialPackage": true }, "directories": { - "buildResources": "./resources/installer/", + "buildResources": "./dist/ucap-webmessenger-electron/resources/installer/", "output": "./dist/electron/", "app": "." } diff --git a/electron-projects/ucap-webmessenger-electron/src/app/AppWindow.ts b/electron-projects/ucap-webmessenger-electron/src/app/AppWindow.ts index 32d06ded..bd356b40 100644 --- a/electron-projects/ucap-webmessenger-electron/src/app/AppWindow.ts +++ b/electron-projects/ucap-webmessenger-electron/src/app/AppWindow.ts @@ -26,7 +26,7 @@ export class AppWindow { private minWidth = 960; private minHeight = 660; - public constructor() { + public constructor(private appIconPath: string) { const savedWindowState = windowStateKeeper({ defaultWidth: this.minWidth, defaultHeight: this.minHeight @@ -52,7 +52,7 @@ export class AppWindow { nodeIntegration: true }, acceptFirstMouse: true, - icon: path.join(__dirname, 'resources/image', 'ico_64_64.png') + icon: this.appIconPath }; if (__DARWIN__) { @@ -60,7 +60,6 @@ export class AppWindow { } else if (__WIN32__) { windowOptions.frame = false; } else if (__LINUX__) { - windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png'); } this.window = new BrowserWindow(windowOptions); @@ -81,6 +80,8 @@ export class AppWindow { // renderer. if (__DARWIN__) { this.window.on(ElectronBrowserWindowChannel.Close, e => { + this.window.hide(); + if (!quitting) { e.preventDefault(); } @@ -200,6 +201,10 @@ export class AppWindow { this.window.show(); } + public hide() { + this.window.hide(); + } + /** * Get the time (in milliseconds) spent loading the page. * diff --git a/electron-projects/ucap-webmessenger-electron/src/index.ts b/electron-projects/ucap-webmessenger-electron/src/index.ts index c0edd838..d573b6b8 100644 --- a/electron-projects/ucap-webmessenger-electron/src/index.ts +++ b/electron-projects/ucap-webmessenger-electron/src/index.ts @@ -1,4 +1,12 @@ -import { app, ipcMain, IpcMainEvent, remote } from 'electron'; +import { + app, + ipcMain, + IpcMainEvent, + remote, + Tray, + Menu, + dialog +} from 'electron'; import * as path from 'path'; import * as url from 'url'; import * as fse from 'fs-extra'; @@ -13,7 +21,7 @@ import { FileChannel, IdleStateChannel, NotificationChannel, - ChatChannel, + ChatChannel } from '@ucap-webmessenger/native-electron'; import { ElectronNotificationService } from '@ucap-webmessenger/electron-notification'; @@ -25,7 +33,12 @@ import { IdleChecker } from './lib/idle-checker'; import { NotificationRequest } from '@ucap-webmessenger/native'; import { ElectronAppChannel } from '@ucap-webmessenger/electron-core'; +const appIconPath = __LINUX__ + ? path.join(__dirname, 'static', 'icon-logo.png') + : path.join(__dirname, 'resources/image', 'ico_64_64.png'); + let appWindow: AppWindow | null = null; +let appTray: Tray | null = null; const launchTime = now(); let readyTime: number | null = null; @@ -91,7 +104,7 @@ if (isDuplicateInstance) { } function createWindow() { - const window = new AppWindow(); + const window = new AppWindow(appIconPath); if (__DEV__) { // const { @@ -106,7 +119,7 @@ function createWindow() { import('electron-devtools-installer').then(edi => { const ChromeLens = { id: 'idikgljglpfilbhaboonnpnnincjhjkd', - electron: '>=1.2.1', + electron: '>=1.2.1' }; const extensions = [edi.REDUX_DEVTOOLS, ChromeLens]; @@ -155,6 +168,51 @@ app.on(ElectronAppChannel.Ready, () => { createWindow(); + appTray = new Tray(appIconPath); + + const contextMenu = Menu.buildFromTemplate([ + { + label: '로그아웃', + // accelerator: 'Q', + // selector: 'terminate:', + click: () => { + // 로그아웃 후 로그인화면. + const options = { + type: 'question', + buttons: ['취소', '로그아웃'], + defaultId: 2, + title: 'Question', + message: '로그아웃', + detail: '로그아웃 하시겠습니까?' + // checkboxLabel: 'Remember my answer', + // checkboxChecked: true, + }; + const choice = dialog.showMessageBoxSync(null, options); + if (1 === choice) { + // logout + appWindow.browserWindow.webContents.send(ChatChannel.OpenRoom); + } + } + }, + { label: '버전', submenu: [{ label: 'Ver. ' + app.getVersion() }] }, + { + label: '종료', + // accelerator: 'Q', + // selector: 'terminate:', + click: () => { + // 메신저에 로그아웃 후 종료 + appWindow = null; + app.exit(); + } + } + ]); + appTray.setToolTip('WooriTalk'); + appTray.setContextMenu(contextMenu); + + appTray.on('click', () => { + appWindow.isVisible() ? appWindow.hide() : appWindow.show(); + }); + notificationService = new ElectronNotificationService({ width: 340, height: 100, @@ -166,7 +224,7 @@ app.on(ElectronAppChannel.Ready, () => { defaultStyleAppIcon: { display: 'none' }, defaultStyleImage: {}, defaultStyleClose: {}, - defaultStyleText: {}, + defaultStyleText: {} }); notificationService.options.defaultWindow.webPreferences.preload = path.join( @@ -298,7 +356,7 @@ ipcMain.on( ); appWindow.show(); e.close(); - }, + } }); } ); diff --git a/package.json b/package.json index 2028ac66..6268bcdb 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "build:main:development": "cross-env NODE_ENV=development TS_NODE_PROJECT='./config/tsconfig.webpack.json' parallel-webpack --config=config/main.webpack.config.ts", "build:main:production": "cross-env NODE_ENV=production TS_NODE_PROJECT='./config/tsconfig.webpack.json' NODE_OPTIONS='--max_old_space_size=4096' parallel-webpack --config=config/main.webpack.config.ts", "electron:windows": "electron-builder build --windows", + "electron:mac": "electron-builder build --mac", + "electron:linux": "electron-builder build --linux", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e"