'use strict'; const path = require('path'); const { ipcRenderer, remote } = require('electron'); const fs = require('fs-extra'); const { app, dialog } = remote; const currentBrowserWindow = remote.getCurrentWindow(); const BaseSection = require(__dirname + '/base-section.js'); const ConfigUtil = require(__dirname + '/../../utils/config-util.js'); class GeneralSection extends BaseSection { constructor(props) { super(); this.props = props; } template() { return `
Appearance
Show app icon in system tray
Show app unread badge
Flash taskbar on new message
Desktop Notification
Show Desktop Notifications
Mute all sounds from Zulip
App Updates
Get beta updates
Functionality
Start app at login
Always start minimized
Enable Spellchecker (requires restart)
Add custom CSS
This will inject the selected css stylesheet in all the added accounts
${ConfigUtil.getConfigItem('customCSS')}
indeterminate_check_box Delete
Reset Application Data
This will delete all application data including all added accounts and preferences
`; } init() { this.props.$root.innerHTML = this.template(); this.updateTrayOption(); this.updateBadgeOption(); this.updateSilentOption(); this.updateUpdateOption(); this.updateSidebarOption(); this.updateStartAtLoginOption(); this.updateResetDataOption(); this.showDesktopNotification(); this.enableSpellchecker(); this.minimizeOnStart(); this.addCustomCSS(); this.showCustomCSSPath(); this.removeCustomCSS(); // Platform specific settings // Flashing taskbar on Windows if (process.platform === 'win32') { this.updateFlashTaskbar(); } } updateTrayOption() { 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(); } }); } updateBadgeOption() { 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(); } }); } updateFlashTaskbar() { 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(); } }); } updateUpdateOption() { this.generateSettingOption({ $element: document.querySelector('#betaupdate-option .setting-control'), value: ConfigUtil.getConfigItem('betaUpdate', false), clickHandler: () => { const newValue = !ConfigUtil.getConfigItem('betaUpdate'); ConfigUtil.setConfigItem('betaUpdate', newValue); this.updateUpdateOption(); } }); } updateSilentOption() { 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(); currentBrowserWindow.send('toggle-silent', newValue); } }); } showDesktopNotification() { 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() { 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() { 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() { 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(); } }); } clearAppDataDialog() { 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() { const showDialogOptions = { title: 'Select file', defaultId: 1, 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() { const resetDataButton = document.querySelector('#resetdata-option .reset-data-button'); resetDataButton.addEventListener('click', () => { this.clearAppDataDialog(); }); } minimizeOnStart() { 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() { const customCSSButton = document.querySelector('#add-custom-css .custom-css-button'); customCSSButton.addEventListener('click', () => { this.customCssDialog(); }); } showCustomCSSPath() { if (!ConfigUtil.getConfigItem('customCSS')) { const cssPATH = document.getElementById('remove-custom-css'); cssPATH.style.display = 'none'; } } removeCustomCSS() { const removeCSSButton = document.getElementById('css-delete-action'); removeCSSButton.addEventListener('click', () => { ConfigUtil.setConfigItem('customCSS'); ipcRenderer.send('forward-message', 'hard-reload'); }); } } module.exports = GeneralSection;