@@ -12,9 +12,9 @@
A basic integration of [Converse.js](https://conversejs.org/) and Electron. With OMEMO.
-## Screenshots and feautures
+## Screenshots and features
-
+
@@ -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).
-
+
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();
+});