From 50c097814831c7c55b7b7e0c430811b87348456f Mon Sep 17 00:00:00 2001 From: Keith Maika Date: Mon, 28 Mar 2022 15:25:49 -0400 Subject: [PATCH] Small fixes and code cleanup - Fix "false" showing in username field. - Delay showing the window until the page is rendered to prevent flashing - Fix various issues highlighted by Webstorm's inspections. --- README.md | 26 ++++---- app/converse-plugins/desktop-credentials.js | 10 +-- app/converse-plugins/desktop-trayicon.js | 8 +-- app/credentials.js | 2 +- index.html | 3 - main.js | 51 +++++++------- modules/menu-service.js | 12 ++-- preload.js | 17 ++--- resources/css/_footer.css | 15 ----- resources/css/app.css | 8 +-- resources/css/page-default.css | 44 ------------- resources/css/page-settings.css | 16 ----- setup.js | 73 +++++++++++---------- 13 files changed, 104 insertions(+), 181 deletions(-) delete mode 100644 resources/css/_footer.css delete mode 100644 resources/css/page-default.css delete mode 100644 resources/css/page-settings.css diff --git a/README.md b/README.md index bb69bb9..ff81169 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

Converse-Desktop @@ -12,9 +12,9 @@ A basic integration of [Converse.js](https://conversejs.org/) and Electron. With OMEMO. -## Screenshots and feautures +## Screenshots and features -

+

Account form Main window Chat @@ -33,12 +33,12 @@ See [CHANGES.md](https://github.com/conversejs/converse-desktop/blob/master/CHAN #### Latest release installers -| Operation System | Download link | --------------------|---------------- -| macOS | [Converse_Desktop-0.1.0_x64.dmg](https://github.com/conversejs/converse-desktop/releases/download/v0.1.0/Converse_Desktop-0.1.0_x64.dmg) | +| Operation System | Download link | +|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------| +| macOS | [Converse_Desktop-0.1.0_x64.dmg](https://github.com/conversejs/converse-desktop/releases/download/v0.1.0/Converse_Desktop-0.1.0_x64.dmg) | | Windows | [Converse_Desktop_Setup-0.1.0_x64.exe](https://github.com/conversejs/converse-desktop/releases/download/v0.1.0/Converse_Desktop_Setup-0.1.0_x64.exe) | -| Linux DEB | [converse_desktop-0.1.0_amd64.deb](https://github.com/conversejs/converse-desktop/releases/download/v0.1.0/converse_desktop-0.1.0_amd64.deb) | -| Linux other | [converse_desktop-0.1.0_x64.tar.gz](https://github.com/conversejs/converse-desktop/releases/download/v0.1.0/converse_desktop-0.1.0_x64.tar.gz) | +| Linux DEB | [converse_desktop-0.1.0_amd64.deb](https://github.com/conversejs/converse-desktop/releases/download/v0.1.0/converse_desktop-0.1.0_amd64.deb) | +| Linux other | [converse_desktop-0.1.0_x64.tar.gz](https://github.com/conversejs/converse-desktop/releases/download/v0.1.0/converse_desktop-0.1.0_x64.tar.gz) | - [All releases](https://github.com/conversejs/converse-desktop/releases) @@ -60,10 +60,10 @@ npm start ### Build targets: -| Operation System | Target | --------------------|---------------- -| macOS | `npm run dist` | -| Windows | `npm run dist:win64` | +| Operation System | Target | +|------------------|---------------------------| +| macOS | `npm run dist` | +| Windows | `npm run dist:win64` | | Linux DEB | `npm run dist:linux64deb` | More targets could be added via `package.json`. See [electron builder docs](https://www.electron.build/configuration/configuration). @@ -84,5 +84,5 @@ under the MPLv2. This project started as a fork of Nick Denry's [Chimeverse](https://github.com/conversejs/converse-desktop). - PayPayl donate button + PayPal donate button diff --git a/app/converse-plugins/desktop-credentials.js b/app/converse-plugins/desktop-credentials.js index 7a0f831..b8b17be 100644 --- a/app/converse-plugins/desktop-credentials.js +++ b/app/converse-plugins/desktop-credentials.js @@ -2,9 +2,9 @@ const credentials = await import('../credentials.js'); converse.plugins.add('converse-desktop-credentials', { - initialize () { - const { _converse } = this; - const { api } = _converse; + initialize() { + const {_converse} = this; + const {api} = _converse; api.listen.on('afterResourceBinding', () => { if (_converse.connection.pass) { @@ -12,7 +12,9 @@ converse.plugins.add('converse-desktop-credentials', { _converse.connection.service, _converse.bare_jid, _converse.connection.pass - ); + ).catch((reason) => { + console.log(reason); + }); } }); diff --git a/app/converse-plugins/desktop-trayicon.js b/app/converse-plugins/desktop-trayicon.js index c63c627..ea9c943 100644 --- a/app/converse-plugins/desktop-trayicon.js +++ b/app/converse-plugins/desktop-trayicon.js @@ -6,9 +6,9 @@ converse.plugins.add('converse-desktop-trayicon', { const {_converse} = this; let envelopeIsShowing = false; - function hideEnvelope() { + async function hideEnvelope() { if (envelopeIsShowing) { - api.trayService.hideEnvelope(); + await api.trayService.hideEnvelope(); envelopeIsShowing = false; } } @@ -16,8 +16,8 @@ converse.plugins.add('converse-desktop-trayicon', { window.addEventListener('focus', hideEnvelope); _converse.api.listen.on('chatBoxInitialized', hideEnvelope); _converse.api.listen.on('chatBoxFocused', hideEnvelope); - _converse.api.listen.on('messageNotification', () => { - api.trayService.showEnvelope(); + _converse.api.listen.on('messageNotification', async () => { + await api.trayService.showEnvelope(); envelopeIsShowing = true; }); } diff --git a/app/credentials.js b/app/credentials.js index fb2f17b..c3af07d 100644 --- a/app/credentials.js +++ b/app/credentials.js @@ -9,7 +9,7 @@ async function addCredentials(connectionManager, login, password) { async function getCredentials() { const credentials = {} - credentials.login = await api.settings.get('login') + credentials.login = (await api.settings.get('login')) || ''; if (credentials.login) { credentials.connectionManager = await api.settings.get('connectionManager') || null credentials.xmppService = credentials.login.split('@').pop() diff --git a/index.html b/index.html index 5e880c2..63a0857 100644 --- a/index.html +++ b/index.html @@ -6,9 +6,6 @@ - - - diff --git a/main.js b/main.js index c3965bb..e6910aa 100644 --- a/main.js +++ b/main.js @@ -1,5 +1,5 @@ // Modules to control application life and create native browser window -const { app, BrowserWindow, ipcMain, shell } = require('electron') +const {app, BrowserWindow, ipcMain, shell} = require('electron') const path = require('path'); // Keep a global reference of the window object, if you don't, the window will @@ -7,9 +7,9 @@ const path = require('path'); let mainWindow // Require other app modules -const trayService = require(__dirname+'/modules/tray-service') -const menuService = require(__dirname+'/modules/menu-service') -const settingsService = require(__dirname+'/modules/settings-service') +const trayService = require(__dirname + '/modules/tray-service') +const menuService = require(__dirname + '/modules/menu-service') +const settingsService = require(__dirname + '/modules/settings-service') const isMac = process.platform === 'darwin' const isWin = process.platform === 'win32' @@ -26,10 +26,11 @@ function initApp() { } } -function createWindow () { +function createWindow() { // Main window options const mainWindowOptions = { zoomToPageWidth: true, + show: false, webPreferences: { preload: path.join(__dirname, 'preload.js') }, @@ -38,13 +39,12 @@ function createWindow () { // Create the browser window. mainWindow = new BrowserWindow(mainWindowOptions) - mainWindow.maximize(); // Init tray trayService.initTray(mainWindow) // Init menu - menuService.createMenu() + menuService.createMenu(mainWindow) // Open the DevTools. // mainWindow.webContents.openDevTools() @@ -61,7 +61,7 @@ function createWindow () { // Handle shutdown event on Mac with minimizeOnClose // to prevent shutdown interrupt if (isMac) { - const { powerMonitor } = require('electron') + const {powerMonitor} = require('electron') powerMonitor.on('shutdown', () => { app.isQuitting = true app.quit() @@ -69,10 +69,9 @@ function createWindow () { } // Handle restart - ipcMain.on('app-restart', () => { + ipcMain.on('app-quit', () => { app.isQuitting = true - app.relaunch() - app.exit() + app.quit(); }) // Emitted when the window is closed. @@ -84,9 +83,11 @@ function createWindow () { }) // Open links on system default browser - mainWindow.webContents.on('new-window', function(e, url) { - e.preventDefault() - shell.openExternal(url) + mainWindow.webContents.setWindowOpenHandler(function (details) { + shell.openExternal(details.url).catch((reason) => { + console.log(reason); + }); + return {action: 'deny'}; }) ipcMain.handle('settings', (e, method, ...args) => { @@ -97,8 +98,16 @@ function createWindow () { return trayService[method].apply(trayService, args); }); + mainWindow.on('ready-to-show', () => { + mainWindow.maximize(); + }); + // and load the index.html of the app. - mainWindow.loadFile('index.html') + mainWindow.loadFile('index.html').catch((reason) => { + console.log(reason); + app.isQuitting = true; + app.quit(); + }); } // This method will be called when Electron has finished @@ -108,7 +117,7 @@ app.on('ready', initApp) // Quit when all windows are closed. app.on('window-all-closed', function () { - // On macOS it is common for applications and their menu bar + // On macOS, it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q // if (process.platform !== 'darwin') // ^^^^ NOPE ;) @@ -117,7 +126,7 @@ app.on('window-all-closed', function () { }) app.on('activate', function () { - if (mainWindow === null){ + if (mainWindow === null) { createWindow() } else { mainWindow.show(); @@ -131,11 +140,5 @@ app.on('second-instance', function () { // In this file you can include the rest of your app's specific main process // code. You can also put them in separate files and require them here. -// Allow to play audio automatically +// Allow audio to play automatically app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required') - -/** - * Export functions - */ - -exports.trayService = trayService diff --git a/modules/menu-service.js b/modules/menu-service.js index 4e18122..93d994b 100644 --- a/modules/menu-service.js +++ b/modules/menu-service.js @@ -1,13 +1,13 @@ /** * Module for Menu functions. */ -const {app, Menu, MenuItem, BrowserWindow} = require('electron') +const {app, Menu, MenuItem} = require('electron') const settingsService = require(__dirname + '/../modules/settings-service') const menuService = {} -menuService.createMenu = () => { +menuService.createMenu = (window) => { let converse; const application = new Menu(); application.append(new MenuItem({ @@ -17,9 +17,8 @@ menuService.createMenu = () => { label: 'Reconnect', accelerator: 'CmdOrCtrl+R', click: () => { - const activeWindow = BrowserWindow.getAllWindows()[0] - activeWindow.show() - activeWindow.reload() + window.show() + window.reload() } }, { @@ -87,8 +86,7 @@ menuService.createMenu = () => { label: 'Debug info', accelerator: 'F12', click: () => { - const activeWindow = BrowserWindow.getAllWindows()[0] - activeWindow.webContents.openDevTools() + window.webContents.openDevTools() } } ]) diff --git a/preload.js b/preload.js index db32f9c..5ad71e8 100644 --- a/preload.js +++ b/preload.js @@ -2,19 +2,15 @@ const {ipcRenderer, contextBridge} = require('electron'); const keytar = require('keytar'); contextBridge.exposeInMainWorld('api', { - reload() { - ipcRenderer.send('reload') - }, - settings: { has(setting) { return ipcRenderer.invoke('settings', 'has', setting); }, set(setting, value) { - ipcRenderer.invoke('settings', 'set', setting, value); + return ipcRenderer.invoke('settings', 'set', setting, value); }, unset(setting) { - ipcRenderer.invoke('settings', 'unset', setting); + return ipcRenderer.invoke('settings', 'unset', setting); }, get(setting) { return ipcRenderer.invoke('settings', 'get', setting); @@ -22,10 +18,10 @@ contextBridge.exposeInMainWorld('api', { }, trayService: { showEnvelope() { - ipcRenderer.invoke('trayService', 'showEnvelope'); + return ipcRenderer.invoke('trayService', 'showEnvelope'); }, hideEnvelope() { - ipcRenderer.invoke('trayService', 'hideEnvelope'); + return ipcRenderer.invoke('trayService', 'hideEnvelope'); } }, keytar: { @@ -38,5 +34,10 @@ contextBridge.exposeInMainWorld('api', { deletePassword(service, login) { return keytar.deletePassword(service, login); } + }, + app: { + quit() { + ipcRenderer.send('app-quit'); + } } }); diff --git a/resources/css/_footer.css b/resources/css/_footer.css deleted file mode 100644 index 78c2746..0000000 --- a/resources/css/_footer.css +++ /dev/null @@ -1,15 +0,0 @@ - - .page__footer { - bottom: 20px; - color: #777; - display: flex; - left: 50%; - position: absolute; - text-align: center; - transform: translate(-50%, 0%); - } - - .footer__version { - font-size: 13px; - margin-right: 30px; - } \ No newline at end of file diff --git a/resources/css/app.css b/resources/css/app.css index 931582e..9ff4f64 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,7 +1,3 @@ -[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { - display: none !important; -} - .noselect { -webkit-touch-callout: none; /* iOS Safari */ -webkit-user-select: none; /* Safari */ @@ -24,8 +20,8 @@ a { background: transparent; pointer-events: none; position: fixed; - left: 0px; - top: 0px; + left: 0; + top: 0; width: 100%; height: 100%; } diff --git a/resources/css/page-default.css b/resources/css/page-default.css deleted file mode 100644 index 00d998a..0000000 --- a/resources/css/page-default.css +++ /dev/null @@ -1,44 +0,0 @@ -.chimeverse-branding { - left: 50%; - position: absolute; - top: 50%; - transform: translate(-50%, -50%); - text-align: center; -} - -.chimeverse-branding__img { - margin-left: 20px; -} - -.chimeverse-branding__header { - font-size: 26px; - font-weight: normal; - color: #999; - margin: 0px; -} - -.chimeverse-branding__version { - font-size: 12px; - color: #999; - margin-top: 10px; -} - -.update__latest { - background: #bbb; - color: #fff; - border-radius: 3px; - padding: 3px 5px; -} - -.update__available { - background: rgb(5,93,228); - background: linear-gradient(0deg, rgba(5,93,228,1) 0%, rgba(76,145,255,1) 100%); - padding: 3px 5px; - color: #fff; - text-decoration: none; - border-radius: 3px; -} - -.update__error { - color: #da0000; -} \ No newline at end of file diff --git a/resources/css/page-settings.css b/resources/css/page-settings.css deleted file mode 100644 index b145ec2..0000000 --- a/resources/css/page-settings.css +++ /dev/null @@ -1,16 +0,0 @@ -.settings-page { - padding: 0px 20px 0px 20px; -} - -.form-item { - margin-bottom: 15px; -} - -.form-item__hint { - color: #777; - font-size: 13px; -} - -.form-item__save-button.active { - color: blue; -} \ No newline at end of file diff --git a/setup.js b/setup.js index 6565281..cdf0f8d 100644 --- a/setup.js +++ b/setup.js @@ -1,44 +1,45 @@ +/* global api */ + await import('./app/converse-plugins/desktop-credentials.js') await import('./app/converse-plugins/desktop-trayicon.js') const getCredentials = (await import('./app/credentials.js')).getCredentials; -async function initialize () { - let websocket_url, bosh_service_url; - const { connectionManager, login, password } = await getCredentials() +let websocket_url, bosh_service_url; +const {connectionManager, login, password} = await getCredentials() - if (connectionManager?.startsWith('ws')) { - websocket_url = connectionManager - } else if (connectionManager?.startsWith('http')) { - bosh_service_url = connectionManager - } - - converse.plugins.add('converse-debug', { - initialize () { - const { _converse } = this; - window._converse = _converse; - } - }); - - converse.initialize({ - assets_path: './node_modules/converse.js/dist/', - auto_login: login && password, - bosh_service_url, - i18n: navigator.language, - jid: login, - loglevel: 'debug', - muc_respect_autojoin: true, - muc_show_logs_before_join: true, - password: password, - play_sounds: false, - priority: 50, - prune_messages_above: 250, - theme: 'concord', - view_mode: 'fullscreen', - websocket_url, - whitelisted_plugins: ['converse-debug', 'converse-desktop-credentials', 'converse-desktop-trayicon'], - show_connection_url_input: true - }); +if (connectionManager?.startsWith('ws')) { + websocket_url = connectionManager +} else if (connectionManager?.startsWith('http')) { + bosh_service_url = connectionManager } -initialize(); +converse.plugins.add('converse-debug', { + initialize() { + const {_converse} = this; + window._converse = _converse; + } +}); + +converse.initialize({ + assets_path: './node_modules/converse.js/dist/', + auto_login: login && password, + bosh_service_url, + i18n: navigator.language, + jid: login, + loglevel: 'debug', + muc_respect_autojoin: true, + muc_show_logs_before_join: true, + password: password, + play_sounds: false, + priority: 50, + prune_messages_above: 250, + theme: 'concord', + view_mode: 'fullscreen', + websocket_url, + whitelisted_plugins: ['converse-debug', 'converse-desktop-credentials', 'converse-desktop-trayicon'], + show_connection_url_input: true +}).catch((reason) => { + console.log(reason); + api.app.quit(); +});