'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'); import t = require('../../utils/translation-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 `
${t.__('Appearance')}
${t.__('Show app icon in system tray')}
${t.__('Show app unread badge')}
${t.__('Bounce dock on new private message')}
${t.__('Flash taskbar on new message')}
${t.__('Desktop Notifications')}
${t.__('Show desktop notifications')}
${t.__('Mute all sounds from Zulip')}
${t.__('App Updates')}
${t.__('Enable auto updates')}
${t.__('Get beta updates')}
${t.__('Functionality')}
${t.__('Start app at login')}
${t.__('Always start minimized')}
${t.__('Quit when the window is closed')}
${t.__('Enable spellchecker (requires restart)')}
${t.__('Advanced')}
${t.__('Enable error reporting (requires restart)')}
${t.__('Show downloaded files in file manager')}
${t.__('Add custom CSS')}
${ConfigUtil.getConfigItem('customCSS')}
indeterminate_check_box ${t.__('Delete')}
${t.__('Default download location')}
${ConfigUtil.getConfigItem('downloadsPath', `${app.getPath('downloads')}`)}
${t.__('Reset Application Data')}
${t.__('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.updateQuitOnCloseOption(); 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(); } }); } updateQuitOnCloseOption(): void { this.generateSettingOption({ $element: document.querySelector('#quitOnClose-option .setting-control'), value: ConfigUtil.getConfigItem('quitOnClose', false), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('quitOnClose'); ConfigUtil.setConfigItem('quitOnClose', newValue); this.updateQuitOnCloseOption(); } }); } 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;