mirror of
				https://github.com/zulip/zulip-desktop.git
				synced 2025-10-31 03:53:34 +00:00 
			
		
		
		
	Compare commits
	
		
			67 Commits
		
	
	
		
			v2.3.8
			...
			windows-re
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 3768ec6055 | ||
|  | c029e70046 | ||
|  | 4773ab0d15 | ||
|  | a2e84595c9 | ||
|  | 9e33ebae62 | ||
|  | 9bdc5dd9e4 | ||
|  | ac89ac1cb4 | ||
|  | 31da1131a4 | ||
|  | 4980c71e5a | ||
|  | 3e73511357 | ||
|  | 5f23c8570b | ||
|  | 12f79e18a1 | ||
|  | ad7f760444 | ||
|  | 7314c1f1dd | ||
|  | 46c3d352a1 | ||
|  | cef8eadc8f | ||
|  | d3f742719c | ||
|  | 171d88755c | ||
|  | 09ac1bd338 | ||
|  | 48dd12b738 | ||
|  | 61bbd1cf22 | ||
|  | bf722da390 | ||
|  | c24f5b3e45 | ||
|  | 3d0f4d88af | ||
|  | a2f412c3de | ||
|  | 08559c2f4a | ||
|  | 1f4509a6d2 | ||
|  | 06c8b2e8a2 | ||
|  | 2aa15ee11a | ||
|  | 3c676672ec | ||
|  | c937317ecf | ||
|  | 44dceda50e | ||
|  | e1407cb6f7 | ||
|  | 6899a6bc20 | ||
|  | 925fec71d5 | ||
|  | f847c565f9 | ||
|  | c2a380d308 | ||
|  | ac6b206583 | ||
|  | 988405c665 | ||
|  | a209804692 | ||
|  | 95c4df1898 | ||
|  | 1048c91d9e | ||
|  | d723c5cd1c | ||
|  | dcc7cd118c | ||
|  | d2649dd5d7 | ||
|  | 25e6f6d482 | ||
|  | bd805b8324 | ||
|  | e1d98e0d8e | ||
|  | 89e5d2892b | ||
|  | ab28b56377 | ||
|  | 71aa7e28ba | ||
|  | ba2bfba459 | ||
|  | d181b0c2e5 | ||
|  | bda5c62928 | ||
|  | b2b4fd1003 | ||
|  | 19770f5fbf | ||
|  | 4592396c4b | ||
|  | 19d3c0f5b5 | ||
|  | af87789c7f | ||
|  | 36e710dbfe | ||
|  | a6e1c93d81 | ||
|  | 684d88dd7f | ||
|  | 45aedbd9db | ||
|  | 6f411a819c | ||
|  | 097738332b | ||
|  | b777f8a50f | ||
|  | 50f06239bb | 
							
								
								
									
										17
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1,16 @@ | ||||
| * text=auto | ||||
| * text=auto eol=lf | ||||
|  | ||||
| package-lock.json binary | ||||
| app/package-lock.json binary | ||||
| *.gif binary | ||||
| *.jpg binary | ||||
| *.jpeg binary | ||||
| *.eot binary | ||||
| *.woff binary | ||||
| *.woff2 binary | ||||
| *.svg binary | ||||
| *.ttf binary | ||||
| *.png binary | ||||
| *.otf binary | ||||
| *.tif binary | ||||
| *.ogg binary | ||||
|   | ||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -33,6 +33,6 @@ yarn-error.log* | ||||
| config.gypi | ||||
|  | ||||
| # Test generated files | ||||
| tests/package.json | ||||
| # tests/package.json | ||||
|  | ||||
| .python-version | ||||
|   | ||||
| @@ -12,7 +12,7 @@ Desktop client for Zulip. Available for Mac, Linux, and Windows. | ||||
| Please see the [installation guide](https://zulipchat.com/help/desktop-app-install-guide). | ||||
|  | ||||
| # Features | ||||
| * Sign in to multiple teams | ||||
| * Sign in to multiple organizations | ||||
| * Desktop notifications with inline reply | ||||
| * Tray/dock integration | ||||
| * Multi-language spell checker | ||||
|   | ||||
| @@ -32,7 +32,9 @@ let isQuitting = false; | ||||
| // Load this url in main window | ||||
| const mainURL = 'file://' + path.join(__dirname, '../renderer', 'main.html'); | ||||
|  | ||||
| const isAlreadyRunning = app.makeSingleInstance(() => { | ||||
| const singleInstanceLock = app.requestSingleInstanceLock(); | ||||
| if (singleInstanceLock) { | ||||
| 	app.on('second-instance', () => { | ||||
| 		if (mainWindow) { | ||||
| 			if (mainWindow.isMinimized()) { | ||||
| 				mainWindow.restore(); | ||||
| @@ -41,9 +43,8 @@ const isAlreadyRunning = app.makeSingleInstance(() => { | ||||
| 			mainWindow.show(); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| if (isAlreadyRunning) { | ||||
| 	return app.quit(); | ||||
| } else { | ||||
| 	app.quit(); | ||||
| } | ||||
|  | ||||
| const APP_ICON = path.join(__dirname, '../resources', 'Icon'); | ||||
| @@ -85,14 +86,6 @@ function createMainWindow() { | ||||
| 		win.webContents.send('focus'); | ||||
| 	}); | ||||
|  | ||||
| 	win.once('ready-to-show', () => { | ||||
| 		if (ConfigUtil.getConfigItem('startMinimized')) { | ||||
| 			win.minimize(); | ||||
| 		} else { | ||||
| 			win.show(); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	win.loadURL(mainURL); | ||||
|  | ||||
| 	// Keep the app running in background on close event | ||||
| @@ -178,7 +171,7 @@ app.on('ready', () => { | ||||
|  | ||||
| 	page.on('dom-ready', () => { | ||||
| 		if (ConfigUtil.getConfigItem('startMinimized')) { | ||||
| 			mainWindow.minimize(); | ||||
| 			mainWindow.hide(); | ||||
| 		} else { | ||||
| 			mainWindow.show(); | ||||
| 		} | ||||
| @@ -205,31 +198,31 @@ app.on('ready', () => { | ||||
| 		app.quit(); | ||||
| 	}); | ||||
|  | ||||
| 	// Show pdf in a new BrowserWindow | ||||
| 	ipcMain.on('pdf-view', (event, url) => { | ||||
| 		// Paddings for pdfWindow so that it fits into the main browserWindow | ||||
| 		const paddingWidth = 55; | ||||
| 		const paddingHeight = 22; | ||||
| 	// Code to show pdf in a new BrowserWindow (currently commented out due to bug-upstream) | ||||
| 	// ipcMain.on('pdf-view', (event, url) => { | ||||
| 	// 	// Paddings for pdfWindow so that it fits into the main browserWindow | ||||
| 	// 	const paddingWidth = 55; | ||||
| 	// 	const paddingHeight = 22; | ||||
|  | ||||
| 		// Get the config of main browserWindow | ||||
| 		const mainWindowState = global.mainWindowState; | ||||
| 	// 	// Get the config of main browserWindow | ||||
| 	// 	const mainWindowState = global.mainWindowState; | ||||
|  | ||||
| 		// Window to view the pdf file | ||||
| 		const pdfWindow = new electron.BrowserWindow({ | ||||
| 			x: mainWindowState.x + paddingWidth, | ||||
| 			y: mainWindowState.y + paddingHeight, | ||||
| 			width: mainWindowState.width - paddingWidth, | ||||
| 			height: mainWindowState.height - paddingHeight, | ||||
| 			webPreferences: { | ||||
| 				plugins: true, | ||||
| 				partition: 'persist:webviewsession' | ||||
| 			} | ||||
| 		}); | ||||
| 		pdfWindow.loadURL(url); | ||||
| 	// 	// Window to view the pdf file | ||||
| 	// 	const pdfWindow = new electron.BrowserWindow({ | ||||
| 	// 		x: mainWindowState.x + paddingWidth, | ||||
| 	// 		y: mainWindowState.y + paddingHeight, | ||||
| 	// 		width: mainWindowState.width - paddingWidth, | ||||
| 	// 		height: mainWindowState.height - paddingHeight, | ||||
| 	// 		webPreferences: { | ||||
| 	// 			plugins: true, | ||||
| 	// 			partition: 'persist:webviewsession' | ||||
| 	// 		} | ||||
| 	// 	}); | ||||
| 	// 	pdfWindow.loadURL(url); | ||||
|  | ||||
| 		// We don't want to have the menu bar in pdf window | ||||
| 		pdfWindow.setMenu(null); | ||||
| 	}); | ||||
| 	// 	// We don't want to have the menu bar in pdf window | ||||
| 	// 	pdfWindow.setMenu(null); | ||||
| 	// }); | ||||
|  | ||||
| 	// Reload full app not just webview, useful in debugging | ||||
| 	ipcMain.on('reload-full-app', () => { | ||||
| @@ -276,6 +269,10 @@ app.on('ready', () => { | ||||
|  | ||||
| 	ipcMain.on('update-menu', (event, props) => { | ||||
| 		appMenu.setMenu(props); | ||||
| 		const activeTab = props.tabs[props.activeTabIndex]; | ||||
| 		if (activeTab) { | ||||
| 			mainWindow.setTitle(`Zulip - ${activeTab.webview.props.name}`); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	ipcMain.on('toggleAutoLauncher', (event, AutoLaunchValue) => { | ||||
|   | ||||
| @@ -21,7 +21,8 @@ function linuxUpdateNotification() { | ||||
| 	const options = { | ||||
| 		url, | ||||
| 		headers: {'User-Agent': 'request'}, | ||||
| 		proxy: proxyEnabled ? ProxyUtil.getProxy(url) : '' | ||||
| 		proxy: proxyEnabled ? ProxyUtil.getProxy(url) : '', | ||||
| 		ecdhCurve: 'auto' | ||||
| 	}; | ||||
|  | ||||
| 	request(options, (error, response, body) => { | ||||
|   | ||||
							
								
								
									
										169
									
								
								app/main/menu.js
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								app/main/menu.js
									
									
									
									
									
								
							| @@ -39,6 +39,65 @@ class AppMenu { | ||||
| 		}]; | ||||
| 	} | ||||
|  | ||||
| 	getToolsSubmenu() { | ||||
| 		return [{ | ||||
| 			label: `Check for Updates`, | ||||
| 			click() { | ||||
| 				AppMenu.checkForUpdate(); | ||||
| 			} | ||||
| 		}, | ||||
| 		{ | ||||
| 			label: `Release Notes`, | ||||
| 			click() { | ||||
| 				shell.openExternal(`https://github.com/zulip/zulip-electron/releases/tag/v${app.getVersion()}`); | ||||
| 			} | ||||
| 		}, { | ||||
| 			type: 'separator' | ||||
| 		}, { | ||||
| 			label: 'Factory Reset', | ||||
| 			accelerator: process.platform === 'darwin' ? 'Command+Shift+D' : 'Ctrl+Shift+D', | ||||
| 			click() { | ||||
| 				AppMenu.resetAppSettings(); | ||||
| 			} | ||||
| 		}, { | ||||
| 			label: 'Download App Logs', | ||||
| 			click() { | ||||
| 				const zip = new AdmZip(); | ||||
| 				let date = new Date(); | ||||
| 				date = date.toLocaleDateString().replace(/\//g, '-'); | ||||
|  | ||||
| 				// Create a zip file of all the logs and config data | ||||
| 				zip.addLocalFolder(`${app.getPath('appData')}/${appName}/Logs`); | ||||
| 				zip.addLocalFolder(`${app.getPath('appData')}/${appName}/config`); | ||||
|  | ||||
| 				// Put the log file in downloads folder | ||||
| 				const logFilePath = `${app.getPath('downloads')}/Zulip-logs-${date}.zip`; | ||||
| 				zip.writeZip(logFilePath); | ||||
|  | ||||
| 				// Open and select the log file | ||||
| 				shell.showItemInFolder(logFilePath); | ||||
| 			} | ||||
| 		}, { | ||||
| 			type: 'separator' | ||||
| 		}, { | ||||
| 			label: 'Toggle DevTools for Zulip App', | ||||
| 			accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', | ||||
| 			click(item, focusedWindow) { | ||||
| 				if (focusedWindow) { | ||||
| 					focusedWindow.webContents.toggleDevTools(); | ||||
| 				} | ||||
| 			} | ||||
| 		}, { | ||||
| 			label: 'Toggle DevTools for Active Tab', | ||||
| 			accelerator: process.platform === 'darwin' ? 'Alt+Command+U' : 'Ctrl+Shift+U', | ||||
| 			click(item, focusedWindow) { | ||||
| 				if (focusedWindow) { | ||||
| 					AppMenu.sendAction('tab-devtools'); | ||||
| 				} | ||||
| 			} | ||||
| 		}]; | ||||
| 	} | ||||
|  | ||||
| 	getViewSubmenu() { | ||||
| 		return [{ | ||||
| 			label: 'Reload', | ||||
| @@ -103,62 +162,30 @@ class AppMenu { | ||||
| 					ConfigUtil.setConfigItem('showSidebar', newValue); | ||||
| 				} | ||||
| 			} | ||||
| 		}, { | ||||
| 			label: 'Toggle DevTools for Zulip App', | ||||
| 			accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', | ||||
| 			click(item, focusedWindow) { | ||||
| 				if (focusedWindow) { | ||||
| 					focusedWindow.webContents.toggleDevTools(); | ||||
| 				} | ||||
| 			} | ||||
| 		}, { | ||||
| 			label: 'Toggle DevTools for Active Tab', | ||||
| 			accelerator: process.platform === 'darwin' ? 'Alt+Command+U' : 'Ctrl+Shift+U', | ||||
| 			click(item, focusedWindow) { | ||||
| 				if (focusedWindow) { | ||||
| 					AppMenu.sendAction('tab-devtools'); | ||||
| 				} | ||||
| 			} | ||||
| 		}]; | ||||
| 	} | ||||
|  | ||||
| 	getHelpSubmenu() { | ||||
| 		return [ | ||||
| 			{ | ||||
| 				label: `${appName + ' Desktop-'} v${app.getVersion()}`, | ||||
| 				label: `${appName + ' Desktop'} v${app.getVersion()}`, | ||||
| 				enabled: false | ||||
| 			}, | ||||
| 			{ | ||||
| 				label: `What's New...`, | ||||
| 				click() { | ||||
| 					shell.openExternal(`https://github.com/zulip/zulip-electron/releases/tag/v${app.getVersion()}`); | ||||
| 				label: 'About Zulip', | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| 						AppMenu.sendAction('open-about'); | ||||
| 					} | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
| 				label: `${appName} Help`, | ||||
| 				label: `Help Center`, | ||||
| 				click() { | ||||
| 					shell.openExternal('https://zulipchat.com/help/'); | ||||
| 				} | ||||
| 			}, { | ||||
| 				label: 'Show App Logs', | ||||
| 				click() { | ||||
| 					const zip = new AdmZip(); | ||||
| 					let date = new Date(); | ||||
| 					date = date.toLocaleDateString().replace(/\//g, '-'); | ||||
|  | ||||
| 					// Create a zip file of all the logs and config data | ||||
| 					zip.addLocalFolder(`${app.getPath('appData')}/${appName}/Logs`); | ||||
| 					zip.addLocalFolder(`${app.getPath('appData')}/${appName}/config`); | ||||
|  | ||||
| 					// Put the log file in downloads folder | ||||
| 					const logFilePath = `${app.getPath('downloads')}/Zulip-logs-${date}.zip`; | ||||
| 					zip.writeZip(logFilePath); | ||||
|  | ||||
| 					// Open and select the log file | ||||
| 					shell.showItemInFolder(logFilePath); | ||||
| 				} | ||||
| 			}, { | ||||
| 				label: 'Report an Issue...', | ||||
| 				label: 'Report an Issue', | ||||
| 				click() { | ||||
| 					// the goal is to notify the main.html BrowserWindow | ||||
| 					// which may not be the focused window. | ||||
| @@ -205,26 +232,12 @@ class AppMenu { | ||||
| 	} | ||||
|  | ||||
| 	getDarwinTpl(props) { | ||||
| 		const { tabs, activeTabIndex } = props; | ||||
| 		const { tabs, activeTabIndex, enableMenu } = props; | ||||
|  | ||||
| 		return [{ | ||||
| 			label: `${app.getName()}`, | ||||
| 			submenu: [{ | ||||
| 				label: 'About Zulip', | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| 						AppMenu.sendAction('open-about'); | ||||
| 					} | ||||
| 				} | ||||
| 			}, { | ||||
| 				label: `Check for Update`, | ||||
| 				click() { | ||||
| 					AppMenu.checkForUpdate(); | ||||
| 				} | ||||
| 			}, { | ||||
| 				type: 'separator' | ||||
| 			}, { | ||||
| 				label: 'Desktop App Settings', | ||||
| 				label: 'Desktop Settings', | ||||
| 				accelerator: 'Cmd+,', | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| @@ -234,6 +247,7 @@ class AppMenu { | ||||
| 			}, { | ||||
| 				label: 'Keyboard Shortcuts', | ||||
| 				accelerator: 'Cmd+Shift+K', | ||||
| 				enabled: enableMenu, | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| 						AppMenu.sendAction('shortcut'); | ||||
| @@ -248,15 +262,10 @@ class AppMenu { | ||||
| 					const dndUtil = DNDUtil.toggle(); | ||||
| 					AppMenu.sendAction('toggle-dnd', dndUtil.dnd, dndUtil.newSettings); | ||||
| 				} | ||||
| 			}, { | ||||
| 				label: 'Reset App Settings', | ||||
| 				accelerator: 'Command+Shift+D', | ||||
| 				click() { | ||||
| 					AppMenu.resetAppSettings(); | ||||
| 				} | ||||
| 			}, { | ||||
| 				label: 'Log Out', | ||||
| 				accelerator: 'Cmd+L', | ||||
| 				enabled: enableMenu, | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| 						AppMenu.sendAction('log-out'); | ||||
| @@ -296,8 +305,6 @@ class AppMenu { | ||||
| 				role: 'paste' | ||||
| 			}, { | ||||
| 				role: 'pasteandmatchstyle' | ||||
| 			}, { | ||||
| 				role: 'delete' | ||||
| 			}, { | ||||
| 				role: 'selectall' | ||||
| 			}] | ||||
| @@ -310,6 +317,9 @@ class AppMenu { | ||||
| 		}, { | ||||
| 			label: 'Window', | ||||
| 			submenu: this.getWindowSubmenu(tabs, activeTabIndex) | ||||
| 		}, { | ||||
| 			label: 'Tools', | ||||
| 			submenu: this.getToolsSubmenu() | ||||
| 		}, { | ||||
| 			role: 'help', | ||||
| 			submenu: this.getHelpSubmenu() | ||||
| @@ -317,26 +327,12 @@ class AppMenu { | ||||
| 	} | ||||
|  | ||||
| 	getOtherTpl(props) { | ||||
| 		const { tabs, activeTabIndex } = props; | ||||
| 		const { tabs, activeTabIndex, enableMenu } = props; | ||||
|  | ||||
| 		return [{ | ||||
| 			label: '&File', | ||||
| 			submenu: [{ | ||||
| 				label: 'About Zulip', | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| 						AppMenu.sendAction('open-about'); | ||||
| 					} | ||||
| 				} | ||||
| 			}, { | ||||
| 				label: `Check for Update`, | ||||
| 				click() { | ||||
| 					AppMenu.checkForUpdate(); | ||||
| 				} | ||||
| 			}, { | ||||
| 				type: 'separator' | ||||
| 			}, { | ||||
| 				label: 'Desktop App Settings', | ||||
| 				label: 'Desktop Settings', | ||||
| 				accelerator: 'Ctrl+,', | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| @@ -348,6 +344,7 @@ class AppMenu { | ||||
| 			}, { | ||||
| 				label: 'Keyboard Shortcuts', | ||||
| 				accelerator: 'Ctrl+Shift+K', | ||||
| 				enabled: enableMenu, | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| 						AppMenu.sendAction('shortcut'); | ||||
| @@ -362,15 +359,10 @@ class AppMenu { | ||||
| 					const dndUtil = DNDUtil.toggle(); | ||||
| 					AppMenu.sendAction('toggle-dnd', dndUtil.dnd, dndUtil.newSettings); | ||||
| 				} | ||||
| 			}, { | ||||
| 				label: 'Reset App Settings', | ||||
| 				accelerator: 'Ctrl+Shift+D', | ||||
| 				click() { | ||||
| 					AppMenu.resetAppSettings(); | ||||
| 				} | ||||
| 			}, { | ||||
| 				label: 'Log Out', | ||||
| 				accelerator: 'Ctrl+L', | ||||
| 				enabled: enableMenu, | ||||
| 				click(item, focusedWindow) { | ||||
| 					if (focusedWindow) { | ||||
| 						AppMenu.sendAction('log-out'); | ||||
| @@ -398,8 +390,6 @@ class AppMenu { | ||||
| 				role: 'paste' | ||||
| 			}, { | ||||
| 				role: 'pasteandmatchstyle' | ||||
| 			}, { | ||||
| 				role: 'delete' | ||||
| 			}, { | ||||
| 				type: 'separator' | ||||
| 			}, { | ||||
| @@ -414,6 +404,9 @@ class AppMenu { | ||||
| 		}, { | ||||
| 			label: '&Window', | ||||
| 			submenu: this.getWindowSubmenu(tabs, activeTabIndex) | ||||
| 		}, { | ||||
| 			label: '&Tools', | ||||
| 			submenu: this.getToolsSubmenu() | ||||
| 		}, { | ||||
| 			label: '&Help', | ||||
| 			role: 'help', | ||||
|   | ||||
							
								
								
									
										320
									
								
								app/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										320
									
								
								app/package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,13 +1,13 @@ | ||||
| { | ||||
|   "name": "zulip", | ||||
|   "version": "2.3.8", | ||||
|   "version": "2.5.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|     "@electron-elements/send-feedback": { | ||||
|       "version": "1.0.7", | ||||
|       "resolved": "https://registry.npmjs.org/@electron-elements/send-feedback/-/send-feedback-1.0.7.tgz", | ||||
|       "integrity": "sha1-HmTsFMvNkmZAngeu1BDoUi45deA=", | ||||
|       "version": "1.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/@electron-elements/send-feedback/-/send-feedback-1.0.8.tgz", | ||||
|       "integrity": "sha512-spIZIYSe0Bp028sbZ7bcGOaUYhMyFArk+Tv7kQ4XCRNuVWRkw3SfbR8zIljZAdUavJp0wX6prSWrqLL4Dpd3Fw==", | ||||
|       "requires": { | ||||
|         "@electron-elements/utils": "1.0.3" | ||||
|       } | ||||
| @@ -37,91 +37,93 @@ | ||||
|       } | ||||
|     }, | ||||
|     "@sentry/browser": { | ||||
|       "version": "4.0.0-rc.1", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-4.0.0-rc.1.tgz", | ||||
|       "integrity": "sha512-25OFHqY/qKA4W5xetljv0QL+HJM0OzbFOLjrnZ//+ugNQ0QKIM0oCq8gP18p3rwhQ/JbnTA6jSmyI7uHpLQ2Tg==", | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-4.3.4.tgz", | ||||
|       "integrity": "sha512-odRXxnhcSYzyR4YvTolNEyrz3fdDVw308l+9RBRJA9yOFVlezaz1mXH6Gv00F7cIj9yE/JtezDyhP339WsWy3w==", | ||||
|       "requires": { | ||||
|         "@sentry/core": "4.0.0-rc.1", | ||||
|         "@sentry/hub": "4.0.0-rc.1", | ||||
|         "@sentry/minimal": "4.0.0-rc.1", | ||||
|         "@sentry/types": "4.0.0-rc.1", | ||||
|         "@sentry/utils": "4.0.0-rc.1", | ||||
|         "md5": "2.2.1" | ||||
|         "@sentry/core": "4.3.4", | ||||
|         "@sentry/types": "4.3.4", | ||||
|         "@sentry/utils": "4.3.4", | ||||
|         "tslib": "^1.9.3" | ||||
|       } | ||||
|     }, | ||||
|     "@sentry/core": { | ||||
|       "version": "4.0.0-rc.1", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.0.0-rc.1.tgz", | ||||
|       "integrity": "sha512-ffaVGh41YwAKK8d2h6vYmVspDmAPfoo45rZzF9ygH5dxHu51eaFhSuQGNtYwD9at2l9kP8jd+4bsdPqPC6QTzQ==", | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.3.4.tgz", | ||||
|       "integrity": "sha512-KwolQmAnXiFMeXBuxPUM8fW+2bOICdHfpjdf83qD7WSeuKqGvXhxXyApWNSLE+l2DPO6/8UKnIGmR8bEn0G7QA==", | ||||
|       "requires": { | ||||
|         "@sentry/hub": "4.0.0-rc.1", | ||||
|         "@sentry/minimal": "4.0.0-rc.1", | ||||
|         "@sentry/types": "4.0.0-rc.1", | ||||
|         "@sentry/utils": "4.0.0-rc.1" | ||||
|         "@sentry/hub": "4.3.4", | ||||
|         "@sentry/minimal": "4.3.4", | ||||
|         "@sentry/types": "4.3.4", | ||||
|         "@sentry/utils": "4.3.4", | ||||
|         "tslib": "^1.9.3" | ||||
|       } | ||||
|     }, | ||||
|     "@sentry/electron": { | ||||
|       "version": "0.9.0", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-0.9.0.tgz", | ||||
|       "integrity": "sha512-VeLXLMLp5JUj/TyF0t1U73qJt2nPbwa+XO8Sb9eNz/R+IoALyGugG2BtYMHGwvHitOvodNlzBNH/fFsrEkdLEg==", | ||||
|       "version": "0.14.0", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-0.14.0.tgz", | ||||
|       "integrity": "sha512-f0Aj2gKcX9LampOEFER0m6cC4etT1B3bsuY7E1R3vzZXcL7y5TaH2Omgk5atzAX5ycBk8LHxhVqUtE6fZBWlFA==", | ||||
|       "requires": { | ||||
|         "@sentry/browser": "4.0.0-rc.1", | ||||
|         "@sentry/core": "4.0.0-rc.1", | ||||
|         "@sentry/hub": "4.0.0-rc.1", | ||||
|         "@sentry/minimal": "4.0.0-rc.1", | ||||
|         "@sentry/node": "4.0.0-rc.1", | ||||
|         "@sentry/types": "4.0.0-rc.1", | ||||
|         "@sentry/utils": "4.0.0-rc.1", | ||||
|         "@sentry/browser": "~4.3.4", | ||||
|         "@sentry/core": "~4.3.4", | ||||
|         "@sentry/minimal": "~4.3.4", | ||||
|         "@sentry/node": "~4.3.4", | ||||
|         "@sentry/types": "~4.3.4", | ||||
|         "@sentry/utils": "~4.3.4", | ||||
|         "electron-fetch": "1.1.0", | ||||
|         "form-data": "2.3.2", | ||||
|         "util.promisify": "1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "@sentry/hub": { | ||||
|       "version": "4.0.0-rc.1", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.0.0-rc.1.tgz", | ||||
|       "integrity": "sha512-MxFiOTxkOBvEwviXAjEnJABicQJ14+FOxkcXCfOfDYdi3AhgDCW5qcRgmZLCUbqOQLKZ4LnOYnvbUld871+NGw==", | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.3.4.tgz", | ||||
|       "integrity": "sha512-vaBGCnhinLB8N4aQLMiPPhnlTkIUwU/dxWzw/xsuKY3MYWrmfMUyWgMZF60Mz3B4F0lW1lsg5jnJz9xPnjZowg==", | ||||
|       "requires": { | ||||
|         "@sentry/types": "4.0.0-rc.1", | ||||
|         "@sentry/utils": "4.0.0-rc.1" | ||||
|         "@sentry/types": "4.3.4", | ||||
|         "@sentry/utils": "4.3.4", | ||||
|         "tslib": "^1.9.3" | ||||
|       } | ||||
|     }, | ||||
|     "@sentry/minimal": { | ||||
|       "version": "4.0.0-rc.1", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.0.0-rc.1.tgz", | ||||
|       "integrity": "sha512-GxJdeRCgrrA/bWv1vBvQFUkIcY53xDRTxtHpoP5Mvid7AAW8sJaSZmllyFLn8m1izyIHrmVrHCIG5efo7d3mlA==", | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.3.4.tgz", | ||||
|       "integrity": "sha512-EBmQgdAQgxkhWFsBO4TmsP3cg5yTzg48HmPe3Dyt7PtF5Umw3DFW6qboAqnN1+KF+pHNuxkqevvgBTFp7b4Saw==", | ||||
|       "requires": { | ||||
|         "@sentry/hub": "4.0.0-rc.1", | ||||
|         "@sentry/types": "4.0.0-rc.1" | ||||
|         "@sentry/hub": "4.3.4", | ||||
|         "@sentry/types": "4.3.4", | ||||
|         "tslib": "^1.9.3" | ||||
|       } | ||||
|     }, | ||||
|     "@sentry/node": { | ||||
|       "version": "4.0.0-rc.1", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/node/-/node-4.0.0-rc.1.tgz", | ||||
|       "integrity": "sha512-syf8A6APBx2UDSRCmUIUOsWhNc0lGt+M6TJLh6iSvZtsuFQxEVusUH3SrbX9O3m1HQ6XSdUXUZ88hMM0/v/lGg==", | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/node/-/node-4.3.4.tgz", | ||||
|       "integrity": "sha512-4ro8eFnIuuYrF/TLw788xU10AYJl9HvOYC5G3jLrHXTjRNLp7jJo9lZrUexjCvwM2WF/srF3+Z0Pwr+HwdKVVw==", | ||||
|       "requires": { | ||||
|         "@sentry/core": "4.0.0-rc.1", | ||||
|         "@sentry/hub": "4.0.0-rc.1", | ||||
|         "@sentry/minimal": "4.0.0-rc.1", | ||||
|         "@sentry/types": "4.0.0-rc.1", | ||||
|         "@sentry/utils": "4.0.0-rc.1", | ||||
|         "@sentry/core": "4.3.4", | ||||
|         "@sentry/hub": "4.3.4", | ||||
|         "@sentry/types": "4.3.4", | ||||
|         "@sentry/utils": "4.3.4", | ||||
|         "@types/stack-trace": "0.0.29", | ||||
|         "cookie": "0.3.1", | ||||
|         "lsmod": "1.0.0", | ||||
|         "md5": "2.2.1", | ||||
|         "stack-trace": "0.0.10" | ||||
|         "stack-trace": "0.0.10", | ||||
|         "tslib": "^1.9.3" | ||||
|       } | ||||
|     }, | ||||
|     "@sentry/types": { | ||||
|       "version": "4.0.0-rc.1", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.0.0-rc.1.tgz", | ||||
|       "integrity": "sha512-WCIahta73omB4pYgzAZPCJ/IxyUhn10B8YOm0fKFOWDP1HmQlhpnF9RX/fjkq0LR7vQfOkVUU9dr61AEG+jrqw==" | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.3.4.tgz", | ||||
|       "integrity": "sha512-qsqrcyNilpbzYjqef+km0Grh5BckSFD4MUdJDNkUE5XU/ImniYddj18bMDlQxluJlTPDjUFQ37FXtEmxLeOwkQ==" | ||||
|     }, | ||||
|     "@sentry/utils": { | ||||
|       "version": "4.0.0-rc.1", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.0.0-rc.1.tgz", | ||||
|       "integrity": "sha512-gRtEDh2Pz4UimeJzA1Wiv9bb2OrHouyZoCaFR6pe4I1VudchOTI6PXtAfyt7Yx8CWff7xfJUOiU3BZnT2QQ7Nw==", | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.3.4.tgz", | ||||
|       "integrity": "sha512-CMGMdIv5RHUCKRF4aWPZ/gFRTfBQpLVVJEGCeFGZLXHBdpgQac0lf3jlu8sND0KZ0S3C5x3tGS/eEqmOZRQ/pw==", | ||||
|       "requires": { | ||||
|         "@sentry/types": "4.0.0-rc.1" | ||||
|         "@sentry/types": "4.3.4", | ||||
|         "tslib": "^1.9.3" | ||||
|       } | ||||
|     }, | ||||
|     "@sindresorhus/is": { | ||||
| @@ -129,6 +131,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", | ||||
|       "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" | ||||
|     }, | ||||
|     "@types/stack-trace": { | ||||
|       "version": "0.0.29", | ||||
|       "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz", | ||||
|       "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==" | ||||
|     }, | ||||
|     "adm-zip": { | ||||
|       "version": "0.4.11", | ||||
|       "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", | ||||
| @@ -162,7 +169,7 @@ | ||||
|     "argparse": { | ||||
|       "version": "1.0.10", | ||||
|       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", | ||||
|       "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", | ||||
|       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", | ||||
|       "requires": { | ||||
|         "sprintf-js": "~1.0.2" | ||||
|       } | ||||
| @@ -230,16 +237,16 @@ | ||||
|       "optional": true | ||||
|     }, | ||||
|     "bluebird": { | ||||
|       "version": "3.5.1", | ||||
|       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", | ||||
|       "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=" | ||||
|       "version": "3.5.3", | ||||
|       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", | ||||
|       "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" | ||||
|     }, | ||||
|     "bluebird-lst": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz", | ||||
|       "integrity": "sha1-vryDAmt+kqcocaPcWZ4hnL+wAqk=", | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.6.tgz", | ||||
|       "integrity": "sha512-CBWFoPuUPpcvMUxfyr8DKdI5d4kjxFl1h39+VbKxP3KJWJHEsLtuT4pPLkjpxCGU6Ask21tvbnftWXdqIxYldQ==", | ||||
|       "requires": { | ||||
|         "bluebird": "^3.5.1" | ||||
|         "bluebird": "^3.5.2" | ||||
|       } | ||||
|     }, | ||||
|     "boom": { | ||||
| @@ -265,23 +272,28 @@ | ||||
|       "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" | ||||
|     }, | ||||
|     "builder-util-runtime": { | ||||
|       "version": "4.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.4.1.tgz", | ||||
|       "integrity": "sha512-8L2pbL6D3VdI1f8OMknlZJpw0c7KK15BRz3cY77AOUElc4XlCv2UhVV01jJM7+6Lx7henaQh80ALULp64eFYAQ==", | ||||
|       "version": "8.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.1.0.tgz", | ||||
|       "integrity": "sha512-s1mlJ28mv+56Iebh6c9aXjVe11O3Z0cDTwAGeB0PCcUzHA37fDxGgS8ZGoYNMZP+rBHj21d/od1wuYofTVLaQg==", | ||||
|       "requires": { | ||||
|         "bluebird-lst": "^1.0.5", | ||||
|         "debug": "^3.1.0", | ||||
|         "fs-extra-p": "^4.6.1", | ||||
|         "bluebird-lst": "^1.0.6", | ||||
|         "debug": "^4.1.0", | ||||
|         "fs-extra-p": "^7.0.0", | ||||
|         "sax": "^1.2.4" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "debug": { | ||||
|           "version": "3.1.0", | ||||
|           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", | ||||
|           "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", | ||||
|           "version": "4.1.1", | ||||
|           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||||
|           "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||||
|           "requires": { | ||||
|             "ms": "2.0.0" | ||||
|             "ms": "^2.1.1" | ||||
|           } | ||||
|         }, | ||||
|         "ms": { | ||||
|           "version": "2.1.1", | ||||
|           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", | ||||
|           "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| @@ -422,18 +434,12 @@ | ||||
|         "mimic-response": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "deep-equal": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", | ||||
|       "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" | ||||
|     }, | ||||
|     "define-properties": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", | ||||
|       "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", | ||||
|       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", | ||||
|       "requires": { | ||||
|         "foreach": "^2.0.5", | ||||
|         "object-keys": "^1.0.8" | ||||
|         "object-keys": "^1.0.12" | ||||
|       } | ||||
|     }, | ||||
|     "delayed-stream": { | ||||
| @@ -523,46 +529,35 @@ | ||||
|       } | ||||
|     }, | ||||
|     "electron-updater": { | ||||
|       "version": "3.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-3.1.2.tgz", | ||||
|       "integrity": "sha512-y3n37O01pdynMJHhJbOd2UVhVrmDW6zLvR2SOZ+gk3S6r16872+0nNbC48GXWwc26lTeus/Zja/XUpiqrvdw4A==", | ||||
|       "version": "4.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.0.6.tgz", | ||||
|       "integrity": "sha512-JPGLME6fxJcHG8hX7HWFl6Aew6iVm0DkcrENreKa5SUJCHG+uUaAhxDGDt+YGcNkyx1uJ6eBGMvFxDTLUv67pg==", | ||||
|       "requires": { | ||||
|         "bluebird-lst": "^1.0.5", | ||||
|         "builder-util-runtime": "~4.4.1", | ||||
|         "electron-is-dev": "^0.3.0", | ||||
|         "fs-extra-p": "^4.6.1", | ||||
|         "bluebird-lst": "^1.0.6", | ||||
|         "builder-util-runtime": "~8.1.0", | ||||
|         "fs-extra-p": "^7.0.0", | ||||
|         "js-yaml": "^3.12.0", | ||||
|         "lazy-val": "^1.0.3", | ||||
|         "lodash.isequal": "^4.5.0", | ||||
|         "semver": "^5.5.1", | ||||
|         "pako": "^1.0.7", | ||||
|         "semver": "^5.6.0", | ||||
|         "source-map-support": "^0.5.9" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "semver": { | ||||
|           "version": "5.5.1", | ||||
|           "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", | ||||
|           "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" | ||||
|           "version": "5.6.0", | ||||
|           "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", | ||||
|           "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "electron-window-state": { | ||||
|       "version": "4.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-4.1.1.tgz", | ||||
|       "integrity": "sha1-azT9wxs4UU3+yLfI97XUrdtnYy0=", | ||||
|       "version": "5.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-5.0.3.tgz", | ||||
|       "integrity": "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==", | ||||
|       "requires": { | ||||
|         "deep-equal": "^1.0.1", | ||||
|         "jsonfile": "^2.2.3", | ||||
|         "jsonfile": "^4.0.0", | ||||
|         "mkdirp": "^0.5.1" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "jsonfile": { | ||||
|           "version": "2.4.0", | ||||
|           "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", | ||||
|           "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", | ||||
|           "requires": { | ||||
|             "graceful-fs": "^4.1.6" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "encoding": { | ||||
| @@ -574,9 +569,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "es-abstract": { | ||||
|       "version": "1.11.0", | ||||
|       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", | ||||
|       "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", | ||||
|       "version": "1.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", | ||||
|       "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", | ||||
|       "requires": { | ||||
|         "es-to-primitive": "^1.1.1", | ||||
|         "function-bind": "^1.1.1", | ||||
| @@ -586,13 +581,13 @@ | ||||
|       } | ||||
|     }, | ||||
|     "es-to-primitive": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", | ||||
|       "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", | ||||
|       "version": "1.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", | ||||
|       "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", | ||||
|       "requires": { | ||||
|         "is-callable": "^1.1.1", | ||||
|         "is-callable": "^1.1.4", | ||||
|         "is-date-object": "^1.0.1", | ||||
|         "is-symbol": "^1.0.1" | ||||
|         "is-symbol": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "escape-html": { | ||||
| @@ -601,9 +596,9 @@ | ||||
|       "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" | ||||
|     }, | ||||
|     "esprima": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", | ||||
|       "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=" | ||||
|       "version": "4.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", | ||||
|       "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" | ||||
|     }, | ||||
|     "event-kit": { | ||||
|       "version": "2.4.0", | ||||
| @@ -636,11 +631,6 @@ | ||||
|       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", | ||||
|       "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" | ||||
|     }, | ||||
|     "foreach": { | ||||
|       "version": "2.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", | ||||
|       "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" | ||||
|     }, | ||||
|     "forever-agent": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", | ||||
| @@ -666,9 +656,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "fs-extra": { | ||||
|       "version": "6.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", | ||||
|       "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", | ||||
|       "version": "7.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", | ||||
|       "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", | ||||
|       "requires": { | ||||
|         "graceful-fs": "^4.1.2", | ||||
|         "jsonfile": "^4.0.0", | ||||
| @@ -676,12 +666,12 @@ | ||||
|       } | ||||
|     }, | ||||
|     "fs-extra-p": { | ||||
|       "version": "4.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-4.6.1.tgz", | ||||
|       "integrity": "sha512-IsTMbUS0svZKZTvqF4vDS9c/L7Mw9n8nZQWWeSzAGacOSe+8CzowhUN0tdZEZFIJNP5HC7L9j3MMikz/G4hDeQ==", | ||||
|       "version": "7.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.0.tgz", | ||||
|       "integrity": "sha512-5tg5jBOd0xIXjwj4PDnafOXL5TyPVzjxLby4DPKev53wurEXp7IsojBaD4Lj5M5w7jxw0pbkEU0fFEPmcKoMnA==", | ||||
|       "requires": { | ||||
|         "bluebird-lst": "^1.0.5", | ||||
|         "fs-extra": "^6.0.1" | ||||
|         "bluebird-lst": "^1.0.6", | ||||
|         "fs-extra": "^7.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "fs.realpath": { | ||||
| @@ -769,6 +759,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", | ||||
|       "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" | ||||
|     }, | ||||
|     "has-symbols": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", | ||||
|       "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" | ||||
|     }, | ||||
|     "has-to-string-tag-x": { | ||||
|       "version": "1.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", | ||||
| @@ -865,9 +860,9 @@ | ||||
|       "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" | ||||
|     }, | ||||
|     "is-callable": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", | ||||
|       "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" | ||||
|       "version": "1.1.4", | ||||
|       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", | ||||
|       "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" | ||||
|     }, | ||||
|     "is-date-object": { | ||||
|       "version": "1.0.1", | ||||
| @@ -927,9 +922,12 @@ | ||||
|       "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" | ||||
|     }, | ||||
|     "is-symbol": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", | ||||
|       "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", | ||||
|       "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", | ||||
|       "requires": { | ||||
|         "has-symbols": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "is-typedarray": { | ||||
|       "version": "1.0.0", | ||||
| @@ -1029,7 +1027,7 @@ | ||||
|     "lazy-val": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz", | ||||
|       "integrity": "sha1-u5eyAO8AgB2UwxfincbtOeMcXtw=" | ||||
|       "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==" | ||||
|     }, | ||||
|     "lodash.assign": { | ||||
|       "version": "4.2.0", | ||||
| @@ -1125,30 +1123,24 @@ | ||||
|       "integrity": "sha1-ltDNYQ69WNS03pzAxoKM2pnHVI8=" | ||||
|     }, | ||||
|     "node-json-db": { | ||||
|       "version": "0.7.3", | ||||
|       "resolved": "https://registry.npmjs.org/node-json-db/-/node-json-db-0.7.3.tgz", | ||||
|       "integrity": "sha1-v2Mf9NTPQhHL3/5srmqq/m7lTN8=", | ||||
|       "version": "0.9.1", | ||||
|       "resolved": "https://registry.npmjs.org/node-json-db/-/node-json-db-0.9.1.tgz", | ||||
|       "integrity": "sha512-4BydUI7a10W8QBdHq/J3UBswU1i8WhCgTS4BZU0MjlUKrSU7cuUti71eojistgqe5hIrb4adj/wvAT5dw63NPg==", | ||||
|       "requires": { | ||||
|         "mkdirp": "0.5.x" | ||||
|       } | ||||
|     }, | ||||
|     "node-mac-notifier": { | ||||
|       "version": "0.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/node-mac-notifier/-/node-mac-notifier-0.1.0.tgz", | ||||
|       "integrity": "sha512-K07p0jW6BhE4Jxpem4pcOdOCDgF/vy3xIqZoZpqme5JAfeW0cEkQ5Z3AmsM7fhJB59kDeOiouyykwPnvLV+hAg==", | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/node-mac-notifier/-/node-mac-notifier-1.1.0.tgz", | ||||
|       "integrity": "sha512-Fwv09eKMGkM4xn+Eby5g7lvmYF+1KYWX4V5QNn27l4cVFVS7MNYOxhbvGGHT5VuTWbWDQIi/Lr7l6so5vvmqVw==", | ||||
|       "optional": true, | ||||
|       "requires": { | ||||
|         "bindings": "^1.2.1", | ||||
|         "event-target-shim": "^1.1.1", | ||||
|         "node-uuid": "^1.4.7" | ||||
|         "uuid": "^3.3.2" | ||||
|       } | ||||
|     }, | ||||
|     "node-uuid": { | ||||
|       "version": "1.4.8", | ||||
|       "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", | ||||
|       "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", | ||||
|       "optional": true | ||||
|     }, | ||||
|     "normalize-url": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", | ||||
| @@ -1237,6 +1229,11 @@ | ||||
|         "p-finally": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "pako": { | ||||
|       "version": "1.0.7", | ||||
|       "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", | ||||
|       "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==" | ||||
|     }, | ||||
|     "path-is-absolute": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | ||||
| @@ -1460,7 +1457,7 @@ | ||||
|     "sax": { | ||||
|       "version": "1.2.4", | ||||
|       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", | ||||
|       "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" | ||||
|       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" | ||||
|     }, | ||||
|     "semver": { | ||||
|       "version": "5.4.1", | ||||
| @@ -1486,7 +1483,7 @@ | ||||
|     "source-map": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | ||||
|       "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" | ||||
|       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" | ||||
|     }, | ||||
|     "source-map-support": { | ||||
|       "version": "0.5.9", | ||||
| @@ -1568,6 +1565,11 @@ | ||||
|         "punycode": "^1.4.1" | ||||
|       } | ||||
|     }, | ||||
|     "tslib": { | ||||
|       "version": "1.9.3", | ||||
|       "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", | ||||
|       "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" | ||||
|     }, | ||||
|     "tunnel-agent": { | ||||
|       "version": "0.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", | ||||
| @@ -1629,6 +1631,12 @@ | ||||
|         "object.getownpropertydescriptors": "^2.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "uuid": { | ||||
|       "version": "3.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", | ||||
|       "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", | ||||
|       "optional": true | ||||
|     }, | ||||
|     "verror": { | ||||
|       "version": "1.10.0", | ||||
|       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| { | ||||
|   "name": "zulip", | ||||
|   "productName": "Zulip", | ||||
|   "version": "2.3.8", | ||||
|   "version": "2.5.0", | ||||
|   "description": "Zulip Desktop App", | ||||
|   "license": "Apache-2.0", | ||||
|   "copyright": "Kandra Labs, Inc.", | ||||
| @@ -26,23 +26,23 @@ | ||||
|     "InstantMessaging" | ||||
|   ], | ||||
|   "dependencies": { | ||||
|     "@electron-elements/send-feedback": "1.0.7", | ||||
|     "@sentry/electron": "0.10.1", | ||||
|     "@electron-elements/send-feedback": "1.0.8", | ||||
|     "@sentry/electron": "0.14.0", | ||||
|     "adm-zip": "0.4.11", | ||||
|     "auto-launch": "5.0.5", | ||||
|     "electron-is-dev": "0.3.0", | ||||
|     "electron-log": "2.2.14", | ||||
|     "electron-spellchecker": "1.1.2", | ||||
|     "electron-updater": "3.1.2", | ||||
|     "electron-window-state": "4.1.1", | ||||
|     "electron-updater": "4.0.6", | ||||
|     "electron-window-state": "5.0.3", | ||||
|     "escape-html": "1.0.3", | ||||
|     "is-online": "7.0.0", | ||||
|     "node-json-db": "0.7.3", | ||||
|     "node-json-db": "0.9.1", | ||||
|     "request": "2.85.0", | ||||
|     "semver": "5.4.1", | ||||
|     "wurl": "2.5.0" | ||||
|   }, | ||||
|   "optionalDependencies": { | ||||
|     "node-mac-notifier": "0.1.0" | ||||
|     "node-mac-notifier": "1.1.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -19,7 +19,6 @@ | ||||
| 				Available under the | ||||
| 				<a onclick="linkInBrowser('license')">Apache 2.0 License</a> | ||||
| 			</p> | ||||
| 			<a class="bug" onclick="linkInBrowser('bug')" href="#">Found bug?</a> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<script> | ||||
| @@ -38,9 +37,6 @@ | ||||
| 				case 'license': | ||||
| 					url = "https://github.com/zulip/zulip-electron/blob/master/LICENSE"; | ||||
| 					break; | ||||
| 				default: | ||||
| 					url = 'https://github.com/zulip/zulip-electron/issues/new?body=' + | ||||
| 						'%3C!--Please%20describe%20your%20issue%20and%20steps%20to%20reproduce%20it.--%3E'; | ||||
| 			} | ||||
| 			shell.openExternal(url); | ||||
| 		} | ||||
|   | ||||
| @@ -57,22 +57,6 @@ body { | ||||
| 	width: 100%; | ||||
| } | ||||
|  | ||||
| .maintenance-info .bug { | ||||
| 	display: inline-block; | ||||
| 	padding: 8px 15px; | ||||
| 	margin-top: 30px; | ||||
| 	text-decoration: none; | ||||
| 	background-color: #52c2af; | ||||
| 	color: #fff; | ||||
| 	border-radius: 4px; | ||||
|  | ||||
| 	transition: background-color 0.2s ease; | ||||
| } | ||||
|  | ||||
| .maintenance-info .bug:hover { | ||||
| 	background-color: #32a692; | ||||
| } | ||||
|  | ||||
| p.detail a { | ||||
| 	color: #355f4c; | ||||
| } | ||||
|   | ||||
| @@ -151,7 +151,7 @@ body { | ||||
| } | ||||
|  | ||||
| .tab:first-child { | ||||
|     margin-top: 8px; | ||||
|     margin-top: 9px; | ||||
| } | ||||
|  | ||||
| .tab { | ||||
| @@ -165,25 +165,23 @@ body { | ||||
| } | ||||
|  | ||||
| .tab .server-icons { | ||||
|     border-radius: 50%; | ||||
|     width: 30px; | ||||
|     padding: 3px; | ||||
|     height: 30px; | ||||
|     width: 35px; | ||||
|     vertical-align: top; | ||||
|     border-radius: 4px; | ||||
| } | ||||
|  | ||||
| .tab .server-tab { | ||||
|     width: 100%; | ||||
|     height: 35px; | ||||
|     position: relative; | ||||
|     margin: 5px 0 2px 0; | ||||
|     margin-top: 5px; | ||||
|     z-index: 11; | ||||
|     line-height: 31px; | ||||
|     color: #eee; | ||||
|     text-align: center; | ||||
|     overflow: hidden; | ||||
|     opacity: 0.6; | ||||
|     padding: 2px 0; | ||||
|     padding: 6px 0; | ||||
| } | ||||
|  | ||||
| .server-tab .alt-icon { | ||||
| @@ -192,8 +190,8 @@ body { | ||||
|     font-size: 22px; | ||||
|     border: 2px solid #222c31; | ||||
|     margin-left: 17%; | ||||
|     width: 33px; | ||||
|     border-radius: 50%; | ||||
|     width: 35px; | ||||
|     border-radius: 4px; | ||||
| } | ||||
|  | ||||
| .tab .server-tab:hover { | ||||
| @@ -368,7 +366,7 @@ webview.focus { | ||||
|     left: 56px; | ||||
|     padding: 10px 20px; | ||||
|     position: fixed; | ||||
|     margin-top: 8px; | ||||
|     margin-top: 11px; | ||||
|     z-index: 5000 !important; | ||||
|     color: #fff; | ||||
|     border-radius: 4px; | ||||
|   | ||||
| @@ -111,7 +111,7 @@ td:nth-child(odd) { | ||||
| } | ||||
|  | ||||
| .nav { | ||||
|     padding: 5px 0; | ||||
|     padding: 7px 0; | ||||
|     color: #999; | ||||
|     cursor: pointer; | ||||
| } | ||||
| @@ -188,7 +188,7 @@ td:nth-child(odd) { | ||||
| img.server-info-icon { | ||||
|     width: 36px; | ||||
|     height: 36px; | ||||
|     padding: 4px; | ||||
|     padding: 4px 4px 4px 10px; | ||||
|     cursor: pointer; | ||||
|     vertical-align: middle; | ||||
| } | ||||
| @@ -340,12 +340,13 @@ img.server-info-icon { | ||||
|     display: inline-block; | ||||
|     border: none; | ||||
|     padding: 10px; | ||||
|     width: 110px; | ||||
|     width: 100px; | ||||
|     cursor: pointer; | ||||
|     font-size: 1rem; | ||||
|     font-weight: bold; | ||||
|     transition: background-color 0.2s ease; | ||||
|     text-decoration: none; | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| .green:hover { | ||||
| @@ -353,8 +354,12 @@ img.server-info-icon { | ||||
|     color: #fff; | ||||
| } | ||||
|  | ||||
| .w-200 { | ||||
|     width: 200px; | ||||
| .w-150 { | ||||
|     width: 150px; | ||||
| } | ||||
|  | ||||
| .w-250 { | ||||
|     width: 250px; | ||||
| } | ||||
|  | ||||
| .grey { | ||||
| @@ -376,7 +381,7 @@ img.server-info-icon { | ||||
| } | ||||
|  | ||||
| i.open-tab-button { | ||||
|     padding-left: 2px; | ||||
|     padding-left: 5px; | ||||
|     font-size: 19px; | ||||
|     cursor: pointer; | ||||
| } | ||||
| @@ -400,7 +405,11 @@ i.open-tab-button { | ||||
| } | ||||
|  | ||||
| #server-info-container { | ||||
|     min-height: calc(100% - 260px); | ||||
|     /* min-height: calc(100% - 260px); */ | ||||
| } | ||||
|  | ||||
| #new-org-button { | ||||
|     margin: 30px 0px 30px 0px; | ||||
| } | ||||
|  | ||||
| #create-organization-container { | ||||
| @@ -583,13 +592,16 @@ input.toggle-round:checked+label:after { | ||||
| } | ||||
|  | ||||
| #add-certificate-button { | ||||
|     margin: 10px; | ||||
|     margin: 10px 10px 10px 37px; | ||||
| } | ||||
|  | ||||
| .tip { | ||||
|     background-color: hsl(46, 63%, 95%); | ||||
|     border: 1px solid hsl(46, 63%, 84%); | ||||
|     border-radius: 4px; | ||||
|     background: none; | ||||
|     padding: 0; | ||||
| } | ||||
|  | ||||
| .tip:hover{ | ||||
|    box-shadow: none; | ||||
| } | ||||
|  | ||||
| .md-14 { | ||||
|   | ||||
| @@ -21,19 +21,21 @@ function handleExternalLink(event) { | ||||
| 	if (isWhiteListURL) { | ||||
| 		event.preventDefault(); | ||||
|  | ||||
| 		// Code to show pdf in a new BrowserWindow (currently commented out due to bug-upstream) | ||||
| 		// Show pdf attachments in a new window | ||||
|  | ||||
| 		if (LinkUtil.isPDF(url) && isUploadsURL) { | ||||
| 			ipcRenderer.send('pdf-view', url); | ||||
| 			return; | ||||
| 		} | ||||
| 		// if (LinkUtil.isPDF(url) && isUploadsURL) { | ||||
| 		// 	ipcRenderer.send('pdf-view', url); | ||||
| 		// 	return; | ||||
| 		// } | ||||
|  | ||||
| 		// download txt, mp3, mp4 etc.. by using downloadURL in the | ||||
| 		// main process which allows the user to save the files to their desktop | ||||
| 		// and not trigger webview reload while image in webview will | ||||
| 		// do nothing and will not save it | ||||
|  | ||||
| 		if (!LinkUtil.isImage(url) && !LinkUtil.isPDF(url) && isUploadsURL) { | ||||
| 			// Code to show pdf in a new BrowserWindow (currently commented out due to bug-upstream) | ||||
| 		// if (!LinkUtil.isImage(url) && !LinkUtil.isPDF(url) && isUploadsURL) { | ||||
| 		if (!LinkUtil.isImage(url) && isUploadsURL) { | ||||
| 			ipcRenderer.send('downloadFile', url, downloadPath); | ||||
| 			ipcRenderer.once('downloadFileCompleted', (event, filePath, fileName) => { | ||||
| 				const downloadNotification = new Notification('Download Complete', { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| const { ipcRenderer, remote } = require('electron'); | ||||
| const isDev = require('electron-is-dev'); | ||||
|  | ||||
| const { session, app } = remote; | ||||
| const { session, app, Menu, dialog } = remote; | ||||
| const escape = require('escape-html'); | ||||
|  | ||||
| require(__dirname + '/js/tray.js'); | ||||
| @@ -111,6 +111,7 @@ class ServerManagerView { | ||||
| 			showNotification: true, | ||||
| 			autoUpdate: true, | ||||
| 			betaUpdate: false, | ||||
| 			customCSS: false, | ||||
| 			silent: false, | ||||
| 			lastActiveTab: 0, | ||||
| 			dnd: false, | ||||
| @@ -199,6 +200,24 @@ class ServerManagerView { | ||||
|  | ||||
| 	initActions() { | ||||
| 		this.initDNDButton(); | ||||
| 		this.initServerActions(); | ||||
| 		this.initLeftSidebarEvents(); | ||||
| 	} | ||||
|  | ||||
| 	initServerActions() { | ||||
| 		const $serverImgs = document.querySelectorAll('.server-icons'); | ||||
| 		$serverImgs.forEach(($serverImg, index) => { | ||||
| 			this.addContextMenu($serverImg, index); | ||||
| 			if ($serverImg.src.includes('img/icon.png')) { | ||||
| 				this.displayInitialCharLogo($serverImg, index); | ||||
| 			} | ||||
| 			$serverImg.addEventListener('error', () => { | ||||
| 				this.displayInitialCharLogo($serverImg, index); | ||||
| 			}); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	initLeftSidebarEvents() { | ||||
| 		this.$dndButton.addEventListener('click', () => { | ||||
| 			const dndUtil = DNDUtil.toggle(); | ||||
| 			ipcRenderer.send('forward-message', 'toggle-dnd', dndUtil.dnd, dndUtil.newSettings); | ||||
| @@ -216,17 +235,6 @@ class ServerManagerView { | ||||
| 			this.tabs[this.activeTabIndex].webview.back(); | ||||
| 		}); | ||||
|  | ||||
| 		const $serverImgs = document.querySelectorAll('.server-icons'); | ||||
| 		$serverImgs.forEach($serverImg => { | ||||
| 			if ($serverImg.src.includes('img/icon.png')) { | ||||
| 				this.displayInitalCharLogo($serverImg); | ||||
| 			} | ||||
|  | ||||
| 			$serverImg.addEventListener('error', () => { | ||||
| 				this.displayInitalCharLogo($serverImg); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		this.sidebarHoverEvent(this.$addServerButton, this.$addServerTooltip, true); | ||||
| 		this.sidebarHoverEvent(this.$settingsButton, this.$settingsTooltip); | ||||
| 		this.sidebarHoverEvent(this.$reloadButton, this.$reloadTooltip); | ||||
| @@ -245,7 +253,12 @@ class ServerManagerView { | ||||
| 		return currentIndex; | ||||
| 	} | ||||
|  | ||||
| 	displayInitalCharLogo($img) { | ||||
| 	displayInitialCharLogo($img, index) { | ||||
| 		/* | ||||
| 			index parameter needed because webview[data-tab-id] can increment | ||||
| 			beyond size of sidebar org array and throw error | ||||
| 		*/ | ||||
|  | ||||
| 		const $altIcon = document.createElement('div'); | ||||
| 		const $parent = $img.parentElement; | ||||
| 		const $container = $parent.parentElement; | ||||
| @@ -264,6 +277,8 @@ class ServerManagerView { | ||||
|  | ||||
| 		$parent.removeChild($img); | ||||
| 		$parent.appendChild($altIcon); | ||||
|  | ||||
| 		this.addContextMenu($altIcon, index); | ||||
| 	} | ||||
|  | ||||
| 	sidebarHoverEvent(SidebarButton, SidebarTooltip, addServer = false) { | ||||
| @@ -307,6 +322,7 @@ class ServerManagerView { | ||||
| 		this.functionalTabs[tabProps.name] = this.tabs.length; | ||||
|  | ||||
| 		const tabIndex = this.getTabIndex(); | ||||
|  | ||||
| 		this.tabs.push(new FunctionalTab({ | ||||
| 			role: 'function', | ||||
| 			materialIcon: tabProps.materialIcon, | ||||
| @@ -331,9 +347,11 @@ class ServerManagerView { | ||||
| 				preload: false | ||||
| 			}) | ||||
| 		})); | ||||
|  | ||||
| 		// To show loading indicator the first time a functional tab is opened, indicator is | ||||
| 		// closed when the functional tab DOM is ready, handled in webview.js | ||||
| 		this.$webviewsContainer.classList.remove('loaded'); | ||||
|  | ||||
| 		this.activateTab(this.functionalTabs[tabProps.name]); | ||||
| 	} | ||||
|  | ||||
| @@ -370,6 +388,25 @@ class ServerManagerView { | ||||
| 		ConfigUtil.setConfigItem('lastActiveTab', index); | ||||
| 	} | ||||
|  | ||||
| 	// returns this.tabs in an way that does | ||||
| 	// not crash app when this.tabs is passed into | ||||
| 	// ipcRenderer. Something about webview, and props.webview | ||||
| 	// properties in ServerTab causes the app to crash. | ||||
| 	get tabsForIpc() { | ||||
| 		const tabs = []; | ||||
| 		this.tabs.forEach(tab => { | ||||
| 			const proto = Object.create(Object.getPrototypeOf(tab)); | ||||
| 			const tabClone = Object.assign(proto, tab); | ||||
|  | ||||
| 			tabClone.webview = { props: {} }; | ||||
| 			tabClone.webview.props.name = tab.webview.props.name; | ||||
| 			delete tabClone.props.webview; | ||||
| 			tabs.push(tabClone); | ||||
| 		}); | ||||
|  | ||||
| 		return tabs; | ||||
| 	} | ||||
|  | ||||
| 	activateTab(index, hideOldTab = true) { | ||||
| 		if (!this.tabs[index]) { | ||||
| 			return; | ||||
| @@ -396,8 +433,12 @@ class ServerManagerView { | ||||
| 		this.tabs[index].activate(); | ||||
|  | ||||
| 		ipcRenderer.send('update-menu', { | ||||
| 			tabs: this.tabs, | ||||
| 			activeTabIndex: this.activeTabIndex | ||||
| 			// JSON stringify this.tabs to avoid a crash | ||||
| 			// util.inspect is being used to handle circular references | ||||
| 			tabs: this.tabsForIpc, | ||||
| 			activeTabIndex: this.activeTabIndex, | ||||
| 			// Following flag controls whether a menu item should be enabled or not | ||||
| 			enableMenu: this.tabs[index].props.role === 'server' | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| @@ -439,6 +480,7 @@ class ServerManagerView { | ||||
| 		// Destroy the current view and re-initiate it | ||||
| 		this.destroyView(); | ||||
| 		this.initTabs(); | ||||
| 		this.initServerActions(); | ||||
| 	} | ||||
|  | ||||
| 	// This will trigger when pressed CTRL/CMD + R [WIP] | ||||
| @@ -474,6 +516,32 @@ class ServerManagerView { | ||||
| 		this.$dndButton.querySelector('i').textContent = alert ? 'notifications_off' : 'notifications'; | ||||
| 	} | ||||
|  | ||||
| 	addContextMenu($serverImg, index) { | ||||
| 		$serverImg.addEventListener('contextmenu', e => { | ||||
| 			e.preventDefault(); | ||||
| 			const template = [ | ||||
| 				{ | ||||
| 					label: 'Disconnect organization', | ||||
| 					click: () => { | ||||
| 						dialog.showMessageBox({ | ||||
| 							type: 'warning', | ||||
| 							buttons: ['YES', 'NO'], | ||||
| 							defaultId: 0, | ||||
| 							message: 'Are you sure you want to disconnect this organization?' | ||||
| 						}, response => { | ||||
| 							if (response === 0) { | ||||
| 								DomainUtil.removeDomain(index); | ||||
| 								ipcRenderer.send('reload-full-app'); | ||||
| 							} | ||||
| 						}); | ||||
| 					} | ||||
| 				} | ||||
| 			]; | ||||
| 			const contextMenu = Menu.buildFromTemplate(template); | ||||
| 			contextMenu.popup({ window: remote.getCurrentWindow() }); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	registerIpcs() { | ||||
| 		const webviewListeners = { | ||||
| 			'webview-reload': 'reload', | ||||
| @@ -519,6 +587,10 @@ class ServerManagerView { | ||||
| 			this.activateLastTab(index); | ||||
| 		}); | ||||
|  | ||||
| 		ipcRenderer.on('open-org-tab', () => { | ||||
| 			this.openSettings('AddServer'); | ||||
| 		}); | ||||
|  | ||||
| 		ipcRenderer.on('reload-proxy', (event, showAlert) => { | ||||
| 			this.loadProxy().then(() => { | ||||
| 				if (showAlert) { | ||||
| @@ -576,7 +648,7 @@ class ServerManagerView { | ||||
| 					DomainUtil.reloadDB(); | ||||
| 					// Update the realm name also on the Window menu | ||||
| 					ipcRenderer.send('update-menu', { | ||||
| 						tabs: this.tabs, | ||||
| 						tabs: this.tabsForIpc, | ||||
| 						activeTabIndex: this.activeTabIndex | ||||
| 					}); | ||||
| 				} | ||||
|   | ||||
| @@ -141,7 +141,8 @@ function parseReply(reply) { | ||||
|  | ||||
| function setupReply(id) { | ||||
| 	const { narrow } = window; | ||||
| 	narrow.by_subject(id, { trigger: 'notification' }); | ||||
| 	const narrowByTopic = narrow.by_topic || narrow.by_subject; | ||||
| 	narrowByTopic(id, { trigger: 'notification' }); | ||||
| } | ||||
|  | ||||
| module.exports = { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| 'use-strict'; | ||||
|  | ||||
| const { dialog } = require('electron').remote; | ||||
| const path = require('path'); | ||||
|  | ||||
| const BaseComponent = require(__dirname + '/../../components/base.js'); | ||||
| const CertificateUtil = require(__dirname + '/../../utils/certificate-util.js'); | ||||
| @@ -17,12 +18,12 @@ class AddCertificate extends BaseComponent { | ||||
| 		return ` | ||||
| 			<div class="settings-card certificates-card"> | ||||
| 				<div class="certificate-input"> | ||||
| 					<div>Organization URL :</div> | ||||
| 					<div>Organization URL</div> | ||||
| 					<input class="setting-input-value" autofocus placeholder="your-organization.zulipchat.com or zulip.your-organization.com"/> | ||||
| 				</div> | ||||
| 				<div class="certificate-input"> | ||||
| 					<div>Custom CA's certificate file :</div> | ||||
| 					<button class="green" id="add-certificate-button">Add</button> | ||||
| 					<div>Certificate file</div> | ||||
| 					<button class="green" id="add-certificate-button">Upload</button> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		`; | ||||
| @@ -41,7 +42,7 @@ class AddCertificate extends BaseComponent { | ||||
| 		const serverUrl = this.serverUrl.value; | ||||
| 		if (certificate !== '' && serverUrl !== '') { | ||||
| 			const server = encodeURIComponent(DomainUtil.formatUrl(serverUrl)); | ||||
| 			const fileName = certificate.substring(certificate.lastIndexOf('/') + 1); | ||||
| 			const fileName = path.basename(certificate); | ||||
| 			const copy = CertificateUtil.copyCertificate(server, certificate, fileName); | ||||
| 			if (!copy) { | ||||
| 				return; | ||||
|   | ||||
| @@ -17,7 +17,7 @@ class ConnectedOrgSection extends BaseSection { | ||||
| 				<div class="page-title">Connected organizations</div> | ||||
| 				<div class="title" id="existing-servers">All the connected orgnizations will appear here.</div> | ||||
| 				<div id="server-info-container"></div> | ||||
|  | ||||
| 				<div id="new-org-button"><button class="green sea w-250">Connect to another organization</button></div> | ||||
| 				<div class="page-title">Add Custom Certificates</div> | ||||
| 				<div id="add-certificate-container"></div> | ||||
| 			</div> | ||||
| @@ -33,8 +33,11 @@ class ConnectedOrgSection extends BaseSection { | ||||
|  | ||||
| 		const servers = DomainUtil.getDomains(); | ||||
| 		this.props.$root.innerHTML = this.template(); | ||||
|  | ||||
| 		this.$serverInfoContainer = document.getElementById('server-info-container'); | ||||
| 		this.$existingServers = document.getElementById('existing-servers'); | ||||
| 		this.$newOrgButton = document.getElementById('new-org-button'); | ||||
| 		this.$addCertificateContainer = document.getElementById('add-certificate-container'); | ||||
|  | ||||
| 		const noServerText = 'All the connected orgnizations will appear here'; | ||||
| 		// Show noServerText if no servers are there otherwise hide it | ||||
| @@ -49,7 +52,12 @@ class ConnectedOrgSection extends BaseSection { | ||||
| 			}).init(); | ||||
| 		} | ||||
|  | ||||
| 		this.$addCertificateContainer = document.getElementById('add-certificate-container'); | ||||
| 		this.$newOrgButton.addEventListener('click', () => { | ||||
| 			// We don't need to import this since it's already imported in other files | ||||
| 			// eslint-disable-next-line no-undef | ||||
| 			ipcRenderer.send('forward-message', 'open-org-tab'); | ||||
| 		}); | ||||
|  | ||||
| 		this.initAddCertificate(); | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -28,7 +28,7 @@ class GeneralSection extends BaseSection { | ||||
| 						<div class="setting-control"></div> | ||||
| 					</div> | ||||
| 					<div class="setting-row" id="sidebar-option"> | ||||
| 						<div class="setting-description">Show sidebar (<span class="code">Cmd Or Ctrl+Shift+S</span>)</div> | ||||
| 						<div class="setting-description">Show sidebar (<span class="code">${process.platform === 'darwin' ? 'Cmd+Shift+S' : 'Ctrl+Shift+S'}</span>)</div> | ||||
| 						<div class="setting-control"></div> | ||||
| 					</div> | ||||
| 					<div class="setting-row" id="badge-option"> | ||||
| @@ -44,7 +44,7 @@ class GeneralSection extends BaseSection { | ||||
| 						<div class="setting-control"></div> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 				<div class="title">Desktop Notification</div> | ||||
| 				<div class="title">Desktop Notifications</div> | ||||
| 				<div class="settings-card"> | ||||
| 					<div class="setting-row" id="show-notification-option"> | ||||
| 						<div class="setting-description">Show Desktop Notifications</div> | ||||
| @@ -77,17 +77,21 @@ class GeneralSection extends BaseSection { | ||||
| 						<div class="setting-control"></div> | ||||
| 					</div> | ||||
| 					<div class="setting-row" id="enable-spellchecker-option"> | ||||
| 						<div class="setting-description">Enable Spellchecker (requires restart)</div> | ||||
| 						<div class="setting-description">Enable spellchecker (requires restart)</div> | ||||
| 						<div class="setting-control"></div> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 				<div class="title">Add custom CSS</div> | ||||
| 				<div class="title">Advanced</div> | ||||
| 				<div class="settings-card"> | ||||
| 				<div class="setting-row" id="show-download-folder"> | ||||
| 					<div class="setting-description">Show downloaded files in file manager</div> | ||||
| 					<div class="setting-control"></div> | ||||
| 				</div> | ||||
| 				<div class="setting-row" id="add-custom-css"> | ||||
| 				<div class="setting-description"> | ||||
| 							This will inject the selected css stylesheet in all the added accounts | ||||
| 					Add custom CSS | ||||
| 				</div> | ||||
| 						<button class="custom-css-button green">Add</button> | ||||
| 				<button class="custom-css-button green">Upload</button> | ||||
| 			</div> | ||||
| 			<div class="setting-row" id="remove-custom-css"> | ||||
| 				<div class="setting-description"> | ||||
| @@ -98,18 +102,11 @@ class GeneralSection extends BaseSection { | ||||
| 					<span>Delete</span> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 				</div> | ||||
| 				<div class="title">Advanced</div> | ||||
| 				<div class="settings-card"> | ||||
| 				<div class="setting-row" id="show-download-folder"> | ||||
| 					<div class="setting-description">Show downloaded file in the file manager</div> | ||||
| 					<div class="setting-control"></div> | ||||
| 				</div> | ||||
| 					<div class="setting-row" id="download-folder"> | ||||
| 						<div class="setting-description"> | ||||
| 							Default download location | ||||
| 						</div> | ||||
| 						<button class="download-folder-button green">Choose</button> | ||||
| 						<button class="download-folder-button green">Change</button> | ||||
| 					</div> | ||||
| 					<div class="setting-row"> | ||||
| 						<div class="setting-description"> | ||||
| @@ -123,7 +120,7 @@ class GeneralSection extends BaseSection { | ||||
| 					<div class="setting-row" id="resetdata-option"> | ||||
| 						<div class="setting-description">This will delete all application data including all added accounts and preferences | ||||
| 						</div> | ||||
| 						<button class="reset-data-button green w-200">Reset App Data</button> | ||||
| 						<button class="reset-data-button green w-150">Reset App Data</button> | ||||
| 					</div> | ||||
| 				</div> | ||||
|             </div> | ||||
| @@ -236,6 +233,10 @@ class GeneralSection extends BaseSection { | ||||
| 			clickHandler: () => { | ||||
| 				const newValue = !ConfigUtil.getConfigItem('autoUpdate'); | ||||
| 				ConfigUtil.setConfigItem('autoUpdate', newValue); | ||||
| 				if (!newValue) { | ||||
| 					ConfigUtil.setConfigItem('betaUpdate', false); | ||||
| 					this.betaUpdateOption(); | ||||
| 				} | ||||
| 				this.autoUpdateOption(); | ||||
| 			} | ||||
| 		}); | ||||
| @@ -247,9 +248,11 @@ class GeneralSection extends BaseSection { | ||||
| 			value: ConfigUtil.getConfigItem('betaUpdate', false), | ||||
| 			clickHandler: () => { | ||||
| 				const newValue = !ConfigUtil.getConfigItem('betaUpdate'); | ||||
| 				if (ConfigUtil.getConfigItem('autoUpdate')) { | ||||
| 					ConfigUtil.setConfigItem('betaUpdate', newValue); | ||||
| 					this.betaUpdateOption(); | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,6 @@ class NetworkSection extends BaseSection { | ||||
| 						</div> | ||||
| 						<div class="setting-row"> | ||||
| 							<div class="action green" id="proxy-save-action"> | ||||
| 								<i class="material-icons">check_box</i> | ||||
| 								<span>Save</span> | ||||
| 							</div> | ||||
| 						</div> | ||||
| @@ -100,7 +99,7 @@ class NetworkSection extends BaseSection { | ||||
| 				if (newValue === false) { | ||||
| 					// Remove proxy system proxy settings | ||||
| 					ConfigUtil.setConfigItem('proxyRules', ''); | ||||
| 					ipcRenderer.send('forward-message', 'reload-proxy', true); | ||||
| 					ipcRenderer.send('forward-message', 'reload-proxy', false); | ||||
| 				} | ||||
| 				ConfigUtil.setConfigItem('useSystemProxy', newValue); | ||||
| 				this.updateProxyOption(); | ||||
|   | ||||
| @@ -14,6 +14,7 @@ class ShortcutsSection extends BaseSection { | ||||
|  | ||||
| 		return ` | ||||
|             <div class="settings-pane"> | ||||
|             <div class="settings-card tip"><p><b><i class="material-icons md-14">settings</i>Tip:  </b>These desktop app shortcuts extend the Zulip webapp's <span id="open-hotkeys-link"> keyboard shortcuts</span>.</p></div> | ||||
|               <div class="title">Application Shortcuts</div> | ||||
|               <div class="settings-card"> | ||||
|                 <table> | ||||
| @@ -160,7 +161,6 @@ class ShortcutsSection extends BaseSection { | ||||
|                 </table> | ||||
|                 <div class="setting-control"></div> | ||||
|               </div> | ||||
|               <div class="settings-card tip"><b><i class="material-icons md-14">settings</i>Tip: </b>These desktop app shortcuts extend the Zulip webapp's <span id="open-hotkeys-link">keyboard shortcuts</span>.</div> | ||||
|             </div> | ||||
| 		`; | ||||
| 	} | ||||
|   | ||||
| @@ -99,7 +99,9 @@ const renderNativeImage = function (arg) { | ||||
| 		.then(() => renderCanvas(arg)) | ||||
| 		.then(canvas => { | ||||
| 			const pngData = nativeImage.createFromDataURL(canvas.toDataURL('image/png')).toPNG(); | ||||
| 			return Promise.resolve(nativeImage.createFromBuffer(pngData, config.pixelRatio)); | ||||
| 			return Promise.resolve(nativeImage.createFromBuffer(pngData, { | ||||
| 				scaleFactor: config.pixelRatio | ||||
| 			})); | ||||
| 		}); | ||||
| }; | ||||
|  | ||||
| @@ -115,26 +117,13 @@ function sendAction(action) { | ||||
|  | ||||
| const createTray = function () { | ||||
| 	window.tray = new Tray(iconPath()); | ||||
| 	const contextMenu = Menu.buildFromTemplate([{ | ||||
| 		label: 'About', | ||||
| 		click() { | ||||
| 			// We need to focus the main window first | ||||
| 			ipcRenderer.send('focus-app'); | ||||
| 			sendAction('open-about'); | ||||
| 		} | ||||
| 	}, | ||||
| 	const contextMenu = Menu.buildFromTemplate([ | ||||
| 		{ | ||||
| 		type: 'separator' | ||||
| 	}, | ||||
| 	{ | ||||
| 		label: 'Focus', | ||||
| 			label: 'Zulip', | ||||
| 			click() { | ||||
| 				ipcRenderer.send('focus-app'); | ||||
| 			} | ||||
| 		}, | ||||
| 	{ | ||||
| 		type: 'separator' | ||||
| 	}, | ||||
| 		{ | ||||
| 			label: 'Settings', | ||||
| 			click() { | ||||
|   | ||||
| @@ -12,6 +12,7 @@ const Logger = require('./logger-util'); | ||||
| const CertificateUtil = require(__dirname + '/certificate-util.js'); | ||||
| const ProxyUtil = require(__dirname + '/proxy-util.js'); | ||||
| const ConfigUtil = require(__dirname + '/config-util.js'); | ||||
| const SystemUtil = require(__dirname + '/../utils/system-util.js'); | ||||
|  | ||||
| const logger = new Logger({ | ||||
| 	file: `domain-util.log`, | ||||
| @@ -65,7 +66,7 @@ class DomainUtil { | ||||
| 	addDomain(server) { | ||||
| 		return new Promise(resolve => { | ||||
| 			if (server.icon) { | ||||
| 				this.saveServerIcon(server.icon).then(localIconUrl => { | ||||
| 				this.saveServerIcon(server).then(localIconUrl => { | ||||
| 					server.icon = localIconUrl; | ||||
| 					this.db.push('/domains[]', server, true); | ||||
| 					this.reloadDB(); | ||||
| @@ -129,7 +130,9 @@ class DomainUtil { | ||||
| 		const checkDomain = { | ||||
| 			url: domain + '/static/audio/zulip.ogg', | ||||
| 			ca: (certificateLocation) ? certificateLocation : '', | ||||
| 			proxy: proxyEnabled ? ProxyUtil.getProxy(domain) : '' | ||||
| 			proxy: proxyEnabled ? ProxyUtil.getProxy(domain) : '', | ||||
| 			ecdhCurve: 'auto', | ||||
| 			headers: { 'User-Agent': SystemUtil.getUserAgent() } | ||||
| 		}; | ||||
|  | ||||
| 		const serverConf = { | ||||
| @@ -203,10 +206,25 @@ class DomainUtil { | ||||
| 	} | ||||
|  | ||||
| 	getServerSettings(domain) { | ||||
| 		const certificate = CertificateUtil.getCertificate(encodeURIComponent(domain)); | ||||
| 		let certificateLocation = ''; | ||||
|  | ||||
| 		if (certificate) { | ||||
| 			// To handle case where certificate has been moved from the location in certificates.json | ||||
| 			try { | ||||
| 				certificateLocation = fs.readFileSync(certificate); | ||||
| 			} catch (err) { | ||||
| 				logger.warn('Error while trying to get certificate: ' + err); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		const proxyEnabled = ConfigUtil.getConfigItem('useManualProxy') || ConfigUtil.getConfigItem('useSystemProxy'); | ||||
| 		const serverSettingsOptions = { | ||||
| 			url: domain + '/api/v1/server_settings', | ||||
| 			proxy: proxyEnabled ? ProxyUtil.getProxy(domain) : '' | ||||
| 			ca: (certificateLocation) ? certificateLocation : '', | ||||
| 			proxy: proxyEnabled ? ProxyUtil.getProxy(domain) : '', | ||||
| 			ecdhCurve: 'auto', | ||||
| 			headers: { 'User-Agent': SystemUtil.getUserAgent() } | ||||
| 		}; | ||||
| 		return new Promise((resolve, reject) => { | ||||
| 			request(serverSettingsOptions, (error, response) => { | ||||
| @@ -228,12 +246,33 @@ class DomainUtil { | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	saveServerIcon(url) { | ||||
| 	saveServerIcon(server) { | ||||
| 		const url = server.icon; | ||||
| 		const domain = server.url; | ||||
|  | ||||
| 		const certificate = CertificateUtil.getCertificate(encodeURIComponent(domain)); | ||||
| 		let certificateLocation = ''; | ||||
|  | ||||
| 		if (certificate) { | ||||
| 			// To handle case where certificate has been moved from the location in certificates.json | ||||
| 			try { | ||||
| 				certificateLocation = fs.readFileSync(certificate); | ||||
| 			} catch (err) { | ||||
| 				logger.warn('Error while trying to get certificate: ' + err); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		const proxyEnabled = ConfigUtil.getConfigItem('useManualProxy') || ConfigUtil.getConfigItem('useSystemProxy'); | ||||
|  | ||||
| 		// Add proxy and certificate as a parameter if its being used. | ||||
| 		const serverIconOptions = { | ||||
| 			url, | ||||
| 			proxy: proxyEnabled ? ProxyUtil.getProxy(url) : '' | ||||
| 			ca: (certificateLocation) ? certificateLocation : '', | ||||
| 			proxy: proxyEnabled ? ProxyUtil.getProxy(url) : '', | ||||
| 			ecdhCurve: 'auto', | ||||
| 			headers: { 'User-Agent': SystemUtil.getUserAgent() } | ||||
| 		}; | ||||
|  | ||||
| 		// The save will always succeed. If url is invalid, downgrade to default icon. | ||||
| 		return new Promise(resolve => { | ||||
| 			const filePath = this.generateFilePath(url); | ||||
| @@ -267,7 +306,7 @@ class DomainUtil { | ||||
| 	updateSavedServer(url, index) { | ||||
| 		// Does not promise successful update | ||||
| 		this.checkDomain(url, true).then(newServerConf => { | ||||
| 			this.saveServerIcon(newServerConf.icon).then(localIconUrl => { | ||||
| 			this.saveServerIcon(newServerConf).then(localIconUrl => { | ||||
| 				newServerConf.icon = localIconUrl; | ||||
| 				this.updateDomain(index, newServerConf); | ||||
| 				this.reloadDB(); | ||||
|   | ||||
| @@ -45,8 +45,8 @@ class ReconnectUtil { | ||||
| 						const errMsgHolder = document.querySelector('#description'); | ||||
| 						if (errMsgHolder) { | ||||
| 							errMsgHolder.innerHTML = ` | ||||
| 										<div>You internet connection does't seem to work properly!</div> | ||||
| 										</div>Verify that it works and then click try again.</div>`; | ||||
| 										<div>Your internet connection doesn't seem to work properly!</div> | ||||
| 										<div>Verify that it works and then click try again.</div>`; | ||||
| 						} | ||||
| 						return resolve(false); | ||||
| 					}); | ||||
|   | ||||
							
								
								
									
										34
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								changelog.md
									
									
									
									
									
								
							| @@ -1,9 +1,39 @@ | ||||
| # Version History | ||||
|  | ||||
|  | ||||
|  | ||||
| All notable changes to the Zulip desktop app are documented in this file. | ||||
|  | ||||
| ### v2.3.82 --2018-09-25 | ||||
|  | ||||
| **New features**: | ||||
| * UI enhancements. | ||||
| * Updated some menu items. | ||||
|  | ||||
| **Fixes**: | ||||
| * Fix about page not opening up. | ||||
|  | ||||
| <hr> | ||||
|  | ||||
| ### v2.3.8 --2018-09-25 | ||||
|  | ||||
| **New features**: | ||||
| * Auto hide menubar on Windows/Linux. Add a setting option for the same. | ||||
| * Improve design of setting page. | ||||
| * Toggle app on clicking the tray icon (Linux). | ||||
| * Update sidebar realm name when it's changed in webapp. | ||||
| * left-sidebar: Add initial character of realm name instead of default icon. | ||||
|  | ||||
| **Fixes**: | ||||
| * linux: Fix ALT+SHIFT opening menu items on Linux. | ||||
| * sentry: Add ignore errors to sentry configuration. | ||||
| * Linux: Add label for help menu item. | ||||
| * file-attachments: Allow multiple downloads of same file name. | ||||
|  | ||||
| **Module Updates** | ||||
| * electron: Update electron to v2.0.9. | ||||
|  | ||||
|  | ||||
| <hr> | ||||
|  | ||||
|  | ||||
| ### v2.3.7-beta --2018-09-03 | ||||
|  | ||||
|   | ||||
							
								
								
									
										1091
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1091
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,7 +1,7 @@ | ||||
| { | ||||
|   "name": "zulip", | ||||
|   "productName": "Zulip", | ||||
|   "version": "2.3.8", | ||||
|   "version": "2.5.0", | ||||
|   "main": "./app/main", | ||||
|   "description": "Zulip Desktop App", | ||||
|   "license": "Apache-2.0", | ||||
| @@ -123,7 +123,7 @@ | ||||
|     "assert": "1.4.1", | ||||
|     "cp-file": "^5.0.0", | ||||
|     "devtron": "1.4.0", | ||||
|     "electron": "2.0.9", | ||||
|     "electron": "3.0.10", | ||||
|     "electron-builder": "20.28.3", | ||||
|     "electron-connect": "0.6.2", | ||||
|     "electron-debug": "1.4.0", | ||||
| @@ -133,7 +133,7 @@ | ||||
|     "is-ci": "^1.0.10", | ||||
|     "nodemon": "^1.14.11", | ||||
|     "pre-commit": "1.2.2", | ||||
|     "spectron": "3.8.0", | ||||
|     "spectron": "^5.0.0", | ||||
|     "tap-colorize": "^1.2.0", | ||||
|     "tape": "^4.8.0", | ||||
|     "xo": "0.18.2" | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| { | ||||
|     "name": "zulip", | ||||
|  "productName": "ZulipTest", | ||||
|  "version": "2.3.3", | ||||
|     "productName": "Zulip", | ||||
|     "version": "2.4.0", | ||||
|     "main": "../../app/main", | ||||
|     "description": "Zulip Desktop App", | ||||
|     "license": "Apache-2.0", | ||||
| @@ -106,8 +106,6 @@ | ||||
|         "publisherName": "Kandra Labs, Inc." | ||||
|       }, | ||||
|       "nsis": { | ||||
|    "perMachine": true, | ||||
|    "oneClick": false, | ||||
|         "allowToChangeInstallationDirectory": true | ||||
|       } | ||||
|     }, | ||||
| @@ -123,8 +121,8 @@ | ||||
|       "assert": "1.4.1", | ||||
|       "cp-file": "^5.0.0", | ||||
|       "devtron": "1.4.0", | ||||
|   "electron": "2.0.1", | ||||
|   "electron-builder": "20.20.4", | ||||
|       "electron": "3.0.10", | ||||
|       "electron-builder": "20.38.4", | ||||
|       "electron-connect": "0.6.2", | ||||
|       "electron-debug": "1.4.0", | ||||
|       "google-translate-api": "2.3.0", | ||||
| @@ -153,7 +151,7 @@ | ||||
|             "max-lines": [ | ||||
|               "warn", | ||||
|               { | ||||
|        "max": 500, | ||||
|                 "max": 600, | ||||
|                 "skipBlankLines": true, | ||||
|                 "skipComments": true | ||||
|               } | ||||
| @@ -173,7 +171,7 @@ | ||||
|         } | ||||
|       ], | ||||
|       "ignore": [ | ||||
|    "tests/e2e/*.js", | ||||
|         "tests/*.js", | ||||
|         "tools/locale-helper/*.js" | ||||
|       ], | ||||
|       "envs": [ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user