mirror of
https://github.com/zulip/zulip-desktop.git
synced 2025-10-24 00:23:36 +00:00
Compare commits
69 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d15435408 | ||
|
|
4bd6fde5b6 | ||
|
|
e5097ace06 | ||
|
|
bcaf54b349 | ||
|
|
1f6d0762bb | ||
|
|
1aa1655676 | ||
|
|
0ad66399d0 | ||
|
|
3a6bb14224 | ||
|
|
53eb8051ad | ||
|
|
ed9174f57c | ||
|
|
260d6a1906 | ||
|
|
dc53319c8e | ||
|
|
77369536b3 | ||
|
|
531afcb1e5 | ||
|
|
d6c4eeccf8 | ||
|
|
496b906fd0 | ||
|
|
1be29faea6 | ||
|
|
bc9a7c9890 | ||
|
|
5745276dbb | ||
|
|
acf0282aa0 | ||
|
|
54d942178a | ||
|
|
d84ada373e | ||
|
|
d4d36d0582 | ||
|
|
63e6c634b9 | ||
|
|
4bc558cdbc | ||
|
|
34293fd66b | ||
|
|
5eba4b8200 | ||
|
|
a949307820 | ||
|
|
a714977b5a | ||
|
|
bfcaa51c46 | ||
|
|
d7d3017bc1 | ||
|
|
c7ce8fb7c8 | ||
|
|
65a80de01d | ||
|
|
f6bf210451 | ||
|
|
8c23ec3417 | ||
|
|
97bbd809f7 | ||
|
|
76381cac08 | ||
|
|
13c4ceedc2 | ||
|
|
f0889edf9c | ||
|
|
ab8367c946 | ||
|
|
c5887c8f71 | ||
|
|
7b7ab03d0b | ||
|
|
394caa7934 | ||
|
|
db2860b53e | ||
|
|
6d20df3557 | ||
|
|
2942cd1244 | ||
|
|
174049f489 | ||
|
|
21eae28999 | ||
|
|
f256cbcd5d | ||
|
|
ff8c20f0b4 | ||
|
|
9e0c17a793 | ||
|
|
b4fb00aa52 | ||
|
|
13d0b5e51c | ||
|
|
dc15e4578c | ||
|
|
673da66ee9 | ||
|
|
e397e9bfb4 | ||
|
|
4eca2e9254 | ||
|
|
a1407826b6 | ||
|
|
6d8f83798b | ||
|
|
bfc03c7e95 | ||
|
|
06737ce629 | ||
|
|
6b09840347 | ||
|
|
19b5eecdcd | ||
|
|
f443918433 | ||
|
|
bb74e58d63 | ||
|
|
612e670bb5 | ||
|
|
34bb55cb9f | ||
|
|
1457e82649 | ||
|
|
0bdeaaba18 |
14
.travis.yml
14
.travis.yml
@@ -5,6 +5,14 @@ os:
|
||||
- osx
|
||||
- linux
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- build-essential
|
||||
- libxext-dev
|
||||
- libxtst-dev
|
||||
- libxkbfile-dev
|
||||
|
||||
language: node_js
|
||||
node_js:
|
||||
- '6'
|
||||
@@ -22,3 +30,9 @@ cache:
|
||||
|
||||
script:
|
||||
- npm run travis
|
||||
notifications:
|
||||
webhooks:
|
||||
urls:
|
||||
- https://zulip.org/zulipbot/travis
|
||||
on_success: always
|
||||
on_failure: always
|
||||
|
||||
@@ -1,16 +1,24 @@
|
||||
#Contributing Guidelines
|
||||
# Contributing Guidelines
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
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)
|
||||
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.
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
This is an experimental replacement for the [Zulip Desktop
|
||||
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
|
||||
and then start adding cool features like easy support for
|
||||
@@ -13,11 +13,13 @@ multi-account, auto-updates etc.
|
||||
|
||||
## Prerequisites
|
||||
* 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)
|
||||
* If you're on Debian or Ubuntu, you'll need to install following packages:
|
||||
```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
|
||||
|
||||
@@ -15,6 +15,7 @@ function appUpdater() {
|
||||
*/
|
||||
|
||||
// Ask the user if update is available
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
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.';
|
||||
// if (info.releaseNotes) {
|
||||
|
||||
@@ -7,30 +7,42 @@ const db = new JsonDB(app.getPath('userData') + '/domain.json', true, true);
|
||||
const data = db.getData('/');
|
||||
|
||||
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 () {
|
||||
document.getElementById('main').innerHTML = 'checking...';
|
||||
|
||||
let newDomain = document.getElementById('url').value;
|
||||
newDomain = newDomain.replace(/^https?:\/\//, '');
|
||||
|
||||
const domain = 'https://' + newDomain;
|
||||
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);
|
||||
newDomain = newDomain.replace(/^http?:\/\//, '');
|
||||
if (newDomain === '') {
|
||||
document.getElementById('server-status').innerHTML = 'Please input a value';
|
||||
} else {
|
||||
document.getElementById('main').innerHTML = 'Checking...';
|
||||
if (newDomain.indexOf('localhost:') >= 0) {
|
||||
const domain = 'http://' + newDomain;
|
||||
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 Local Server.';
|
||||
}
|
||||
});
|
||||
// });
|
||||
} else {
|
||||
document.getElementById('main').innerHTML = 'Connect';
|
||||
document.getElementById('server-status').innerHTML = 'Not a valid Zulip Server.';
|
||||
}
|
||||
});
|
||||
};
|
||||
const domain = 'https://' + newDomain;
|
||||
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.';
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
'use strict';
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
const electron = require('electron');
|
||||
const {app} = require('electron');
|
||||
const ipc = require('electron').ipcMain;
|
||||
const {dialog} = require('electron');
|
||||
const https = require('https');
|
||||
const http = require('http');
|
||||
const electronLocalshortcut = require('electron-localshortcut');
|
||||
const Configstore = require('configstore');
|
||||
const Configstore = require('electron-config');
|
||||
const JsonDB = require('node-json-db');
|
||||
const isDev = require('electron-is-dev');
|
||||
const tray = require('./tray');
|
||||
@@ -19,7 +23,26 @@ const data = db.getData('/');
|
||||
// adds debug features like hotkeys for triggering dev tools and reload
|
||||
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
|
||||
let mainWindow;
|
||||
@@ -35,6 +58,58 @@ const targetURL = function () {
|
||||
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(() => {
|
||||
if (mainWindow) {
|
||||
if (mainWindow.isMinimized()) {
|
||||
@@ -67,8 +142,8 @@ const iconPath = () => {
|
||||
};
|
||||
|
||||
function onClosed() {
|
||||
// dereference the window
|
||||
// for multiple windows store them in an array
|
||||
// Dereference the window
|
||||
// For multiple windows, store them in an array
|
||||
mainWindow = null;
|
||||
}
|
||||
|
||||
@@ -99,10 +174,20 @@ function createMainWindow() {
|
||||
plugins: true,
|
||||
allowDisplayingInsecureContent: true,
|
||||
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.setTitle('Zulip');
|
||||
|
||||
@@ -170,7 +255,7 @@ app.on('activate', () => {
|
||||
app.on('ready', () => {
|
||||
electron.Menu.setApplicationMenu(appMenu);
|
||||
mainWindow = createMainWindow();
|
||||
tray.create(mainWindow);
|
||||
tray.create();
|
||||
|
||||
const page = mainWindow.webContents;
|
||||
|
||||
@@ -208,10 +293,11 @@ app.on('ready', () => {
|
||||
page.once('did-frame-finish-load', () => {
|
||||
const checkOS = isWindowsOrmacOS();
|
||||
if (checkOS && !isDev) {
|
||||
// Initate auto-updates on macOs and windows
|
||||
// Initate auto-updates on MacOS and Windows
|
||||
appUpdater();
|
||||
}
|
||||
});
|
||||
checkConnection();
|
||||
});
|
||||
|
||||
app.on('will-quit', () => {
|
||||
@@ -229,6 +315,7 @@ ipc.on('new-domain', (e, domain) => {
|
||||
mainWindow.show();
|
||||
} else {
|
||||
mainWindow.loadURL(domain);
|
||||
serverError(domain);
|
||||
}
|
||||
targetLink = domain;
|
||||
});
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -8,6 +8,7 @@ const app = electron.app;
|
||||
const BrowserWindow = electron.BrowserWindow;
|
||||
const shell = electron.shell;
|
||||
const appName = app.getName();
|
||||
const tray = require('./tray');
|
||||
|
||||
const {addDomain, about} = require('./windowmanager');
|
||||
|
||||
@@ -74,6 +75,14 @@ const viewSubmenu = [
|
||||
{
|
||||
type: 'separator'
|
||||
},
|
||||
{
|
||||
label: 'Toggle Tray Icon',
|
||||
click(item, focusedWindow) {
|
||||
if (focusedWindow) {
|
||||
tray.toggle();
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Toggle Developer Tools',
|
||||
accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I',
|
||||
|
||||
@@ -3,8 +3,12 @@ const ipcRenderer = require('electron').ipcRenderer;
|
||||
const {webFrame} = require('electron');
|
||||
const {spellChecker} = require('./spellchecker');
|
||||
|
||||
// enable swipe back/forward navigation on macOS
|
||||
require('./macos-swipe-navigation.js').register();
|
||||
const _setImmediate = setImmediate;
|
||||
const _clearImmediate = clearImmediate;
|
||||
process.once('loaded', () => {
|
||||
global.setImmediate = _setImmediate;
|
||||
global.clearImmediate = _clearImmediate;
|
||||
});
|
||||
|
||||
// eslint-disable-next-line import/no-unassigned-import
|
||||
require('./domain');
|
||||
@@ -45,10 +49,14 @@ ipcRenderer.on('log-out', () => {
|
||||
|
||||
ipcRenderer.on('shortcut', () => {
|
||||
// create the menu for the below
|
||||
document.querySelector('.dropdown-toggle').click();
|
||||
|
||||
const nodes = document.querySelectorAll('.dropdown-menu li:nth-child(4) a');
|
||||
nodes[nodes.length - 1].click();
|
||||
const node = document.querySelector('a[data-overlay-trigger=keyboard-shortcuts]');
|
||||
// additional check
|
||||
if (node.text.trim().toLowerCase() === 'keyboard shortcuts') {
|
||||
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
|
||||
|
||||
@@ -15,7 +15,7 @@ const iconPath = () => {
|
||||
return APP_ICON + (process.platform === 'win32' ? 'win.ico' : 'osx.png');
|
||||
};
|
||||
|
||||
exports.create = () => {
|
||||
const createHandler = () => {
|
||||
const contextMenu = electron.Menu.buildFromTemplate([
|
||||
{
|
||||
label: 'About',
|
||||
@@ -59,3 +59,23 @@ exports.create = () => {
|
||||
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;
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
const path = require('path');
|
||||
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 aboutWindow;
|
||||
|
||||
@@ -14,10 +19,14 @@ function onClosed() {
|
||||
// Change Zulip server Window
|
||||
function createdomainWindow() {
|
||||
const domainwin = new electron.BrowserWindow({
|
||||
title: 'Switch Server',
|
||||
frame: false,
|
||||
height: 300,
|
||||
resizable: false,
|
||||
width: 400
|
||||
width: 400,
|
||||
show: false,
|
||||
icon: iconPath()
|
||||
|
||||
});
|
||||
const domainURL = 'file://' + path.join(__dirname, '../renderer', 'pref.html');
|
||||
domainwin.loadURL(domainURL);
|
||||
@@ -25,13 +34,20 @@ function createdomainWindow() {
|
||||
|
||||
return domainwin;
|
||||
}
|
||||
|
||||
// Call this window onClick addDomain in tray
|
||||
function addDomain() {
|
||||
domainWindow = createdomainWindow();
|
||||
domainWindow.show();
|
||||
domainWindow.once('ready-to-show', () => {
|
||||
domainWindow.show();
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (domainWindow !== null) {
|
||||
if (!domainWindow.isDestroyed()) {
|
||||
domainWindow.destroy();
|
||||
}
|
||||
}
|
||||
}, 15000);
|
||||
}
|
||||
|
||||
// About window
|
||||
function createAboutWindow() {
|
||||
const aboutwin = new electron.BrowserWindow({
|
||||
@@ -61,9 +77,9 @@ function createAboutWindow() {
|
||||
// Call this onClick About in tray
|
||||
function about() {
|
||||
aboutWindow = createAboutWindow();
|
||||
aboutWindow.show();
|
||||
aboutWindow.once('ready-to-show', () => {
|
||||
aboutWindow.show();
|
||||
});
|
||||
}
|
||||
|
||||
exports = module.exports = {
|
||||
addDomain, about
|
||||
};
|
||||
exports = module.exports = {addDomain, about};
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"name": "zulip",
|
||||
"productName": "Zulip",
|
||||
"version": "0.5.8",
|
||||
"version": "0.5.9",
|
||||
"description": "Zulip Desktop App",
|
||||
"license": "Apache-2.0",
|
||||
"email":"<svnitakash@gmail.com>",
|
||||
"email": "<svnitakash@gmail.com>",
|
||||
"copyright": "©2017 Kandra Labs, Inc.",
|
||||
"author": {
|
||||
"name": "Akash Nimare",
|
||||
@@ -27,16 +27,16 @@
|
||||
"InstantMessaging"
|
||||
],
|
||||
"dependencies": {
|
||||
"electron-is-dev": "0.1.2",
|
||||
"electron-updater": "1.6.2",
|
||||
"electron-log": "1.3.0",
|
||||
"configstore": "2.1.0",
|
||||
"dialogs": "1.1.14",
|
||||
"electron-config":"0.2.1",
|
||||
"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",
|
||||
"request": "2.79.0",
|
||||
"electron-spellchecker": "1.0.0",
|
||||
"wurl": "2.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,13 +71,4 @@ button:focus {
|
||||
top: -61%;
|
||||
left: 25%;
|
||||
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 |
@@ -14,35 +14,54 @@ document.addEventListener('keydown', event => {
|
||||
}
|
||||
});
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function addDomain() {
|
||||
window.prefDomain = function () {
|
||||
const request = require('request');
|
||||
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||
const ipcRenderer = require('electron').ipcRenderer;
|
||||
const JsonDB = require('node-json-db');
|
||||
// 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);
|
||||
document.getElementById('main').innerHTML = 'checking...';
|
||||
document.getElementById('pic').style.display = 'block';
|
||||
|
||||
let newDomain = document.getElementById('url').value;
|
||||
newDomain = newDomain.replace(/^https?:\/\//, '');
|
||||
newDomain = newDomain.replace(/^http?:\/\//, '');
|
||||
|
||||
const domain = 'https://' + newDomain;
|
||||
const checkDomain = domain + '/static/audio/zulip.ogg';
|
||||
|
||||
request(checkDomain, (error, response) => {
|
||||
if (!error && response.statusCode !== 404) {
|
||||
document.getElementById('pic').style.display = 'none';
|
||||
document.getElementById('main').innerHTML = 'Switch';
|
||||
document.getElementById('urladded').innerHTML = 'Switched to ' + newDomain;
|
||||
db.push('/domain', domain);
|
||||
ipcRenderer.send('new-domain', domain);
|
||||
if (newDomain === '') {
|
||||
document.getElementById('urladded').innerHTML = 'Please input a value';
|
||||
} else {
|
||||
document.getElementById('main').innerHTML = 'Checking...';
|
||||
if (newDomain.indexOf('localhost:') >= 0) {
|
||||
const domain = 'http://' + newDomain;
|
||||
const checkDomain = domain + '/static/audio/zulip.ogg';
|
||||
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 Local Server.';
|
||||
}
|
||||
});
|
||||
} else {
|
||||
document.getElementById('pic').style.display = 'none';
|
||||
document.getElementById('main').innerHTML = 'Switch';
|
||||
document.getElementById('urladded').innerHTML = 'Not a valid Zulip Server.';
|
||||
const domain = 'https://' + newDomain;
|
||||
const checkDomain = domain + '/static/audio/zulip.ogg';
|
||||
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.';
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,17 +3,14 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="css/pref.css">
|
||||
<script type="text/javascript">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="close" id="close-button">Close</div>
|
||||
<div class="form">
|
||||
<form onsubmit="addDomain(); return false">
|
||||
<form onsubmit="prefDomain(); return false">
|
||||
<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>
|
||||
<img id="pic" src="img/loader.gif" />
|
||||
</form>
|
||||
<p id="urladded"><p>
|
||||
</div>
|
||||
|
||||
46
package.json
46
package.json
@@ -1,11 +1,12 @@
|
||||
{
|
||||
"name": "zulip",
|
||||
"productName": "Zulip",
|
||||
"version": "0.5.8",
|
||||
"version": "0.5.9",
|
||||
"main": "./app/main",
|
||||
"description": "Zulip Desktop App",
|
||||
"license": "Apache-2.0",
|
||||
"email":"<svnitakash@gmail.com>",
|
||||
"copyright": "©2016 Kandra Labs, Inc.",
|
||||
"email": "<svnitakash@gmail.com>",
|
||||
"copyright": "©2017 Kandra Labs, Inc.",
|
||||
"author": {
|
||||
"name": "Akash Nimare",
|
||||
"email": "svnitakash@gmail.com"
|
||||
@@ -29,7 +30,7 @@
|
||||
},
|
||||
"build": {
|
||||
"appId": "org.zulip.zulip-electron",
|
||||
"asar": "true",
|
||||
"asar": true,
|
||||
"files": [
|
||||
"**/*",
|
||||
"!node_modules/@paulcbetts/cld/deps/cld${/*}"
|
||||
@@ -38,17 +39,19 @@
|
||||
"mac": {
|
||||
"category": "public.app-category.productivity"
|
||||
},
|
||||
"linux" : {
|
||||
"synopsis": "Zulip Desktop App",
|
||||
"linux": {
|
||||
"category": "",
|
||||
"packageCategory": "GNOME;GTK;Network;InstantMessaging",
|
||||
"description": "Zulip Desktop Client for Linux",
|
||||
"target" : ["deb", "AppImage"],
|
||||
"version" : "0.5.8",
|
||||
"title" : "Zulip",
|
||||
"license": "Apache-2.0",
|
||||
"target": [
|
||||
"deb",
|
||||
"AppImage"
|
||||
],
|
||||
"maintainer": "Akash Nimare <svnitakash@gmail.com>"
|
||||
},
|
||||
"deb": {
|
||||
"synopsis": "Zulip Desktop App"
|
||||
},
|
||||
"dmg": {
|
||||
"background": "build/appdmg.png",
|
||||
"icon": "build/icon.icns",
|
||||
@@ -69,27 +72,26 @@
|
||||
},
|
||||
"win": {
|
||||
"target": "nsis",
|
||||
"icon": "build/icon.ico",
|
||||
"iconUrl": "https://raw.githubusercontent.com/zulip/zulip-electron/master/build/icon.ico"
|
||||
},
|
||||
"icon": "build/icon.ico"
|
||||
},
|
||||
"nsis": {
|
||||
"perMachine": true,
|
||||
"oneClick": false
|
||||
}
|
||||
},
|
||||
"keywords": [
|
||||
"Zulip",
|
||||
"Group Chat app",
|
||||
"electron-app",
|
||||
"electron",
|
||||
"Desktop app",
|
||||
"InstantMessaging"
|
||||
"Zulip",
|
||||
"Group Chat app",
|
||||
"electron-app",
|
||||
"electron",
|
||||
"Desktop app",
|
||||
"InstantMessaging"
|
||||
],
|
||||
"devDependencies": {
|
||||
"assert": "^1.4.1",
|
||||
"devtron": "^1.1.0",
|
||||
"electron-builder": "13.6.0",
|
||||
"electron": "1.4.7",
|
||||
"electron-builder": "16.6.0",
|
||||
"electron": "1.4.15",
|
||||
"electron-connect": "^0.4.6",
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-mocha": "^3.0.1",
|
||||
@@ -109,7 +111,7 @@
|
||||
"no-warning-comments": 0,
|
||||
"no-else-return": 0,
|
||||
"import/no-unresolved": 0,
|
||||
"import/no-extraneous-dependencies":0
|
||||
"import/no-extraneous-dependencies": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
@@ -7,7 +7,7 @@ describe('application launch', function () {
|
||||
beforeEach(function () {
|
||||
this.app = new Application({
|
||||
path: require('electron'),
|
||||
args: [__dirname + '/../app/main/index.js']
|
||||
args: [__dirname + '/../app/renderer/index.html']
|
||||
})
|
||||
return this.app.start()
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user