'use strict'; import { ipcRenderer, remote, OpenDialogOptions } from 'electron'; import path = require('path'); import fs = require('fs-extra'); const { app, dialog } = remote; const currentBrowserWindow = remote.getCurrentWindow(); import BaseSection = require('./base-section'); import ConfigUtil = require('../../utils/config-util'); import EnterpriseUtil = require('./../../utils/enterprise-util'); class GeneralSection extends BaseSection { // TODO: TypeScript - Here props should be object type props: any; constructor(props: any) { super(); this.props = props; } template(): string { return `
Appearance
Show app icon in system tray
Show app unread badge
Bounce dock on new private message
Flash taskbar on new message
Desktop Notifications
Show desktop notifications
Mute all sounds from Zulip
App Updates
Enable auto updates
Get beta updates
Functionality
Start app at login
Always start minimized
Enable spellchecker (requires restart)
Advanced
Enable error reporting (requires restart)
Show downloaded files in file manager
Add custom CSS
${ConfigUtil.getConfigItem('customCSS')}
indeterminate_check_box Delete
Default download location
${ConfigUtil.getConfigItem('downloadsPath', `${app.getPath('downloads')}`)}
Reset Application Data
This will delete all application data including all added accounts and preferences
`; } init(): void { this.props.$root.innerHTML = this.template(); this.updateTrayOption(); this.updateBadgeOption(); this.updateSilentOption(); this.autoUpdateOption(); this.betaUpdateOption(); this.updateSidebarOption(); this.updateStartAtLoginOption(); this.updateResetDataOption(); this.showDesktopNotification(); this.enableSpellchecker(); this.minimizeOnStart(); this.addCustomCSS(); this.showCustomCSSPath(); this.removeCustomCSS(); this.downloadFolder(); this.showDownloadFolder(); this.enableErrorReporting(); // Platform specific settings // Flashing taskbar on Windows if (process.platform === 'win32') { this.updateFlashTaskbar(); } // Dock bounce on macOS if (process.platform === 'darwin') { this.updateDockBouncing(); } // Auto hide menubar on Windows and Linux if (process.platform !== 'darwin') { this.updateMenubarOption(); } } updateTrayOption(): void { this.generateSettingOption({ $element: document.querySelector('#tray-option .setting-control'), value: ConfigUtil.getConfigItem('trayIcon', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('trayIcon'); ConfigUtil.setConfigItem('trayIcon', newValue); ipcRenderer.send('forward-message', 'toggletray'); this.updateTrayOption(); } }); } updateMenubarOption(): void { this.generateSettingOption({ $element: document.querySelector('#menubar-option .setting-control'), value: ConfigUtil.getConfigItem('autoHideMenubar', false), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('autoHideMenubar'); ConfigUtil.setConfigItem('autoHideMenubar', newValue); ipcRenderer.send('toggle-menubar', newValue); this.updateMenubarOption(); } }); } updateBadgeOption(): void { this.generateSettingOption({ $element: document.querySelector('#badge-option .setting-control'), value: ConfigUtil.getConfigItem('badgeOption', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('badgeOption'); ConfigUtil.setConfigItem('badgeOption', newValue); ipcRenderer.send('toggle-badge-option', newValue); this.updateBadgeOption(); } }); } updateDockBouncing(): void { this.generateSettingOption({ $element: document.querySelector('#dock-bounce-option .setting-control'), value: ConfigUtil.getConfigItem('dockBouncing', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('dockBouncing'); ConfigUtil.setConfigItem('dockBouncing', newValue); this.updateDockBouncing(); } }); } updateFlashTaskbar(): void { this.generateSettingOption({ $element: document.querySelector('#flash-taskbar-option .setting-control'), value: ConfigUtil.getConfigItem('flashTaskbarOnMessage', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('flashTaskbarOnMessage'); ConfigUtil.setConfigItem('flashTaskbarOnMessage', newValue); this.updateFlashTaskbar(); } }); } autoUpdateOption(): void { this.generateSettingOption({ $element: document.querySelector('#autoupdate-option .setting-control'), disabled: EnterpriseUtil.configItemExists('autoUpdate'), value: ConfigUtil.getConfigItem('autoUpdate', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('autoUpdate'); ConfigUtil.setConfigItem('autoUpdate', newValue); if (!newValue) { ConfigUtil.setConfigItem('betaUpdate', false); this.betaUpdateOption(); } this.autoUpdateOption(); } }); } betaUpdateOption(): void { this.generateSettingOption({ $element: document.querySelector('#betaupdate-option .setting-control'), value: ConfigUtil.getConfigItem('betaUpdate', false), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('betaUpdate'); if (ConfigUtil.getConfigItem('autoUpdate')) { ConfigUtil.setConfigItem('betaUpdate', newValue); this.betaUpdateOption(); } } }); } updateSilentOption(): void { this.generateSettingOption({ $element: document.querySelector('#silent-option .setting-control'), value: ConfigUtil.getConfigItem('silent', false), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('silent', true); ConfigUtil.setConfigItem('silent', newValue); this.updateSilentOption(); // TODO: TypeScript: currentWindow of type BrowserWindow doesn't // have a .send() property per typescript. (currentBrowserWindow as any).send('toggle-silent', newValue); } }); } showDesktopNotification(): void { this.generateSettingOption({ $element: document.querySelector('#show-notification-option .setting-control'), value: ConfigUtil.getConfigItem('showNotification', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('showNotification', true); ConfigUtil.setConfigItem('showNotification', newValue); this.showDesktopNotification(); } }); } updateSidebarOption(): void { this.generateSettingOption({ $element: document.querySelector('#sidebar-option .setting-control'), value: ConfigUtil.getConfigItem('showSidebar', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('showSidebar'); ConfigUtil.setConfigItem('showSidebar', newValue); ipcRenderer.send('forward-message', 'toggle-sidebar', newValue); this.updateSidebarOption(); } }); } updateStartAtLoginOption(): void { this.generateSettingOption({ $element: document.querySelector('#startAtLogin-option .setting-control'), value: ConfigUtil.getConfigItem('startAtLogin', false), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('startAtLogin'); ConfigUtil.setConfigItem('startAtLogin', newValue); ipcRenderer.send('toggleAutoLauncher', newValue); this.updateStartAtLoginOption(); } }); } enableSpellchecker(): void { this.generateSettingOption({ $element: document.querySelector('#enable-spellchecker-option .setting-control'), value: ConfigUtil.getConfigItem('enableSpellchecker', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('enableSpellchecker'); ConfigUtil.setConfigItem('enableSpellchecker', newValue); this.enableSpellchecker(); } }); } enableErrorReporting(): void { this.generateSettingOption({ $element: document.querySelector('#enable-error-reporting .setting-control'), value: ConfigUtil.getConfigItem('errorReporting', true), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('errorReporting'); ConfigUtil.setConfigItem('errorReporting', newValue); this.enableErrorReporting(); } }); } clearAppDataDialog(): void { const clearAppDataMessage = 'By clicking proceed you will be removing all added accounts and preferences from Zulip. When the application restarts, it will be as if you are starting Zulip for the first time.'; const getAppPath = path.join(app.getPath('appData'), app.getName()); dialog.showMessageBox({ type: 'warning', buttons: ['YES', 'NO'], defaultId: 0, message: 'Are you sure', detail: clearAppDataMessage }, response => { if (response === 0) { fs.remove(getAppPath); setTimeout(() => ipcRenderer.send('forward-message', 'hard-reload'), 1000); } }); } customCssDialog(): void { const showDialogOptions: OpenDialogOptions = { title: 'Select file', properties: ['openFile'], filters: [{ name: 'CSS file', extensions: ['css'] }] }; dialog.showOpenDialog(showDialogOptions, selectedFile => { if (selectedFile) { ConfigUtil.setConfigItem('customCSS', selectedFile[0]); ipcRenderer.send('forward-message', 'hard-reload'); } }); } updateResetDataOption(): void { const resetDataButton = document.querySelector('#resetdata-option .reset-data-button'); resetDataButton.addEventListener('click', () => { this.clearAppDataDialog(); }); } minimizeOnStart(): void { this.generateSettingOption({ $element: document.querySelector('#start-minimize-option .setting-control'), value: ConfigUtil.getConfigItem('startMinimized', false), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('startMinimized'); ConfigUtil.setConfigItem('startMinimized', newValue); this.minimizeOnStart(); } }); } addCustomCSS(): void { const customCSSButton = document.querySelector('#add-custom-css .custom-css-button'); customCSSButton.addEventListener('click', () => { this.customCssDialog(); }); } showCustomCSSPath(): void { if (!ConfigUtil.getConfigItem('customCSS')) { const cssPATH: HTMLElement = document.querySelector('#remove-custom-css'); cssPATH.style.display = 'none'; } } removeCustomCSS(): void { const removeCSSButton = document.querySelector('#css-delete-action'); removeCSSButton.addEventListener('click', () => { ConfigUtil.setConfigItem('customCSS', ""); ipcRenderer.send('forward-message', 'hard-reload'); }); } downloadFolderDialog(): void { const showDialogOptions: OpenDialogOptions = { title: 'Select Download Location', properties: ['openDirectory'] }; dialog.showOpenDialog(showDialogOptions, selectedFolder => { if (selectedFolder) { ConfigUtil.setConfigItem('downloadsPath', selectedFolder[0]); const downloadFolderPath: HTMLElement = document.querySelector('.download-folder-path'); downloadFolderPath.innerText = selectedFolder[0]; } }); } downloadFolder(): void { const downloadFolder = document.querySelector('#download-folder .download-folder-button'); downloadFolder.addEventListener('click', () => { this.downloadFolderDialog(); }); } showDownloadFolder(): void { this.generateSettingOption({ $element: document.querySelector('#show-download-folder .setting-control'), value: ConfigUtil.getConfigItem('showDownloadFolder', false), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('showDownloadFolder'); ConfigUtil.setConfigItem('showDownloadFolder', newValue); this.showDownloadFolder(); } }); } } export = GeneralSection;