Compare commits

...

73 Commits

Author SHA1 Message Date
akashnimare
0d15435408 🔖 v0.5.9 2017-04-11 01:54:39 +05:30
akashnimare
4bd6fde5b6 remove unused dependency configstore 2017-04-09 02:37:12 +05:30
Akash Nimare
e5097ace06 📝 use nvm to install nodejs #135 2017-04-05 19:48:13 +05:30
akashnimare
bcaf54b349 🔥 remove macOs swipe navigation 2017-04-01 11:19:39 -07:00
akashnimare
1f6d0762bb 🐛 fixing configstore permission issue on windows #125 [WIP] 2017-04-01 10:47:52 -07:00
akashnimare
1aa1655676 🔧 update electron-builder/updater to latest fixes #133 2017-03-31 02:02:47 +05:30
akashnimare
0ad66399d0 🐛 set valid config #133 2017-03-31 01:23:44 +05:30
akashnimare
3a6bb14224 🐛 fixing dmg build failed [WIP] #133 2017-03-31 00:47:26 +05:30
Akash Nimare
53eb8051ad Update CONTRIBUTING.md 2017-03-23 15:45:30 +05:30
Akash Nimare
ed9174f57c Merge pull request #119 from sumedh123/master
updated contributing guide
2017-03-23 15:44:10 +05:30
Akash Nimare
260d6a1906 Updated community section 2017-03-23 15:42:27 +05:30
Akash Nimare
dc53319c8e 🆙 bump electron-spellcheck to v1.0.5 2017-03-21 00:43:10 +05:30
Akash Nimare
77369536b3 Merge pull request #130 from Lplenka/master
Check if zulip server is down Fixes Issue #124
2017-03-20 12:31:18 +05:30
Lplenka
531afcb1e5 Fixed root directory's package.json 2017-03-19 17:33:53 +05:30
Lplenka
d6c4eeccf8 Code formatting done 2017-03-19 01:23:13 +05:30
Lplenka
496b906fd0 Merge branch 'master' of https://github.com/Lplenka/zulip-electron 2017-03-19 01:18:32 +05:30
Lplenka
1be29faea6 Removed spaces from imported/exported varibles & fixed the package.json in app folder 2017-03-19 01:16:07 +05:30
Akash Nimare
bc9a7c9890 update copyright 2017-03-19 00:50:50 +05:30
Lplenka
5745276dbb Code formatting done Fixes #124 2017-03-18 13:20:15 +05:30
Lplenka
acf0282aa0 Checks Server error while switching server 2017-03-18 12:40:38 +05:30
Lplenka
54d942178a Implemented function in index to check server error while loading 2017-03-18 12:32:43 +05:30
Lplenka
d84ada373e Added https node module 2017-03-18 12:22:29 +05:30
Lplenka
d4d36d0582 Removed reductant call to prefDomain() 2017-03-18 12:14:12 +05:30
Lplenka
63e6c634b9 Added Node global symbols to avoid setImmdediate Reference Error 2017-03-18 12:11:45 +05:30
Lplenka
4bc558cdbc Merge branch 'master' of https://github.com/Lplenka/zulip-electron 2017-03-18 09:04:19 +05:30
Cynthia Lin
34293fd66b Enable zulipbot build notifications.
PRs labeled with the *travis updates* label will receive build notifications from zulipbot.
2017-03-18 08:52:52 +05:30
Akash Nimare
5eba4b8200 Merge pull request #129 from synicalsyntax/patch-1
Enable zulipbot build notifications.
2017-03-18 00:48:47 +05:30
Akash Nimare
a949307820 Merge pull request #128 from Lplenka/master
show window when the web page has been rendered and window can be displayed without a visual flash.
2017-03-18 00:28:16 +05:30
Cynthia Lin
a714977b5a Enable zulipbot build notifications.
PRs labeled with the *travis updates* label will receive build notifications from zulipbot.
2017-03-11 11:46:43 -08:00
Lplenka
bfcaa51c46 🐛 🔧 linting error fixed 2017-03-11 01:55:48 +05:30
Lplenka
d7d3017bc1 Bug Fixes 2017-03-11 01:46:35 +05:30
Lalu Prasad Lenka
c7ce8fb7c8 Merge pull request #2 from zulip/master
Merging with zulip-electron origin
2017-03-07 13:42:02 +05:30
Sumedh Nimkarde
65a80de01d update Community section 2017-03-07 07:52:30 +05:30
akashnimare
f6bf210451 🔨 fixed linting errors 2017-03-06 15:18:52 +05:30
Akash Nimare
8c23ec3417 Merge pull request #122 from geeeeeeeeek/feature/#104-add-option-to-hide-tray-icon
#104 Add a menu item to toggle the tray icon.
2017-03-06 15:01:50 +05:30
Akash Nimare
97bbd809f7 Merge pull request #121 from geeeeeeeeek/bugfix/#120-fix-error-launching
#120 Fix error launching caused by missing  keyword.
2017-03-06 14:31:38 +05:30
Akash Nimare
76381cac08 Merge pull request #118 from Lplenka/master
Added localhost support fixes #78
2017-03-06 14:30:29 +05:30
Sumedh Nimkarde
13c4ceedc2 add Community section 2017-03-05 22:47:43 +05:30
Sumedh Nimkarde
f0889edf9c add zulipbot link 2017-03-05 15:38:18 +05:30
Zhongyi Tong
ab8367c946 #104 Add a menu item to toggle the tray icon. 2017-03-05 00:54:55 +08:00
Zhongyi Tong
c5887c8f71 #120 Fix error launching caused by missing keyword. 2017-03-04 23:46:26 +08:00
Sumedh Nimkarde
7b7ab03d0b add Chat section 2017-03-04 11:23:20 +05:30
Lplenka
394caa7934 Issue fix in better way 2017-03-04 10:02:27 +05:30
Lplenka
db2860b53e code formatting done 2017-03-04 01:32:34 +05:30
Lplenka
6d20df3557 Changed error message 2017-03-04 01:01:31 +05:30
Lplenka
2942cd1244 merge conflicts resolved 2017-03-04 00:44:40 +05:30
Lplenka
174049f489 issue #78 fixed 2017-03-04 00:16:41 +05:30
Lalu Prasad Lenka
21eae28999 Merge pull request #1 from zulip/master
Update from Original
2017-03-03 11:04:39 +05:30
akashnimare
f256cbcd5d Added error message when input url is null fixes #116 2017-03-02 17:35:20 +05:30
akashnimare
ff8c20f0b4 Removed unnessary code #116 2017-03-02 17:08:42 +05:30
akashnimare
9e0c17a793 🐛 fixing it in preference window #116 2017-03-02 17:05:01 +05:30
akashnimare
b4fb00aa52 🐛 show error message if input server url is null #116 2017-03-02 16:47:41 +05:30
akashnimare
13d0b5e51c Fixed linting error 2017-03-02 16:00:33 +05:30
Akash Nimare
dc15e4578c Merge pull request #115 from jajodiaraghav/offline
Display an error message if internet not working.
2017-03-02 15:36:19 +05:30
Raghav Jajodia
673da66ee9 Display error message if internet not working.
An error message with 'Try again' option is displayed
if the internet is not working.
Fixes #114
2017-02-28 23:01:13 +05:30
Akash Nimare
e397e9bfb4 Merge pull request #113 from chiragjn/master
Fix issue #112 for displaying Keyboard shortcuts
2017-02-24 14:35:48 +05:30
Chirag Jain
4eca2e9254 Fix lint errors 2017-02-24 11:31:10 +05:30
Chirag Jain
a1407826b6 Fix issue #112 for displaying Keyboard shortcuts 2017-02-24 10:57:29 +05:30
akashnimare
6d8f83798b 📦 update dependencies 2017-02-24 02:34:42 +05:30
akashnimare
bfc03c7e95 🐛 fix useragent + notifications #108 + #111 2017-02-24 02:30:13 +05:30
akashnimare
06737ce629 👌 detect Windows version (7/10) #108 2017-02-21 01:04:24 +05:30
akashnimare
6b09840347 improving usergent #108 2017-02-21 00:29:20 +05:30
akashnimare
19b5eecdcd Check if webview's url is failing travis tests on linux [WIP] #109 2017-02-18 16:51:31 +05:30
akashnimare
f443918433 🔧 added spellchecker dependencies in travis 🐧 2017-02-18 16:10:54 +05:30
akashnimare
bb74e58d63 🎨 fixed linting + #108 2017-02-18 15:56:41 +05:30
akashnimare
612e670bb5 🐛 added app version + os details in useragent #108 2017-02-18 15:17:30 +05:30
akashnimare
34bb55cb9f 🐛 set user-agent to ZulipElectron/version #108 2017-02-17 15:39:06 +05:30
akashnimare
1457e82649 📦 updated dependencies 2017-02-17 00:15:14 +05:30
akashnimare
0bdeaaba18 removed unused dependency dialogs 2017-02-17 00:02:27 +05:30
akashnimare
e2286b6110 🚀 windows build script + nsis web installer 2017-02-14 00:28:06 +05:30
akashnimare
27ba3f3068 removed squirrel events code 2017-02-14 00:22:40 +05:30
akashnimare
9859315fea improve logging in autoupdater[WIP] 2017-02-13 23:54:47 +05:30
akashnimare
73d18dde9e init v0.5.8 + updated dependencies 2017-02-13 20:13:33 +05:30
18 changed files with 308 additions and 206 deletions

View File

@@ -5,6 +5,14 @@ os:
- osx - osx
- linux - linux
addons:
apt:
packages:
- build-essential
- libxext-dev
- libxtst-dev
- libxkbfile-dev
language: node_js language: node_js
node_js: node_js:
- '6' - '6'
@@ -22,3 +30,9 @@ cache:
script: script:
- npm run travis - npm run travis
notifications:
webhooks:
urls:
- https://zulip.org/zulipbot/travis
on_success: always
on_failure: always

View File

@@ -1,16 +1,24 @@
#Contributing Guidelines # Contributing Guidelines
Thanks for taking the time to contribute! Thanks for taking the time to contribute!
The following is a set of guidelines for contributing to zulip-electron. These are just guidelines, not rules, use your best judgment and feel free to propose changes to this document in a pull request. The following is a set of guidelines for contributing to zulip-electron. These are just guidelines, not rules, use your best judgement and feel free to propose changes to this document in a pull request.
## Getting Started ## Getting Started
Zulip-Desktop app is built on top of [Electron](http://electron.atom.io/). If you are new to Electron please head over to [this](http://jlord.us/essential-electron/) great article. Zulip-Desktop app is built on top of [Electron](http://electron.atom.io/). If you are new to Electron please head over to [this](http://jlord.us/essential-electron/) great article.
## Community
* The whole zulip documentation such as development environment, setting up with zulip project, testing, code of conduct can be read [here](https://zulip.readthedocs.io).
* If you have any questions regarding zulip-electron, open an [issue](https://github.com/zulip/zulip-electron/issues/new/) or ask it [here](https://chat.zulip.org/#narrow/stream/electron).
## Issue ## Issue
Ensure the bug was not already reported by searching on GitHub under [Issues](https://github.com/zulip/zulip-electron/issues). If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/zulip/zulip-electron/issues/new). Please pay attention to following points while opening an issue. Ensure the bug was not already reported by searching on GitHub under [Issues](https://github.com/zulip/zulip-electron/issues). If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/zulip/zulip-electron/issues/new). Please pay attention to following points while opening an issue.
The [Zulipbot](https://github.com/zulip/zulipbot) helps to claim the issue by commenting the following in the comment section: "**@zulipbot** claim". **@zulipbot** will assign you to the issue and label the issue as **in progress**. For more details, check out [**@zulipbot**](https://github.com/zulip/zulipbot).
### Does it happen on web browsers? (especially Chrome) ### Does it happen on web browsers? (especially Chrome)
Zulip-Desktop is based on Electron, which integrates the Chrome engine within a standalone application. Zulip-Desktop is based on Electron, which integrates the Chrome engine within a standalone application.
If the problem you encounter can be reproduced on web browsers, it may be an issue with Zulip web app. If the problem you encounter can be reproduced on web browsers, it may be an issue with Zulip web app.

View File

@@ -5,7 +5,7 @@
This is an experimental replacement for the [Zulip Desktop This is an experimental replacement for the [Zulip Desktop
app](https://github.com/zulip/zulip-desktop) implemented in app](https://github.com/zulip/zulip-desktop) implemented in
[Electron](http://electron.atom.io/). [Electron](http://electron.atom.io/).eeee
The goal is to achieve feature-compatibility with the old desktop app The goal is to achieve feature-compatibility with the old desktop app
and then start adding cool features like easy support for and then start adding cool features like easy support for
@@ -13,11 +13,13 @@ multi-account, auto-updates etc.
## Prerequisites ## Prerequisites
* node >= v6.3.1 * node >= v6.3.1
* npm >= 3.10.3 > Use [nvm](https://github.com/creationix/nvm) to install the current stable version of node
* python (v2.7.x recommended) * python (v2.7.x recommended)
* If you're on Debian or Ubuntu, you'll need to install following packages: * If you're on Debian or Ubuntu, you'll need to install following packages:
```sh ```sh
$ sudo apt-get install nodejs-legacy build-essential libxext-dev libxtst-dev libxkbfile-dev $ sudo apt-get install build-essential libxext-dev libxtst-dev libxkbfile-dev
``` ```
## Installation ## Installation

View File

@@ -1,30 +1,21 @@
'use strict'; 'use strict';
// const os = require('os');
const {app, dialog} = require('electron'); const {app, dialog} = require('electron');
const {autoUpdater} = require('electron-updater'); const {autoUpdater} = require('electron-updater');
// We don't need to call all of these since it's automatically handled by electron-updater
// const version = app.getVersion();
// const platform = os.platform() + '_' + os.arch(); // usually returns darwin_64
// const updaterFeedURL = 'http://zulipdesktop.herokuapp.com/update/' + platform + '/' + version;
function appUpdater() { function appUpdater() {
// autoUpdater.setFeedURL(updaterFeedURL);
// Log whats happening // Log whats happening
const log = require('electron-log'); const log = require('electron-log');
log.transports.file.level = 'info'; log.transports.file.level = 'info';
autoUpdater.logger = log; autoUpdater.logger = log;
// TODO send autoUpdater events to renderer so that we could
// it could console log in developer tools
/* /*
autoUpdater.on('error', err => console.log(err)); autoUpdater.on('error', err => log.info(err));
autoUpdater.on('checking-for-update', () => console.log('checking-for-update')); autoUpdater.on('checking-for-update', () => log.info('checking-for-update'));
autoUpdater.on('update-available', () => console.log('update-available')); autoUpdater.on('update-available', () => log.info('update-available'));
autoUpdater.on('update-not-available', () => console.log('update-not-available')); autoUpdater.on('update-not-available', () => log.info('update-not-available'));
*/ */
// Ask the user if update is available // Ask the user if update is available
// eslint-disable-next-line no-unused-vars
autoUpdater.on('update-downloaded', (event, info) => { autoUpdater.on('update-downloaded', (event, info) => {
// let message = app.getName() + ' ' + info.releaseName + ' is now available. It will be installed the next time you restart the application.'; // let message = app.getName() + ' ' + info.releaseName + ' is now available. It will be installed the next time you restart the application.';
// if (info.releaseNotes) { // if (info.releaseNotes) {

View File

@@ -7,30 +7,42 @@ const db = new JsonDB(app.getPath('userData') + '/domain.json', true, true);
const data = db.getData('/'); const data = db.getData('/');
console.log(data.domain); console.log(data.domain);
// if (data.domain && window.location.href.indexOf(data.domain) === -1) {
// window.location.href = data.domain
// }
// require('electron-connect').client.create();
window.addDomain = function () { window.addDomain = function () {
document.getElementById('main').innerHTML = 'checking...';
let newDomain = document.getElementById('url').value; let newDomain = document.getElementById('url').value;
newDomain = newDomain.replace(/^https?:\/\//, ''); newDomain = newDomain.replace(/^https?:\/\//, '');
newDomain = newDomain.replace(/^http?:\/\//, '');
const domain = 'https://' + newDomain; if (newDomain === '') {
const checkDomain = domain + '/static/audio/zulip.ogg'; document.getElementById('server-status').innerHTML = 'Please input a value';
} else {
request(checkDomain, (error, response) => { document.getElementById('main').innerHTML = 'Checking...';
if (!error && response.statusCode !== 404) { if (newDomain.indexOf('localhost:') >= 0) {
document.getElementById('main').innerHTML = 'Connect'; const domain = 'http://' + newDomain;
db.push('/domain', domain); const checkDomain = domain + '/static/audio/zulip.ogg';
ipcRenderer.send('new-domain', domain); request(checkDomain, (error, response) => {
if (!error && response.statusCode !== 404) {
document.getElementById('main').innerHTML = 'Connect';
db.push('/domain', domain);
ipcRenderer.send('new-domain', domain);
} else {
document.getElementById('main').innerHTML = 'Connect';
document.getElementById('server-status').innerHTML = 'Not a valid Zulip Local Server.';
}
});
// });
} else { } else {
document.getElementById('main').innerHTML = 'Connect'; const domain = 'https://' + newDomain;
document.getElementById('server-status').innerHTML = 'Not a valid Zulip Server.'; const checkDomain = domain + '/static/audio/zulip.ogg';
}
});
};
request(checkDomain, (error, response) => {
if (!error && response.statusCode !== 404) {
document.getElementById('main').innerHTML = 'Connect';
db.push('/domain', domain);
ipcRenderer.send('new-domain', domain);
} else {
document.getElementById('main').innerHTML = 'Connect';
document.getElementById('server-status').innerHTML = 'Not a valid Zulip Server.';
}
});
}
}
};

View File

@@ -1,11 +1,15 @@
'use strict'; 'use strict';
const path = require('path'); const path = require('path');
const fs = require('fs'); const fs = require('fs');
const os = require('os');
const electron = require('electron'); const electron = require('electron');
const {app} = require('electron'); const {app} = require('electron');
const ipc = require('electron').ipcMain; const ipc = require('electron').ipcMain;
const {dialog} = require('electron');
const https = require('https');
const http = require('http');
const electronLocalshortcut = require('electron-localshortcut'); const electronLocalshortcut = require('electron-localshortcut');
const Configstore = require('configstore'); const Configstore = require('electron-config');
const JsonDB = require('node-json-db'); const JsonDB = require('node-json-db');
const isDev = require('electron-is-dev'); const isDev = require('electron-is-dev');
const tray = require('./tray'); const tray = require('./tray');
@@ -16,16 +20,29 @@ const {appUpdater} = require('./autoupdater');
const db = new JsonDB(app.getPath('userData') + '/domain.json', true, true); const db = new JsonDB(app.getPath('userData') + '/domain.json', true, true);
const data = db.getData('/'); const data = db.getData('/');
/* Handling squirrel.windows events on windows
Update - Not needed for NSIS
if (require('electron-squirrel-startup')) {
app.quit();
} */
// adds debug features like hotkeys for triggering dev tools and reload // adds debug features like hotkeys for triggering dev tools and reload
require('electron-debug')(); require('electron-debug')();
const conf = new Configstore('Zulip-Desktop'); const conf = new Configstore();
function userOS() {
if (os.platform() === 'darwin') {
return 'Mac';
}
if (os.platform() === 'linux') {
return 'Linux';
}
if (os.platform() === 'win32' || os.platform() === 'win64') {
if (parseFloat(os.release()) < 6.2) {
return 'Windows 7';
} else {
return 'Windows 10';
}
}
}
// setting userAgent so that server-side code can identify the desktop app
const isUserAgent = 'ZulipElectron/' + app.getVersion() + ' ' + userOS();
// prevent window being garbage collected // prevent window being garbage collected
let mainWindow; let mainWindow;
@@ -41,6 +58,58 @@ const targetURL = function () {
return data.domain; return data.domain;
}; };
function serverError(targetURL) {
if (targetURL.indexOf('localhost:') < 0 && data.domain) {
const req = https.request(targetURL + '/static/audio/zulip.ogg', res => {
console.log('Server StatusCode:', res.statusCode);
console.log('You are connected to:', res.req._headers.host);
if (res.statusCode >= 500 && res.statusCode <= 599) {
return dialog.showErrorBox('SERVER IS DOWN!', 'We are getting a ' + res.statusCode + ' error status from the server ' + res.req._headers.host + '. Please try again after some time or you may switch server.');
}
});
req.on('error', e => {
console.error(e);
});
req.end();
} else if (data.domain) {
const req = http.request(targetURL + '/static/audio/zulip.ogg', res => {
console.log('Server StatusCode:', res.statusCode);
console.log('You are connected to:', res.req._headers.host);
});
req.on('error', e => {
console.error(e);
});
req.end();
}
}
function checkConnectivity() {
return dialog.showMessageBox({
title: 'Internet connection problem',
message: 'No internet available! Try again?',
type: 'warning',
buttons: ['Try again', 'Close'],
defaultId: 0
}, index => {
if (index === 0) {
mainWindow.webContents.reload();
}
if (index === 1) {
app.quit();
}
});
}
function checkConnection() {
// eslint-disable-next-line no-unused-vars
mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL) => {
if (errorDescription === 'ERR_INTERNET_DISCONNECTED' || errorDescription === 'ERR_PROXY_CONNECTION_FAILED') {
console.log('Error Description:' + errorDescription);
checkConnectivity();
}
});
}
const isAlreadyRunning = app.makeSingleInstance(() => { const isAlreadyRunning = app.makeSingleInstance(() => {
if (mainWindow) { if (mainWindow) {
if (mainWindow.isMinimized()) { if (mainWindow.isMinimized()) {
@@ -73,8 +142,8 @@ const iconPath = () => {
}; };
function onClosed() { function onClosed() {
// dereference the window // Dereference the window
// for multiple windows store them in an array // For multiple windows, store them in an array
mainWindow = null; mainWindow = null;
} }
@@ -105,10 +174,20 @@ function createMainWindow() {
plugins: true, plugins: true,
allowDisplayingInsecureContent: true, allowDisplayingInsecureContent: true,
nodeIntegration: false nodeIntegration: false
} },
show: false
});
win.once('ready-to-show', () => {
win.show();
});
serverError(targetURL());
win.loadURL(targetURL(), {
userAgent: isUserAgent + ' ' + win.webContents.getUserAgent()
}); });
win.loadURL(targetURL());
win.on('closed', onClosed); win.on('closed', onClosed);
win.setTitle('Zulip'); win.setTitle('Zulip');
@@ -176,7 +255,7 @@ app.on('activate', () => {
app.on('ready', () => { app.on('ready', () => {
electron.Menu.setApplicationMenu(appMenu); electron.Menu.setApplicationMenu(appMenu);
mainWindow = createMainWindow(); mainWindow = createMainWindow();
tray.create(mainWindow); tray.create();
const page = mainWindow.webContents; const page = mainWindow.webContents;
@@ -214,10 +293,11 @@ app.on('ready', () => {
page.once('did-frame-finish-load', () => { page.once('did-frame-finish-load', () => {
const checkOS = isWindowsOrmacOS(); const checkOS = isWindowsOrmacOS();
if (checkOS && !isDev) { if (checkOS && !isDev) {
// Initate auto-updates on macOs and windows // Initate auto-updates on MacOS and Windows
appUpdater(); appUpdater();
} }
}); });
checkConnection();
}); });
app.on('will-quit', () => { app.on('will-quit', () => {
@@ -235,6 +315,7 @@ ipc.on('new-domain', (e, domain) => {
mainWindow.show(); mainWindow.show();
} else { } else {
mainWindow.loadURL(domain); mainWindow.loadURL(domain);
serverError(domain);
} }
targetLink = domain; targetLink = domain;
}); });

View File

@@ -1,69 +0,0 @@
// Adopted from
// https://github.com/wozaki/twitter-js-apps/blob/9bc00eafd575fd180dc7a450e1b1daf425e67b80/redux/src/main/renderer/registries/electron/swipeNavigatorImpl.js
'use strict'
const {remote} = require('electron');
const THRESHOLD_DELTA_X = 70;
const THRESHOLD_LIMIT_DELTA_Y = 50;
const THRESHOLD_TIME = 50;
// TODO avoid module global state
let tracking = false;
let deltaX = 0;
let deltaY = 0;
let startTime = 0;
let time = 0;
module.exports.register = function register() {
remote.getCurrentWindow()
.on('scroll-touch-begin', onScrollBegin)
.on('scroll-touch-end', onScrollEnd)
.on('swipe', onSwipe)
window.addEventListener('wheel', onMouseWheel, {passive: true});
window.addEventListener('beforeunload', remove);
}
const remove = module.exports.remove = function remove() {
remote.getCurrentWindow()
.removeListener('scroll-touch-begin', onScrollBegin)
.removeListener('scroll-touch-end', onScrollEnd)
.removeListener('swipe', onSwipe)
window.removeEventListener('mousewheel', onMouseWheel);
window.removeEventListener('beforeunload', remove);
}
function onSwipe(e, direction) {
if (direction === 'left')
remote.getCurrentWebContents().goBack()
else if (direction === 'right')
remote.getCurrentWebContents().goForward()
}
function onMouseWheel(e) {
if (tracking) {
deltaX = deltaX + e.deltaX
deltaY = deltaY + e.deltaY
time = (new Date()).getTime() - startTime
}
}
function onScrollBegin() {
tracking = true
startTime = (new Date()).getTime()
}
function onScrollEnd() {
if (time > THRESHOLD_TIME && tracking && Math.abs(deltaY) < THRESHOLD_LIMIT_DELTA_Y)
if (deltaX > THRESHOLD_DELTA_X)
remote.getCurrentWebContents().goForward()
else if (deltaX < -THRESHOLD_DELTA_X)
remote.getCurrentWebContents().goBack()
tracking = false
deltaX = 0
deltaY = 0
startTime = 0
}

View File

@@ -8,6 +8,7 @@ const app = electron.app;
const BrowserWindow = electron.BrowserWindow; const BrowserWindow = electron.BrowserWindow;
const shell = electron.shell; const shell = electron.shell;
const appName = app.getName(); const appName = app.getName();
const tray = require('./tray');
const {addDomain, about} = require('./windowmanager'); const {addDomain, about} = require('./windowmanager');
@@ -74,6 +75,14 @@ const viewSubmenu = [
{ {
type: 'separator' type: 'separator'
}, },
{
label: 'Toggle Tray Icon',
click(item, focusedWindow) {
if (focusedWindow) {
tray.toggle();
}
}
},
{ {
label: 'Toggle Developer Tools', label: 'Toggle Developer Tools',
accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I',

View File

@@ -3,8 +3,12 @@ const ipcRenderer = require('electron').ipcRenderer;
const {webFrame} = require('electron'); const {webFrame} = require('electron');
const {spellChecker} = require('./spellchecker'); const {spellChecker} = require('./spellchecker');
// enable swipe back/forward navigation on macOS const _setImmediate = setImmediate;
require('./macos-swipe-navigation.js').register(); const _clearImmediate = clearImmediate;
process.once('loaded', () => {
global.setImmediate = _setImmediate;
global.clearImmediate = _clearImmediate;
});
// eslint-disable-next-line import/no-unassigned-import // eslint-disable-next-line import/no-unassigned-import
require('./domain'); require('./domain');
@@ -45,10 +49,14 @@ ipcRenderer.on('log-out', () => {
ipcRenderer.on('shortcut', () => { ipcRenderer.on('shortcut', () => {
// create the menu for the below // create the menu for the below
document.querySelector('.dropdown-toggle').click(); const node = document.querySelector('a[data-overlay-trigger=keyboard-shortcuts]');
// additional check
const nodes = document.querySelectorAll('.dropdown-menu li:nth-child(4) a'); if (node.text.trim().toLowerCase() === 'keyboard shortcuts') {
nodes[nodes.length - 1].click(); node.click();
} else {
// atleast click the dropdown
document.querySelector('.dropdown-toggle').click();
}
}); });
// To prevent failing this script on linux we need to load it after the document loaded // To prevent failing this script on linux we need to load it after the document loaded

View File

@@ -15,7 +15,7 @@ const iconPath = () => {
return APP_ICON + (process.platform === 'win32' ? 'win.ico' : 'osx.png'); return APP_ICON + (process.platform === 'win32' ? 'win.ico' : 'osx.png');
}; };
exports.create = () => { const createHandler = () => {
const contextMenu = electron.Menu.buildFromTemplate([ const contextMenu = electron.Menu.buildFromTemplate([
{ {
label: 'About', label: 'About',
@@ -59,3 +59,23 @@ exports.create = () => {
tray.setContextMenu(contextMenu); tray.setContextMenu(contextMenu);
}; };
const destroyHandler = () => {
tray.destroy();
if (tray.isDestroyed()) {
tray = null;
} else {
throw new Error('Tray icon not properly destroyed.');
}
};
const toggleHandler = () => {
if (tray) {
destroyHandler();
} else {
createHandler();
}
};
exports.create = createHandler;
exports.destroy = destroyHandler;
exports.toggle = toggleHandler;

View File

@@ -2,6 +2,11 @@
const path = require('path'); const path = require('path');
const electron = require('electron'); const electron = require('electron');
const APP_ICON = path.join(__dirname, '../resources', 'Icon');
const iconPath = () => {
return APP_ICON + (process.platform === 'win32' ? '.ico' : '.png');
};
let domainWindow; let domainWindow;
let aboutWindow; let aboutWindow;
@@ -14,10 +19,14 @@ function onClosed() {
// Change Zulip server Window // Change Zulip server Window
function createdomainWindow() { function createdomainWindow() {
const domainwin = new electron.BrowserWindow({ const domainwin = new electron.BrowserWindow({
title: 'Switch Server',
frame: false, frame: false,
height: 300, height: 300,
resizable: false, resizable: false,
width: 400 width: 400,
show: false,
icon: iconPath()
}); });
const domainURL = 'file://' + path.join(__dirname, '../renderer', 'pref.html'); const domainURL = 'file://' + path.join(__dirname, '../renderer', 'pref.html');
domainwin.loadURL(domainURL); domainwin.loadURL(domainURL);
@@ -25,13 +34,20 @@ function createdomainWindow() {
return domainwin; return domainwin;
} }
// Call this window onClick addDomain in tray // Call this window onClick addDomain in tray
function addDomain() { function addDomain() {
domainWindow = createdomainWindow(); domainWindow = createdomainWindow();
domainWindow.show(); domainWindow.once('ready-to-show', () => {
domainWindow.show();
});
setTimeout(() => {
if (domainWindow !== null) {
if (!domainWindow.isDestroyed()) {
domainWindow.destroy();
}
}
}, 15000);
} }
// About window // About window
function createAboutWindow() { function createAboutWindow() {
const aboutwin = new electron.BrowserWindow({ const aboutwin = new electron.BrowserWindow({
@@ -61,9 +77,9 @@ function createAboutWindow() {
// Call this onClick About in tray // Call this onClick About in tray
function about() { function about() {
aboutWindow = createAboutWindow(); aboutWindow = createAboutWindow();
aboutWindow.show(); aboutWindow.once('ready-to-show', () => {
aboutWindow.show();
});
} }
exports = module.exports = { exports = module.exports = {addDomain, about};
addDomain, about
};

View File

@@ -1,11 +1,11 @@
{ {
"name": "zulip", "name": "zulip",
"productName": "Zulip", "productName": "Zulip",
"version": "0.5.7-beta", "version": "0.5.9",
"description": "Zulip Desktop App", "description": "Zulip Desktop App",
"license": "Apache-2.0", "license": "Apache-2.0",
"email":"<svnitakash@gmail.com>", "email": "<svnitakash@gmail.com>",
"copyright": "©2016 Kandra Labs, Inc.", "copyright": "©2017 Kandra Labs, Inc.",
"author": { "author": {
"name": "Akash Nimare", "name": "Akash Nimare",
"email": "svnitakash@gmail.com" "email": "svnitakash@gmail.com"
@@ -27,16 +27,16 @@
"InstantMessaging" "InstantMessaging"
], ],
"dependencies": { "dependencies": {
"electron-is-dev": "0.1.2", "electron-config":"0.2.1",
"electron-updater": "1.4.1",
"electron-log": "1.3.0",
"configstore": "2.1.0",
"dialogs": "1.1.14",
"electron-debug": "1.1.0", "electron-debug": "1.1.0",
"electron-localshortcut": "0.6.1", "electron-is-dev": "0.1.2",
"electron-localshortcut": "1.0.0",
"electron-log": "1.3.0",
"electron-spellchecker": "1.0.5",
"electron-updater": "1.11.2",
"https": "^1.0.0",
"node-json-db": "0.7.3", "node-json-db": "0.7.3",
"request": "2.79.0", "request": "2.79.0",
"electron-spellchecker": "1.0.0",
"wurl": "2.1.0" "wurl": "2.1.0"
} }
} }

View File

@@ -71,13 +71,4 @@ button:focus {
top: -61%; top: -61%;
left: 25%; left: 25%;
text-align: center; text-align: center;
}
#pic {
width: 20px;
left: 36%;
margin-left: 4px;
top: 63%;
display: none;
position: absolute;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -14,35 +14,54 @@ document.addEventListener('keydown', event => {
} }
}); });
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
function addDomain() { window.prefDomain = function () {
const request = require('request'); const request = require('request');
// eslint-disable-next-line import/no-extraneous-dependencies // eslint-disable-next-line import/no-extraneous-dependencies
const ipcRenderer = require('electron').ipcRenderer; const ipcRenderer = require('electron').ipcRenderer;
const JsonDB = require('node-json-db'); const JsonDB = require('node-json-db');
// eslint-disable-next-line import/no-extraneous-dependencies // eslint-disable-next-line import/no-extraneous-dependencies
const {app} = require('electron').remote; const {
app
} = require('electron').remote;
const db = new JsonDB(app.getPath('userData') + '/domain.json', true, true); const db = new JsonDB(app.getPath('userData') + '/domain.json', true, true);
document.getElementById('main').innerHTML = 'checking...';
document.getElementById('pic').style.display = 'block';
let newDomain = document.getElementById('url').value; let newDomain = document.getElementById('url').value;
newDomain = newDomain.replace(/^https?:\/\//, ''); newDomain = newDomain.replace(/^https?:\/\//, '');
newDomain = newDomain.replace(/^http?:\/\//, '');
const domain = 'https://' + newDomain; if (newDomain === '') {
const checkDomain = domain + '/static/audio/zulip.ogg'; document.getElementById('urladded').innerHTML = 'Please input a value';
} else {
request(checkDomain, (error, response) => { document.getElementById('main').innerHTML = 'Checking...';
if (!error && response.statusCode !== 404) { if (newDomain.indexOf('localhost:') >= 0) {
document.getElementById('pic').style.display = 'none'; const domain = 'http://' + newDomain;
document.getElementById('main').innerHTML = 'Switch'; const checkDomain = domain + '/static/audio/zulip.ogg';
document.getElementById('urladded').innerHTML = 'Switched to ' + newDomain; request(checkDomain, (error, response) => {
db.push('/domain', domain); if (!error && response.statusCode !== 404) {
ipcRenderer.send('new-domain', domain); document.getElementById('main').innerHTML = 'Switch';
document.getElementById('urladded').innerHTML = 'Switched to ' + newDomain;
db.push('/domain', domain);
ipcRenderer.send('new-domain', domain);
} else {
document.getElementById('main').innerHTML = 'Switch';
document.getElementById('urladded').innerHTML = 'Not a valid Zulip Local Server.';
}
});
} else { } else {
document.getElementById('pic').style.display = 'none'; const domain = 'https://' + newDomain;
document.getElementById('main').innerHTML = 'Switch'; const checkDomain = domain + '/static/audio/zulip.ogg';
document.getElementById('urladded').innerHTML = 'Not a valid Zulip Server.'; request(checkDomain, (error, response) => {
if (!error && response.statusCode !== 404) {
document.getElementById('main').innerHTML = 'Switch';
document.getElementById('urladded').innerHTML = 'Switched to ' + newDomain;
db.push('/domain', domain);
ipcRenderer.send('new-domain', domain);
} else {
document.getElementById('main').innerHTML = 'Switch';
document.getElementById('urladded').innerHTML = 'Not a valid Zulip Server.';
}
});
} }
}); }
} };

View File

@@ -3,17 +3,14 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="stylesheet" href="css/pref.css"> <link rel="stylesheet" href="css/pref.css">
<script type="text/javascript">
</script>
</head> </head>
<body> <body>
<div class="close" id="close-button">Close</div> <div class="close" id="close-button">Close</div>
<div class="form"> <div class="form">
<form onsubmit="addDomain(); return false"> <form onsubmit="prefDomain(); return false">
<input id="url" type="text" placeholder="Server URL"> <input id="url" type="text" placeholder="Server URL">
<button type="submit" id="main" value="Submit" onclick="addDomain();"> <button type="submit" id="main" value="Submit">
Switch</button> Switch</button>
<img id="pic" src="img/loader.gif" />
</form> </form>
<p id="urladded"><p> <p id="urladded"><p>
</div> </div>

View File

@@ -1,11 +1,12 @@
{ {
"name": "zulip", "name": "zulip",
"productName": "Zulip", "productName": "Zulip",
"version": "0.5.7-beta", "version": "0.5.9",
"main": "./app/main",
"description": "Zulip Desktop App", "description": "Zulip Desktop App",
"license": "Apache-2.0", "license": "Apache-2.0",
"email":"<svnitakash@gmail.com>", "email": "<svnitakash@gmail.com>",
"copyright": "©2016 Kandra Labs, Inc.", "copyright": "©2017 Kandra Labs, Inc.",
"author": { "author": {
"name": "Akash Nimare", "name": "Akash Nimare",
"email": "svnitakash@gmail.com" "email": "svnitakash@gmail.com"
@@ -24,30 +25,33 @@
"dev": "gulp dev", "dev": "gulp dev",
"pack": "build --dir", "pack": "build --dir",
"dist": "build", "dist": "build",
"build:win": "build --win nsis-web --ia32 --x64",
"travis": "cd ./scripts && ./travis-build-test.sh" "travis": "cd ./scripts && ./travis-build-test.sh"
}, },
"build": { "build": {
"appId": "org.zulip.zulip-electron", "appId": "org.zulip.zulip-electron",
"asar": "true", "asar": true,
"files": [ "files": [
"**/*", "**/*",
"!node_modules/@paulcbetts/cld/deps/cld${/*}" "!node_modules/@paulcbetts/cld/deps/cld${/*}"
], ],
"copyright": "©2016 Kandra Labs, Inc.", "copyright": "©2017 Kandra Labs, Inc.",
"mac": { "mac": {
"category": "public.app-category.productivity" "category": "public.app-category.productivity"
}, },
"linux" : { "linux": {
"synopsis": "Zulip Desktop App",
"category": "", "category": "",
"packageCategory": "GNOME;GTK;Network;InstantMessaging", "packageCategory": "GNOME;GTK;Network;InstantMessaging",
"description": "Zulip Desktop Client for Linux", "description": "Zulip Desktop Client for Linux",
"target" : ["deb", "AppImage"], "target": [
"version" : "0.5.7-beta", "deb",
"title" : "Zulip", "AppImage"
"license": "Apache-2.0", ],
"maintainer": "Akash Nimare <svnitakash@gmail.com>" "maintainer": "Akash Nimare <svnitakash@gmail.com>"
}, },
"deb": {
"synopsis": "Zulip Desktop App"
},
"dmg": { "dmg": {
"background": "build/appdmg.png", "background": "build/appdmg.png",
"icon": "build/icon.icns", "icon": "build/icon.icns",
@@ -68,27 +72,26 @@
}, },
"win": { "win": {
"target": "nsis", "target": "nsis",
"icon": "build/icon.ico", "icon": "build/icon.ico"
"iconUrl": "https://raw.githubusercontent.com/zulip/zulip-electron/master/build/icon.ico" },
},
"nsis": { "nsis": {
"perMachine": true, "perMachine": true,
"oneClick": false "oneClick": false
} }
}, },
"keywords": [ "keywords": [
"Zulip", "Zulip",
"Group Chat app", "Group Chat app",
"electron-app", "electron-app",
"electron", "electron",
"Desktop app", "Desktop app",
"InstantMessaging" "InstantMessaging"
], ],
"devDependencies": { "devDependencies": {
"assert": "^1.4.1", "assert": "^1.4.1",
"devtron": "^1.1.0", "devtron": "^1.1.0",
"electron-builder": "13.0.0", "electron-builder": "16.6.0",
"electron": "1.4.7", "electron": "1.4.15",
"electron-connect": "^0.4.6", "electron-connect": "^0.4.6",
"gulp": "^3.9.1", "gulp": "^3.9.1",
"gulp-mocha": "^3.0.1", "gulp-mocha": "^3.0.1",
@@ -108,7 +111,7 @@
"no-warning-comments": 0, "no-warning-comments": 0,
"no-else-return": 0, "no-else-return": 0,
"import/no-unresolved": 0, "import/no-unresolved": 0,
"import/no-extraneous-dependencies":0 "import/no-extraneous-dependencies": 0
} }
} }
], ],

View File

@@ -7,7 +7,7 @@ describe('application launch', function () {
beforeEach(function () { beforeEach(function () {
this.app = new Application({ this.app = new Application({
path: require('electron'), path: require('electron'),
args: [__dirname + '/../app/main/index.js'] args: [__dirname + '/../app/renderer/index.html']
}) })
return this.app.start() return this.app.start()
}) })