Compare commits

...

135 Commits

Author SHA1 Message Date
Akash Nimare
531973194c Use stable module version
Using stable version of node modules. 
Using '*' or 'latest' in node modules version could cause unexpected results and could break your code.
2017-01-03 15:14:56 +05:30
akashnimare
4d1face275 Removed electron-context-menu 2017-01-03 14:45:04 +05:30
akashnimare
ca7503f1f0 using electron-builder v10.15.1 2017-01-03 14:42:52 +05:30
Akash Nimare
9c163b4166 Merge pull request #97 from zulip/dev
export spellchecker function
2017-01-02 19:19:11 +05:30
akashnimare
742afb1c09 export spellchecker function 2017-01-02 19:15:08 +05:30
akashnimare
edf34efd86 Removed unnecessary dep. electron-dl 2016-12-31 22:26:42 +05:30
akashnimare
72ebed95da v0.5.4 2016-12-31 22:17:51 +05:30
Akash Nimare
975a6ab8bf electron-spellchecker
Downgrading since v0.7.1 is not working properly on linux.
2016-12-31 22:06:19 +05:30
akashnimare
3352301b67 :head_bandage: update electron-spellchecker 2016-12-31 20:28:09 +05:30
Akash Nimare
358260f766 Update README.md 2016-12-30 03:14:32 +05:30
Akash Nimare
b58052ce34 Merge pull request #94 from GervaisdeM/launch-script-tweak
rename zulip-electron-updater-and-launcher.sh to
2016-12-29 07:29:16 +05:30
GervaisdeM
de9ad8082b rename zulip-electron-updater-and-launcher.sh to
zulip-electron-launcher.sh

changed `npm upgrade` to `npm install`
2016-12-27 00:39:06 -04:00
akashnimare
d6bf84c821 🆙 Linux app version 2016-12-25 02:32:01 +05:30
Akash Nimare
d5cba4096d Update README.md 2016-12-23 02:40:01 +05:30
Akash Nimare
afa12cc266 Update README.md 2016-12-23 02:38:41 +05:30
Akash Nimare
42ede5e54b typo in email 2016-12-23 02:35:56 +05:30
Akash Nimare
1549db5ce0 Merge pull request #93 from zulip/autoupdates
🎉 Autoupdates for windows
2016-12-23 02:35:01 +05:30
akashnimare
a0de440c2e Unregister shortcuts on will-quit 2016-12-23 02:10:45 +05:30
akashnimare
7e54eb89c2 manage squirrel events 2016-12-23 01:48:22 +05:30
akashnimare
f8e77dfa72 Using squirrel.windows 2016-12-23 01:32:08 +05:30
akashnimare
db6d1f300a adding windows auto-update 2016-12-22 02:30:48 +05:30
Akash Nimare
eac2b92cb6 ⬆️ Test timeout 2016-12-16 15:20:03 +05:30
Akash Nimare
a349e0e4e0 Check linux travis 2016-12-16 14:32:02 +05:30
Akash Nimare
58f35569c8 Added trusty option for linux travis 2016-12-16 03:23:20 +05:30
Akash Nimare
4a9f51aa1b Autoupdate button >> later 2016-12-16 02:01:37 +05:30
Akash Nimare
5bb05906b5 Merge pull request #92 from zulip/dev
Update master with dev branch
2016-12-16 01:59:00 +05:30
akashnimare
f80095d953 Updated travis build script 2016-12-15 20:53:35 +05:30
akashnimare
181803755a fix OSX travis build 2016-12-15 20:39:50 +05:30
akashnimare
ef30cd9624 💚 Fixing CI Build 2016-12-15 20:21:05 +05:30
akashnimare
7c82f41e87 🎨 fixed linting errors 2016-12-15 19:59:12 +05:30
akashnimare
61dfcfc3b1 🐛 unregister keyboard shortcuts 2016-12-15 01:57:20 +05:30
Akash Nimare
e3deb93730 Update Zulip server 2016-12-14 03:16:45 +05:30
Akash Nimare
d6a3e5fe1b Updated zulip server 2016-12-14 03:15:33 +05:30
akashnimare
dc15edf0cd Unsubscribe spellchekcer 2016-12-14 03:02:01 +05:30
akashnimare
e5a60cc077 📦 v0.5.2-Beta 2016-12-14 01:53:00 +05:30
akashnimare
4d5c57fa0b disable auto-updates on dev mode 2016-12-14 01:11:08 +05:30
akashnimare
98bd4fd9b9 🔥 2016-12-14 00:55:29 +05:30
akashnimare
8b808ff9b2 Added auto-updates for OSX 2016-12-14 00:49:30 +05:30
akashnimare
4a2a495738 new tray icons 2016-12-10 14:39:54 +05:30
akashnimare
309816e40a tray icon fixed 2016-12-12 19:15:36 +05:30
Akash Nimare
79a31000df 📝 Updated installation instructions 2016-12-12 18:49:40 +05:30
akashnimare
8410769fdd linux icon fixed 2016-12-10 10:42:48 +05:30
Akash Nimare
fd25ac0cc4 Added Linux app category 2016-11-25 15:08:02 +05:30
akashnimare
87797cf81e App icons + linux app arch changes 2016-11-22 22:25:29 +05:30
akashnimare
4638810127 Make updater script executable 2016-11-21 23:31:39 +05:30
akashnimare
e0c2d9f6c7 zulip-electron updater script 2016-11-21 23:16:53 +05:30
akashnimare
2c34eb8ff8 🐛 Exclude spellchecker junk 2016-11-21 23:01:38 +05:30
Akash Nimare
630bafca42 Exclude spellchecker junk 2016-11-21 16:03:33 +05:30
akashnimare
9b13547336 minor changes in build option 2 2016-11-21 04:16:29 +05:30
akashnimare
07d64fa8c0 minor changes in build option 2016-11-21 04:06:46 +05:30
akashnimare
d4cb4b1572 Added MAC appID 2016-11-20 18:50:46 +05:30
Akash Nimare
de1a24c726 Added installers feature 2016-11-20 15:49:45 +05:30
Akash Nimare
e18d30a3a9 Update README.md 2016-11-19 14:41:42 +05:30
Akash Nimare
d9b6109607 Update README.md 2016-11-19 14:40:01 +05:30
Akash Nimare
6593417189 Update README.md 2016-11-19 14:36:41 +05:30
akashnimare
779c0bcf5d Added win build script options 2016-11-19 14:31:41 +05:30
Akash Nimare
39ab6aff62 💥 2016-11-19 12:08:02 +05:30
Akash Nimare
b037d1ca1f 🎉 2016-11-19 12:07:18 +05:30
akashnimare
92d2ba7ee9 Merge branch 'master' into electron-builder 2016-11-19 11:44:03 +05:30
akashnimare
557e05db7c Apache-2.0 license 2016-11-19 10:53:23 +05:30
akashnimare
c0df294dec fixed install-app-deps error 2016-11-19 10:42:10 +05:30
akashnimare
34700969ae removed electron-rebuild 2016-11-19 04:59:04 +05:30
akashnimare
1a36230cac update with master + spellchecker 2016-11-19 04:44:51 +05:30
Akash Nimare
1b9c3afdd4 Bump up electron to v1.4.7 2016-11-19 04:24:41 +05:30
Akash Nimare
b33e36b415 ✔ Added linux app category 2016-11-18 12:22:00 +05:30
Akash Nimare
7ee9bf833e Removed unnecessary devDependencies 2016-11-18 00:01:46 +05:30
akashnimare
978128ae3e Refine linux build script 2016-11-16 04:37:06 +05:30
akashnimare
ca754d5eb9 added linux build options 2016-11-14 03:47:42 +05:30
Akash Nimare
be41b4069c Merge pull request #86 from zulip/dev
Spellchecker updated 🎉
2016-11-14 00:59:17 +05:30
akashnimare
a7cf1ddbb0 spellchecker bug fixes (linux) 2016-11-13 02:32:45 +05:30
Akash Nimare
f098ae8250 updated electron-builder version 2016-11-13 02:24:33 +05:30
Akash Nimare
84ae25ed06 Installing instructions
Rebuilding node modules is needed due to native modules.
2016-11-11 04:35:02 +05:30
akashnimare
5e5270e5ed update app version 2016-11-11 04:31:40 +05:30
akashnimare
157ffb7f34 🎉 Added spellchecker suggestions 2016-11-11 04:29:59 +05:30
Akash Nimare
70e4a11fe6 Merge pull request #83 from GervaisdeM/remove-duplicate-file
Remove duplicate of script
2016-11-10 03:06:45 +05:30
GervaisdeM
f142b5bb92 Remove duplicate of script 2016-11-09 11:46:14 -04:00
Akash Nimare
f9c9f59d09 Merge pull request #80 from GervaisdeM/add-launch-script
Created script to launch zulip-electron
2016-11-08 23:50:45 +05:30
GervaisdeM
22ea0dd9f7 renamed script 2016-11-06 16:50:33 -04:00
akashnimare
1a63839f6d asar option removed to fix spellchecker 2016-11-06 19:35:51 +05:30
GervaisdeM
8ca092c403 Changes due to PR feedback 2016-10-31 12:39:37 -03:00
GervaisdeM
474e9f0194 zulip-electron-updater-and-launcher: add script.
Script will install or update all npm dependancies to run
zulip-electron.
Fixes: #77.
2016-10-24 19:17:07 -03:00
Akash Nimare
9f70068184 🐛 spellchecker path fixed 2016-10-25 03:08:59 +05:30
akashnimare
04f6e9e6e5 added dmg bg 2016-10-22 07:50:16 +05:30
akashnimare
c05885baac dmg config setup 2016-10-22 07:22:53 +05:30
akashnimare
9908ef51eb dmg configuration 2016-10-22 04:36:12 +05:30
akashnimare
a4471f35ee Fixing App icons in build script 2016-10-22 01:02:48 +05:30
akashnimare
b9c4910dd4 Added dmg build options 2016-10-22 00:51:29 +05:30
akashnimare
5c95e35839 remove node-gyp config 2016-10-21 18:45:31 +05:30
akashnimare
e068d8e96f packaging attempt 2 2016-10-21 18:42:20 +05:30
Akash Nimare
dda491938e Merge pull request #79 from zulip/dev
🆙 updated electron to v1.4.3
2016-10-12 18:34:45 +05:30
akashnimare
71637d8e92 🆙 updated electron to v1.4.3 2016-10-12 18:03:00 +05:30
akashnimare
7cbdd9cae8 Toggle feature removed 2016-10-10 18:25:02 +05:30
akashnimare
b59cd3cf23 🐯 linting errors 2016-10-10 17:47:57 +05:30
Akash Nimare
88d50fa6a6 Bump version 2016-10-10 17:30:44 +05:30
akashnimare
ef94998d21 Removed unused JS files 2016-10-10 17:28:56 +05:30
Akash Nimare
2306514507 Merge pull request #76 from zulip/dev
Jquery bug fixed
2016-10-10 16:53:38 +05:30
akashnimare
f7e3ed8a0c 😓 Fixing Jquery bug attempt 2 2016-10-06 07:43:59 +05:30
Akash Nimare
88036f864f Merge pull request #75 from steele/version-number
Use the actual version number in About page
2016-09-27 03:07:09 +05:30
James Steele
82c6782c0d Use the actual version number in About page 2016-09-23 15:12:40 +01:00
akashnimare
a72bccadf9 linting errors 2016-09-12 06:49:49 +05:30
Akash Nimare
e55928183f CSS injected 2016-09-12 04:08:15 +05:30
Akash Nimare
ef5a44dec2 insert css 😈 2016-09-12 04:04:24 +05:30
Akash Nimare
042afdf94f Merge pull request #73 from steele/cleanup-DS_Store
Remove .DS_Store files from repo
2016-09-12 03:24:57 +05:30
James Steele
e09102456f Remove .DS_Store files from repo 2016-09-11 15:07:08 +01:00
Akash Nimare
4119f1238d Added windows test suite 2016-09-11 19:01:37 +05:30
Akash Nimare
c9b2ec0bac testing appveyor 2016-09-11 18:36:31 +05:30
Akash Nimare
54bc001d46 prune removed 2016-09-11 18:26:28 +05:30
Akash Nimare
e20194fc72 🔥 appveyor >> windows test suite 2016-09-11 18:18:48 +05:30
Akash Nimare
c1ef006e40 Merge pull request #72 from steele/travis-deps-caching
Add caching of dependencies for CI builds
2016-09-11 18:01:56 +05:30
James Steele
2523f8c5d0 Add caching of dependencies for CI builds
Based upon
https://blog.travis-ci.com/2013-12-05-speed-up-your-builds-cache-your-dependencies/
2016-09-11 10:16:54 +01:00
Akash Nimare
30f44d2791 ❤️ code style XO 2016-09-11 08:52:26 +05:30
Akash Nimare
3c7369189f Updated version 2016-09-11 06:45:35 +05:30
Akash Nimare
c8bbcf2248 Merge pull request #71 from steele/fix-travis-linux
Setup for spectron on Travis CI Linux runs
2016-09-11 06:44:03 +05:30
James Steele
62963ae563 Setup for spectron on Travis CI Linux runs
Invoke test runs via travis using a separate shell script that ensures the
a suitable frame buffer is available to run chromedriver against
2016-09-11 01:00:41 +01:00
Akash Nimare
2d43ce08ad testing travis 2016-09-11 03:04:40 +05:30
Akash Nimare
2c5459233d Merge pull request #70 from steele/host-not-domain
Restrict internal links to the same host only, not all hosts in a domain
2016-09-11 02:54:25 +05:30
Akash Nimare
56bf6fe097 Update .travis.yml 2016-09-11 02:28:14 +05:30
Akash Nimare
89bc8401db Test on multiple os 2016-09-11 02:04:36 +05:30
James Steele
39f3df5b8f Restrict internal links to the same host only
A zulip service is hosted with a particular hostname and not across a
whole domain. Internal links should respect this otherwise links to other
distinct services hosted under the same domain will be loaded by the app
and not in a separate browser window.
2016-09-10 21:32:32 +01:00
Akash Nimare
5cc3bf0dc8 Merge pull request #69 from steele/windows-test-fix
Use the standard method to get the electron app location
2016-09-11 01:54:22 +05:30
James Steele
c594979d9b Use the standard method to get the electron app location
As per the guidance at
https://github.com/electron-userland/electron-prebuilt programmatic usage
acquires the path to electron by require('electron')
2016-09-10 20:37:43 +01:00
Akash Nimare
e12ad6e1d5 Make a single instance of app 🎯 2016-09-10 10:26:28 +05:30
Akash Nimare
d62b87ec0c Show travis build status 👊 2016-09-10 09:30:09 +05:30
akashnimare
14c130d102 For the build 2016-09-10 09:07:15 +05:30
Akash Nimare
c4449570a9 Update .travis.yml 2016-09-10 08:33:52 +05:30
akashnimare
011d368fd5 travis config 2016-09-10 08:21:03 +05:30
akashnimare
0d0518fcf5 move gulp-mocha to devDependencies 2016-09-10 08:03:24 +05:30
akashnimare
f1a5bfcabf 🔥 added test 2016-09-10 07:57:09 +05:30
Akash Nimare
05d483b44c Allow displaying insecure content 2016-09-10 04:34:15 +05:30
Akash Nimare
34a62e2d10 allow http content to load 2016-09-09 08:33:17 +05:30
akashnimare
99e444aec0 🐛 open images in default browser 2016-09-09 07:19:47 +05:30
akashnimare
56940dacf4 linting errors 2016-09-07 04:57:23 +05:30
akashnimare
6e6ace049a 🐛 issue#32 2016-09-07 04:53:56 +05:30
akashnimare
5e40043e3e Typo fixed 2016-09-07 04:32:47 +05:30
Akash Nimare
55b45420bd Fixed javascript error when window closed (OSX)
This https://github.com/zulip/zulip-electron/issues/32
2016-09-01 05:36:21 +05:30
44 changed files with 563 additions and 161 deletions

3
.gitignore vendored
View File

@@ -1,7 +1,8 @@
node_modules
npm-debug.log
domain.json
dist
config.gypi
// osx garbage
*.DS_Store

View File

@@ -1,3 +1,24 @@
sudo: required
dist: trusty
os:
- osx
- linux
language: node_js
node_js:
- 'node'
- '6'
before_install:
- npm install -g gulp
- npm install
cache:
directories:
- node_modules
- app/node_modules
- $HOME/.electron
- $HOME/.cache
script:
- npm run travis

View File

@@ -1,4 +1,7 @@
# Zulip Desktop Client
# Zulip Desktop Client
[![Build Status](https://travis-ci.org/zulip/zulip-electron.svg?branch=master)](https://travis-ci.org/zulip/zulip-electron)
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/zulip/zulip-electron?branch=master&svg=true)](https://ci.appveyor.com/project/akashnimare/zulip-electron/branch/master)
[![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/sindresorhus/xo)
This is an experimental replacement for the [Zulip Desktop
app](https://github.com/zulip/zulip-desktop) implemented in
@@ -8,6 +11,15 @@ The goal is to achieve feature-compatibility with the old desktop app
and then start adding cool features like easy support for
multi-account, auto-updates etc.
## Prerequisites
* node >= v6.3.1
* npm >= 3.10.3
* If you're on Debian or Ubuntu, you'll also need to install
`nodejs-legacy`:
```sh
$ sudo apt-get install nodejs-legacy
```
## Installation
Clone the source locally:
@@ -16,14 +28,6 @@ Clone the source locally:
$ git clone https://github.com/zulip/zulip-electron
$ cd zulip-electron
```
If you're on Debian or Ubuntu, you'll also need to install
`nodejs-legacy`:
Use your package manager to install `npm`.
```sh
$ sudo apt-get install npm nodejs-legacy
```
Install project dependencies:
@@ -41,19 +45,32 @@ Start and watch changes
```sh
$ npm run dev
```
# Making a release
To package app into an installer use command:
```
npm run dist
```
It will start the packaging process for operating system you are running this command on. Ready for distribution file (e.g. dmg, windows installer, deb package) will be outputted to `dist` directory.
You can create Windows installer only when running on Windows, the same is true for Linux and OSX. So to generate all three installers you need all three operating systems.
## Features
- [x] Native Notifications
- [x] Spell Checker
- [x] Keyboard Shortcuts
- Default shortcuts - <kbd>cmdOrctrl + k </kbd>
- Change Zulip Server: <kbd>cmdOrctrl + ,</kbd>
- Back: <kbd>cmdOrctrl + [</kbd>
- Forward: <kbd>cmdOrctrl + ]</kbd>
- [ ] OSX/Win/Linux installer
- [ ] Launch on OS startup
- [ ] Automatic Updates
- [x] SpellChecker
- [x] OSX/Win/Linux installer
- [x] Automatic Updates (macOS/Windows)
- [x] Keyboard shortcuts
Description | Keys
-----------------------| -----------------------
Default shortcuts | <kbd>Cmd/Ctrl</kbd> <kbd>k</kbd>
Change Zulip Server | <kbd>Cmd/Ctrl</kbd> <kbd>,</kbd>
Back | <kbd>Cmd/Ctrl</kbd> <kbd>[</kbd>
Forward | <kbd>Cmd/Ctrl</kbd> <kbd>]</kbd>
## Contribute

BIN
app/.DS_Store vendored

Binary file not shown.

50
app/main/autoupdater.js Normal file
View File

@@ -0,0 +1,50 @@
'use strict';
const os = require('os');
const {app, autoUpdater, dialog} = require('electron');
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() {
autoUpdater.setFeedURL(updaterFeedURL);
// Log whats happening
// 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('checking-for-update', () => console.log('checking-for-update'));
autoUpdater.on('update-available', () => console.log('update-available'));
autoUpdater.on('update-not-available', () => console.log('update-not-available'));
// Ask the user if update is available
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
let message = app.getName() + ' ' + releaseName + ' is now available. It will be installed the next time you restart the application.';
if (releaseNotes) {
const splitNotes = releaseNotes.split(/[^\r]\n/);
message += '\n\nRelease notes:\n';
splitNotes.forEach(notes => {
message += notes + '\n\n';
});
}
// Ask user to update the app
dialog.showMessageBox({
type: 'question',
buttons: ['Install and Relaunch', 'Later'],
defaultId: 0,
message: 'A new version of ' + app.getName() + ' has been downloaded',
detail: message
}, response => {
if (response === 0) {
setTimeout(() => autoUpdater.quitAndInstall(), 1);
}
});
});
// init for updates
autoUpdater.checkForUpdates();
}
exports = module.exports = {
appUpdater
};

View File

@@ -1,12 +1,19 @@
/* global app */
// eslint-disable-next-line no-unused-vars
function addDomain() {
const request = require('request');
const ipcRenderer = require('electron').ipcRenderer;
const JsonDB = require('node-json-db');
const {app} = require('electron').remote;
const ipcRenderer = require('electron').ipcRenderer;
const JsonDB = require('node-json-db');
const request = require('request');
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('/');
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;
@@ -20,11 +27,10 @@ function addDomain() {
document.getElementById('main').innerHTML = 'Connect';
db.push('/domain', domain);
ipcRenderer.send('new-domain', domain);
// window.location.href = domain;
} else {
document.getElementById('main').innerHTML = 'Connect';
document.getElementById('server-status').innerHTML = 'Not a vaild Zulip Server.';
}
});
}
};

View File

@@ -1,36 +1,58 @@
'use strict';
const path = require('path');
const fs = require('fs');
const electron = require('electron');
const {app} = require('electron');
const electronLocalshortcut = require('electron-localshortcut');
const ipc = require('electron').ipcMain;
const electronLocalshortcut = require('electron-localshortcut');
const Configstore = require('configstore');
const JsonDB = require('node-json-db');
const SpellChecker = require('simple-spellchecker');
const isDev = require('electron-is-dev');
const tray = require('./tray');
const appMenu = require('./menu');
const link = require('./link-helper');
const {linkIsInternal} = link;
const {linkIsInternal, skipImages} = require('./link-helper');
const {appUpdater} = require('./autoupdater');
const db = new JsonDB(app.getPath('userData') + '/domain.json', true, true);
const data = db.getData('/');
// Handling squirrel.windows events on windows
if (require('electron-squirrel-startup')) {
app.quit();
}
// adds debug features like hotkeys for triggering dev tools and reload
require('electron-debug')();
require('electron-context-menu')();
const conf = new Configstore('Zulip-Desktop');
// spellchecker enabled
let myDictionary = null;
// prevent window being garbage collected
let mainWindow;
let targetLink;
// Load this url in main window
const targetUrl = 'file://' + path.join(__dirname, '../renderer', 'index.html');
const staticURL = 'file://' + path.join(__dirname, '../renderer', 'index.html');
const targetURL = function () {
if (data.domain === undefined) {
return staticURL;
}
return data.domain;
};
const isAlreadyRunning = app.makeSingleInstance(() => {
if (mainWindow) {
if (mainWindow.isMinimized()) {
mainWindow.restore();
}
mainWindow.show();
}
});
if (isAlreadyRunning) {
app.quit();
}
function checkWindowURL() {
if (data.domain !== undefined) {
@@ -39,9 +61,11 @@ function checkWindowURL() {
return targetLink;
}
const APP_ICON = path.join(__dirname, '../resources', 'Icon');
function isWindowsOrmacOS() {
return process.platform === 'darwin' || process.platform === 'win32';
}
const spellDict = path.join(__dirname, '../../node_modules/simple-spellchecker/dict');
const APP_ICON = path.join(__dirname, '../resources', 'Icon');
const iconPath = () => {
return APP_ICON + (process.platform === 'win32' ? '.ico' : '.png');
@@ -77,12 +101,13 @@ function createMainWindow() {
minHeight: 400,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: true,
plugins: true
plugins: true,
allowDisplayingInsecureContent: true,
nodeIntegration: false
}
});
win.loadURL(targetUrl);
win.loadURL(targetURL());
win.on('closed', onClosed);
win.setTitle('Zulip');
@@ -134,6 +159,8 @@ function createMainWindow() {
app.commandLine.appendSwitch('ignore-certificate-errors', 'true');
app.on('window-all-closed', () => {
// unregister all the shortcuts so that they don't interfare with other apps
electronLocalshortcut.unregisterAll(mainWindow);
if (process.platform !== 'darwin') {
app.quit();
}
@@ -152,20 +179,6 @@ app.on('ready', () => {
const page = mainWindow.webContents;
// Add spellcheck dictionary
SpellChecker.getDictionary('en-US', spellDict, (err, result) => {
if (!err) {
myDictionary = result;
}
});
// Define function for consult the dictionary.
ipc.on('checkspell', (event, word) => {
if (myDictionary !== null && word !== null) {
event.returnValue = myDictionary.spellCheck(word);
}
});
// TODO - use global shortcut instead
electronLocalshortcut.register(mainWindow, 'CommandOrControl+R', () => {
mainWindow.reload();
@@ -183,33 +196,44 @@ app.on('ready', () => {
}
});
// electronLocalshortcut.register(mainWindow, 'CommandOrControl+=', () => {
// page.send('zoomIn');
// });
// electronLocalshortcut.register(mainWindow, 'CommandOrControl+-', () => {
// page.send('zoomOut');
// });
// electronLocalshortcut.register(mainWindow, 'CommandOrControl+0', () => {
// page.send('zoomActualSize');
// });
page.on('dom-ready', () => {
page.insertCSS(fs.readFileSync(path.join(__dirname, 'preload.css'), 'utf8'));
mainWindow.show();
});
page.on('new-window', (event, url) => {
if (mainWindow.useDefaultWindowBehaviour) {
mainWindow.useDefaultWindowBehaviour = false;
return;
}
if (linkIsInternal(checkWindowURL(), url)) {
if (linkIsInternal(checkWindowURL(), url) && url.match(skipImages) === null) {
event.preventDefault();
return mainWindow.loadURL(url);
}
event.preventDefault();
electron.shell.openExternal(url);
});
page.once('did-frame-finish-load', () => {
const checkOS = isWindowsOrmacOS();
if (checkOS && !isDev) {
// Initate auto-updates on macOs and windows
appUpdater();
}
});
});
app.on('will-quit', () => {
// unregister all the shortcuts so that they don't interfare with other apps
electronLocalshortcut.unregisterAll(mainWindow);
});
ipc.on('new-domain', (e, domain) => {
mainWindow.loadURL(domain);
// mainWindow.loadURL(domain);
if (!mainWindow) {
mainWindow = createMainWindow();
mainWindow.loadURL(domain);
} else if (mainWindow.isMinimized()) {
mainWindow.loadURL(domain);
mainWindow.show();
} else {
mainWindow.loadURL(domain);
}
targetLink = domain;
});

View File

@@ -2,11 +2,14 @@ const wurl = require('wurl');
// Check link if it's internal/external
function linkIsInternal(currentUrl, newUrl) {
const currentDomain = wurl('domain', currentUrl);
const newDomain = wurl('domain', newUrl);
const currentDomain = wurl('hostname', currentUrl);
const newDomain = wurl('hostname', newUrl);
return currentDomain === newDomain;
}
// We'll be needing this to open images in default browser
const skipImages = '.jpg|.gif|.png|.jpeg|.JPG|.PNG';
exports = module.exports = {
linkIsInternal
linkIsInternal, skipImages
};

View File

@@ -22,7 +22,6 @@ function sendAction(action) {
const viewSubmenu = [
{
label: 'Reload',
accelerator: 'CmdOrCtrl+R',
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.reload();
@@ -119,10 +118,8 @@ const darwinTpl = [
{
label: 'Change Zulip Server',
accelerator: 'Cmd+,',
click(item, focusedWindow) {
if (focusedWindow) {
addDomain();
}
click() {
addDomain();
}
},
{
@@ -247,10 +244,8 @@ const otherTpl = [
{
label: 'Change Zulip Server',
accelerator: 'Ctrl+,',
click(item, focusedWindow) {
if (focusedWindow) {
addDomain();
}
click() {
addDomain();
}
},
{

1
app/main/preload.css Normal file
View File

@@ -0,0 +1 @@
/* We'll be overriding default styling so that app look more native * /

View File

@@ -1,18 +1,11 @@
'use strict';
const ipcRenderer = require('electron').ipcRenderer;
const webFrame = require('electron').webFrame;
const {webFrame} = require('electron');
const {spellChecker} = require('./spellchecker');
// Implement spellcheck using electron api
webFrame.setSpellCheckProvider('en-US', false, {
spellCheck: text => {
const res = ipcRenderer.sendSync('checkspell', text);
return res === null ? true : res;
}
});
// Handle zooming functionality
require('./domain');
// handle zooming functionality
const zoomIn = () => {
webFrame.setZoomFactor(webFrame.getZoomFactor() + 0.1);
};
@@ -25,7 +18,7 @@ const zoomActualSize = () => {
webFrame.setZoomFactor(1);
};
// Get zooming actions from main process
// get zooming actions from main process
ipcRenderer.on('zoomIn', () => {
zoomIn();
});
@@ -53,3 +46,9 @@ ipcRenderer.on('shortcut', () => {
const nodes = document.querySelectorAll('.dropdown-menu li:nth-child(4) a');
nodes[nodes.length - 1].click();
});
// To prevent failing this script on linux we need to load it after the document loaded
document.addEventListener('DOMContentLoaded', () => {
// init spellchecker
spellChecker();
});

27
app/main/spellchecker.js Normal file
View File

@@ -0,0 +1,27 @@
const {SpellCheckHandler, ContextMenuListener, ContextMenuBuilder} = require('electron-spellchecker');
function spellChecker() {
// Implement spellcheck using electron api
window.spellCheckHandler = new SpellCheckHandler();
window.spellCheckHandler.attachToInput();
// Start off as US English
window.spellCheckHandler.switchLanguage('en-US');
const contextMenuBuilder = new ContextMenuBuilder(window.spellCheckHandler);
const contextMenuListener = new ContextMenuListener(info => {
contextMenuBuilder.showPopupMenu(info);
});
// Clean up events after you navigate away from this page;
// otherwise, you may experience errors
window.addEventListener('beforeunload', () => {
// eslint-disable-next-line no-undef
spellCheckHandler.unsubscribe();
contextMenuListener.unsubscribe();
});
}
exports = module.exports = {
spellChecker
};

View File

@@ -6,21 +6,16 @@ const {addDomain, about} = require('./windowmanager');
let tray = null;
const APP_ICON = path.join(__dirname, '../resources', 'Icon');
const APP_ICON = path.join(__dirname, '../resources/tray', 'tray');
const iconPath = () => {
return APP_ICON + (process.platform === 'win32' ? '.ico' : '.png');
if (process.platform === 'linux') {
return APP_ICON + 'linux.png';
}
return APP_ICON + (process.platform === 'win32' ? 'win.ico' : 'osx.png');
};
exports.create = () => {
// Noone is using this feature. so let's hide it for now.
// const toggleWin = () => {
// if (win.isVisible()) {
// win.hide();
// } else {
// win.show();
// }
// };
const contextMenu = electron.Menu.buildFromTemplate([
{
label: 'About',
@@ -33,10 +28,8 @@ exports.create = () => {
},
{
label: 'Change Zulip server',
click(item, focusedWindow) {
if (focusedWindow) {
addDomain();
}
click() {
addDomain();
}
},
{

41
app/package.json Normal file
View File

@@ -0,0 +1,41 @@
{
"name": "zulip",
"productName": "Zulip",
"version": "0.5.4",
"description": "Zulip Desktop App",
"license": "Apache-2.0",
"email":"<svnitakash@gmail.com>",
"copyright": "©2016 Kandra Labs, Inc.",
"author": {
"name": "Akash Nimare",
"email": "svnitakash@gmail.com"
},
"repository": {
"type": "git",
"url": "https://github.com/zulip/zulip-electron.git"
},
"bugs": {
"url": "https://github.com/zulip/zulip-electron/issues"
},
"main": "main/index.js",
"keywords": [
"Zulip",
"Group Chat app",
"electron-app",
"electron",
"Desktop app",
"InstantMessaging"
],
"dependencies": {
"electron-is-dev": "0.1.2",
"electron-squirrel-startup": "1.0.0",
"configstore": "2.1.0",
"dialogs": "1.1.14",
"electron-debug": "1.1.0",
"electron-localshortcut": "0.6.1",
"node-json-db": "0.7.3",
"request": "2.79.0",
"electron-spellchecker": "0.7.0",
"wurl": "2.1.0"
}
}

View File

@@ -7,13 +7,17 @@
<body>
<div class="about">
<center><img src="../resources/zulip.png"></center>
<center><p class="detail"> Version : 0.0.1 </p>
<center><p class="detail" id="version"> Version : ?.?.? </p>
<center><p class="detail"> License : Apache </p>
<center><p class="detail"> Maintainer : Zulip </p>
<p class="left"><a class="bug" onclick="linkInBrowser()" href="#">Found bug?</a></p>
</div>
<script>
const app = require('electron').remote.app;
const version_tag = document.getElementById('version');
version_tag.innerHTML = ' Version : ' + app.getVersion() + ' ';
function linkInBrowser(event) {
const shell = require('electron').shell;
@@ -24,4 +28,4 @@
}
</script>
</body>
</html>
</html>

View File

@@ -6,17 +6,6 @@
<meta name="viewport" content="width=device-width">
<title>Login - Zulip</title>
<link rel="stylesheet" href="css/main.css" type="text/css" media="screen">
<script type="text/javascript">
const JsonDB = require('node-json-db');
const {app} = require('electron').remote;
const db = new JsonDB(app.getPath('userData') + '/domain.json', true, true);
const data = db.getData('/');
if (data.domain) {
window.location.href = data.domain;
}
</script>
<script>require('electron-connect').client.create()</script>
</head>
<body class="container-layout">
<div class="section-main">
@@ -34,7 +23,7 @@
<fieldset>
<div class="control-group control-required">
<div class="control-field">
<input type="text" id="url" autofocus="autofocus" spellcheck="false" placeholder="zulip.tabbott.net">
<input type="text" id="url" autofocus="autofocus" spellcheck="false" placeholder="chat.zulip.org">
</div>
</div>
<div class="control-group">
@@ -49,6 +38,5 @@
</section>
</section>
</div>
<script src="js/main.js"></script>
</body>
</html>

View File

@@ -1,4 +1,5 @@
'use strict';
// eslint-disable-next-line import/no-extraneous-dependencies
const {remote} = require('electron');
const prefWindow = remote.getCurrentWindow();
@@ -15,8 +16,10 @@ document.addEventListener('keydown', event => {
// eslint-disable-next-line no-unused-vars
function addDomain() {
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 db = new JsonDB(app.getPath('userData') + '/domain.json', true, true);
@@ -39,7 +42,7 @@ function addDomain() {
} else {
document.getElementById('pic').style.display = 'none';
document.getElementById('main').innerHTML = 'Switch';
document.getElementById('urladded').innerHTML = 'Not a vaild Zulip server.';
document.getElementById('urladded').innerHTML = 'Not a vaild Zulip Server.';
}
});
}

View File

@@ -10,7 +10,7 @@
<div class="close" id="close-button">Close</div>
<div class="form">
<form onsubmit="addDomain(); return false">
<input id="url" type="text" placeholder="zulip.example.com">
<input id="url" type="text" placeholder="chat.zulip.org">
<button type="submit" id="main" value="Submit" onclick="addDomain();">
Switch</button>
<img id="pic" src="img/loader.gif" />
@@ -19,4 +19,4 @@
</div>
<script src="js/pref.js"></script>
</body>
</html>
</html>

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

23
appveyor.yml Normal file
View File

@@ -0,0 +1,23 @@
version: build{build}
platform:
- x64
os: Previous Visual Studio 2015
cache:
- node_modules
install:
- ps: Install-Product node 6 x64
- git reset --hard HEAD
- npm install npm -g
- node --version
- npm --version
- python --version
- npm install
- npm install -g gulp
build: off
test_script:
- npm run test

BIN
build/appdmg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
build/icon.icns Normal file

Binary file not shown.

BIN
build/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

BIN
build/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

3
build/icons/1024x1024.png Executable file
View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1b92ae5c6e5fb0e5b7fcdb46fe102fa0ca7f4d150016cf1a461c0e86921bc731
size 163336

BIN
build/icons/128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

BIN
build/icons/16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

BIN
build/icons/24x24.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
build/icons/256x256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
build/icons/32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
build/icons/48x48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
build/icons/512x512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
build/icons/64x64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
build/icons/96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
build/zulip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,5 +1,6 @@
'use strict';
const gulp = require('gulp');
const mocha = require('gulp-mocha');
const electron = require('electron-connect').server.create({
verbose: true
});
@@ -27,4 +28,9 @@ gulp.task('reload:renderer', done => {
done();
});
gulp.task('default', ['dev']);
// Test app using mocha+spectron
gulp.task('test', () => {
return gulp.src('tests/index.js').pipe(mocha());
});
gulp.task('default', ['dev', 'test']);

View File

@@ -1,9 +1,15 @@
{
"name": "Zulip-Desktop",
"name": "zulip",
"productName": "Zulip",
"version": "0.3.1",
"version": "0.5.4",
"description": "Zulip Desktop App",
"license": "MIT",
"license": "Apache-2.0",
"email":"<svnitakash@gmail.com>",
"copyright": "©2016 Kandra Labs, Inc.",
"author": {
"name": "Akash Nimare",
"email": "svnitakash@gmail.com"
},
"repository": {
"type": "git",
"url": "https://github.com/zulip/zulip-electron.git"
@@ -11,38 +17,77 @@
"bugs": {
"url": "https://github.com/zulip/zulip-electron/issues"
},
"main": "app/main/index.js",
"scripts": {
"test": "xo",
"start": "electron .",
"start": "electron ./app/main",
"postinstall": "install-app-deps",
"test": "gulp test && xo",
"dev": "gulp dev",
"build:osx": "electron-packager . --out=dist --app-version=$npm_package_version --prune --asar --icon=app/resources/Icon.icns --overwrite --platform=darwin --arch=x64",
"build": "electron-packager . --out=dist --app-version=$npm_package_version --prune --asar --overwrite --all"
"pack": "build --dir",
"dist": "build",
"travis": "cd ./scripts && ./travis-build-test.sh"
},
"build": {
"appId": "org.zulip.zulip-electron",
"asar": "true",
"files": [
"**/*",
"!node_modules/@paulcbetts/cld/deps/cld${/*}"
],
"copyright": "©2016 Kandra Labs, Inc.",
"mac": {
"category": "public.app-category.productivity"
},
"linux" : {
"synopsis": "Zulip Desktop App",
"category": "",
"packageCategory": "GNOME;GTK;Network;InstantMessaging",
"description": "Zulip Desktop Client for Linux",
"target" : ["deb", "AppImage"],
"version" : "0.5.4",
"title" : "Zulip",
"license": "Apache-2.0",
"maintainer": "Akash Nimare <svnitakash@gmail.com>"
},
"dmg": {
"background": "build/appdmg.png",
"icon": "build/icon.icns",
"iconSize": 128,
"contents": [
{
"x": 380,
"y": 240,
"type": "link",
"path": "/Applications"
},
{
"x": 122,
"y": 240,
"type": "file"
}
]
},
"win": {
"target": "squirrel",
"icon": "build/icon.ico"
}
},
"keywords": [
"Zulip",
"Group Chat app",
"electron-app",
"electron"
"Zulip",
"Group Chat app",
"electron-app",
"electron",
"Desktop app",
"InstantMessaging"
],
"dependencies": {
"configstore": "^2.0.0",
"dialogs": "1.1.14",
"electron-context-menu": "0.4.0",
"electron-debug": "^1.0.0",
"electron-dl": "^0.2.0",
"electron-localshortcut": "^0.6.1",
"node-json-db": "^0.7.2",
"request": "^2.74.0",
"simple-spellchecker": "^0.9.0",
"wurl": "^2.1.0"
},
"devDependencies": {
"assert": "^1.4.1",
"devtron": "^1.1.0",
"electron": "1.3.3",
"electron-builder": "10.15.1",
"electron": "1.4.7",
"electron-connect": "^0.4.6",
"electron-packager": "^7.0.0",
"gulp": "^3.9.1",
"gulp-mocha": "^3.0.1",
"spectron": "^3.3.0",
"xo": "*"
},
"xo": {
@@ -55,13 +100,20 @@
"warn",
350
],
"no-warning-comments": 0
"no-warning-comments": 0,
"no-else-return": 0,
"import/no-unresolved": 0,
"import/no-extraneous-dependencies":0
}
}
],
"ignore": [
"tests/*.js"
],
"envs": [
"node",
"browser"
"browser",
"mocha"
]
}
}
}

9
scripts/travis-build-test.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env bash
if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
export DISPLAY=:99.0
sh -e /etc/init.d/xvfb start
sleep 3
fi
npm run test

27
tests/index.js Normal file
View File

@@ -0,0 +1,27 @@
const assert = require('assert')
const Application = require('spectron').Application
describe('application launch', function () {
this.timeout(15000)
beforeEach(function () {
this.app = new Application({
path: require('electron'),
args: [__dirname + '/../app/main/index.js']
})
return this.app.start()
})
afterEach(function () {
if (this.app && this.app.isRunning()) {
return this.app.stop()
}
})
it('shows an initial window', function () {
return this.app.client.getWindowCount().then(function (count) {
assert.equal(count, 1)
})
})
})

109
zulip-electron-launcher.sh Executable file
View File

@@ -0,0 +1,109 @@
#!/bin/bash
# Zulip Beta Client Launcher
# This script ensures that you have the latest version of the specified branch
# (defaults to master if none specified) and then updates or installs all your
# required npm modules.
# I recommend symlinking this script into your PATH.
# {{{ showUsage()
showUsage()
{
echo "Usage: $0 <branch_name>"
echo "Example: $0 dev"
exit 1
}
# }}}
# {{{ envSetup()
envSetup()
{
defaultBranch="master"
startingDir=`pwd`
requirePop=0
# Check command line arguments
if [ "$#" -gt "1" ]
then
showUsage
elif [ "$#" -eq "1" ]
then
myBranch=$1
else
myBranch=$defaultBranch
fi
# Set workingDir
if [ -L $0 ]
then
realPath=`ls -l $0 | cut -d '>' -f 2`
workingDir=`dirname $realPath`
else
workingDir="."
fi
# Set name of upstreamRemote
cd $workingDir
git remote -v | grep "github\.com.zulip.zulip-electron.git (fetch)" > /dev/null 2>&1
if [ $? -eq 0 ]
then
upstreamRemote=`git remote -v | grep "github\.com.zulip.zulip-electron.git (fetch)" | awk '{ print $1 }'`
else
upstreamRemote="origin"
fi
}
# }}}
# {{{ gitCheckout()
gitCheckout()
{
git fetch $upstreamRemote
git checkout $myBranch
git rebase $upstreamRemote/master
if [ $? -gt 0 ]
then
echo "Stashing uncommitted changes and doing a new git pull"
git stash && requirePop=1
git rebase $upstreamRemote/master
fi
}
# }}}
# {{{ npmInstallStart()
npmInstallStart()
{
npm install
npm start &
}
# }}}
# {{{ cleanUp()
cleanUp()
{
# Switch back to branch we started on
git checkout -
# Pop if we stashed
if [ $requirePop -eq 1 ]
then
echo "Popping out uncommitted changes"
git stash pop
fi
# Return the whatever dir we started in
cd $startingDir
}
# }}}
envSetup $*
gitCheckout
npmInstallStart
cleanUp