From 1689c40cef1d290c5f4ac4b4d6faff4c47ca4741 Mon Sep 17 00:00:00 2001 From: Justin Cherniak Date: Sat, 16 Sep 2017 15:36:28 -0700 Subject: [PATCH 01/12] Add Google Voice support, with notifications --- app/store/ServicesList.js | 9 +++++++++ resources/icons/googlevoice.png | Bin 0 -> 15869 bytes 2 files changed, 9 insertions(+) create mode 100644 resources/icons/googlevoice.png diff --git a/app/store/ServicesList.js b/app/store/ServicesList.js index 92adb130..1495b17f 100644 --- a/app/store/ServicesList.js +++ b/app/store/ServicesList.js @@ -829,6 +829,15 @@ Ext.define('Rambox.store.ServicesList', { ,type: 'messaging' ,js_unread: 'function checkUnread(){var e=document.getElementsByClassName("unreadCount"),n=0;for(i=0;i=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);' ,dont_update_unread_from_title: true + }, + { + id: 'googlevoice' + ,logo: 'googlevoice.png' + ,name: 'Google Voice' + ,description: 'A free phone number for life. Stay in touch from any screen. Use your free number to text, call, and check voicemail all from one app. Plus, Google Voice works on all of your devices so you can connect and communicate how you want.' + ,url: 'https://voice.google.com' + ,type: 'messaging' + ,js_unread: 'function parseIntOrZero(e){return isNaN(parseInt(e))?0:parseInt(e)}function checkUnread(){var e=document.querySelector(".msgCount"),n=0;e?n=parseIntOrZero(e.innerHTML.replace(/[\(\) ]/gi,"")):["Messages","Calls","Voicemail"].forEach(function(e){var r=document.querySelector(\'gv-nav-button[tooltip="\'+e+\'"] div[aria-label="Unread count"]\');r&&(n+=parseIntOrZero(r.innerHTML))}),updateBadge(n)}function updateBadge(e){var n=e>0?"("+e+") ":"";document.title=n+originalTitle}var originalTitle=document.title;setInterval(checkUnread,3000);' } ] }); diff --git a/resources/icons/googlevoice.png b/resources/icons/googlevoice.png new file mode 100644 index 0000000000000000000000000000000000000000..76682773cdf56eb4bb28429626741685dc3c9be9 GIT binary patch literal 15869 zcmd6OWmg^?ry<@6M_c|?l!;#cXvyG;O+r}1b26Lf;+rx_5kGwe62TSG2B| zMZMCp(@xW}PqPoQ`L8dp|8{V$Xw3*;XYG~jm6Xa*AW~Bo9sjPe4~Um=P|w8${~LAhzAycMQT0>A$C9}F0S`;!k_ml-&v~4Mi~vgwCN?X zdg#qTWV*QiR}S^UwqFCQIV@XD0y>5iEBgzt>1Bi%>XW~pMDJFadIp2BR;dwz>n&gQ zFJi&pnW|z8c-)_Gne|5E5@}#-?Mps$w}eXTktXRN$Ab4Tly0ca5Hd^znTFQ|%I!5a z#ekQk9jSe9QiQZ2`c!y-p2M{#�egjD;fcb^~0$gDLTt+tQ_z>an#os3X!qT>gTf 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 X+mNl>Y<&Lx&kc~5R*|ZZFbVp9p2I^o literal 0 HcmV?d00001 From d80de2a61043c12c2e16cd1fe010ef5a40bd564d Mon Sep 17 00:00:00 2001 From: Maxime Myers Date: Sun, 17 Sep 2017 11:24:05 -0400 Subject: [PATCH 02/12] Add tabs service icon loading (slack) --- app/util/IconLoader.js | 32 ++++++++++++++++++++++++++++++++ app/ux/WebView.js | 13 ++++++++----- 2 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 app/util/IconLoader.js diff --git a/app/util/IconLoader.js b/app/util/IconLoader.js new file mode 100644 index 00000000..b4f0349b --- /dev/null +++ b/app/util/IconLoader.js @@ -0,0 +1,32 @@ +/** + * Singleton class to handle the global unread counter. + */ +Ext.define('Rambox.util.IconLoader', { + + singleton: true, + + constructor: function(config) { + + config = config || {}; + + /** + * Sets the icon for a specific service. + * + * @param {*} id Id of the service + */ + this.loadServiceIconUrl = function (service, webview) { + switch (service.type) { + case 'slack': + webview.executeJavaScript("(()=>{let a=document.querySelector('.team_icon');if(!a){const d=document.querySelector('#team_menu');d&&(d.click(),a=document.querySelector('.team_icon'))}if(!a)return!1;const{style:{backgroundImage:b}}=a,c=document.createEvent('MouseEvents');return c.initEvent('mousedown',!0,!0),document.querySelector('.client_channels_list_container').dispatchEvent(c),b.slice(5,-2)})();", + false, + function (backgroundImage) { + if (backgroundImage) { + service.fireEvent('iconchange', service, backgroundImage, service.icon); + } + } + ); + break; + } + }; + } +}); diff --git a/app/ux/WebView.js b/app/ux/WebView.js index da8c6f8b..3abc58c4 100644 --- a/app/ux/WebView.js +++ b/app/ux/WebView.js @@ -8,7 +8,8 @@ Ext.define('Rambox.ux.WebView',{ ,requires: [ 'Rambox.util.Format' ,'Rambox.util.Notifier' - ,'Rambox.util.UnreadCounter' + ,'Rambox.util.UnreadCounter' + ,'Rambox.util.IconLoader' ] // private @@ -250,11 +251,13 @@ Ext.define('Rambox.ux.WebView',{ Rambox.app.setTotalServicesLoaded( Rambox.app.getTotalServicesLoaded() + 1 ); // Apply saved zoom level - webview.setZoomLevel(me.record.get('zoomLevel')); + webview.setZoomLevel(me.record.get('zoomLevel')); + + Rambox.util.IconLoader.loadServiceIconUrl(me, webview); }); // Open links in default browser - webview.addEventListener('new-window', function(e) { + webview.addEventListener('new-window', function(e) { switch ( me.type ) { case 'skype': // hack to fix multiple browser tabs on Skype link click, re #11 @@ -338,12 +341,12 @@ Ext.define('Rambox.ux.WebView',{ require('electron').shell.openExternal(e.url); } }); - + webview.addEventListener('will-navigate', function(e, url) { e.preventDefault(); }); - webview.addEventListener("dom-ready", function(e) { + webview.addEventListener("dom-ready", function(e) { // Mute Webview if ( me.record.get('muted') || localStorage.getItem('locked') || JSON.parse(localStorage.getItem('dontDisturb')) ) me.setAudioMuted(true, true); From c367a491f96d7eb84f602dd561c35c3e88d3558e Mon Sep 17 00:00:00 2001 From: Maxime Myers Date: Sun, 17 Sep 2017 11:35:36 -0400 Subject: [PATCH 03/12] Convert indentation to tab, to match source --- app/ux/WebView.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/ux/WebView.js b/app/ux/WebView.js index 3abc58c4..012bc844 100644 --- a/app/ux/WebView.js +++ b/app/ux/WebView.js @@ -8,8 +8,8 @@ Ext.define('Rambox.ux.WebView',{ ,requires: [ 'Rambox.util.Format' ,'Rambox.util.Notifier' - ,'Rambox.util.UnreadCounter' - ,'Rambox.util.IconLoader' + ,'Rambox.util.UnreadCounter' + ,'Rambox.util.IconLoader' ] // private @@ -251,13 +251,13 @@ Ext.define('Rambox.ux.WebView',{ Rambox.app.setTotalServicesLoaded( Rambox.app.getTotalServicesLoaded() + 1 ); // Apply saved zoom level - webview.setZoomLevel(me.record.get('zoomLevel')); - - Rambox.util.IconLoader.loadServiceIconUrl(me, webview); + webview.setZoomLevel(me.record.get('zoomLevel')); + + Rambox.util.IconLoader.loadServiceIconUrl(me, webview); }); // Open links in default browser - webview.addEventListener('new-window', function(e) { + webview.addEventListener('new-window', function(e) { switch ( me.type ) { case 'skype': // hack to fix multiple browser tabs on Skype link click, re #11 @@ -341,12 +341,12 @@ Ext.define('Rambox.ux.WebView',{ require('electron').shell.openExternal(e.url); } }); - + webview.addEventListener('will-navigate', function(e, url) { e.preventDefault(); }); - webview.addEventListener("dom-ready", function(e) { + webview.addEventListener("dom-ready", function(e) { // Mute Webview if ( me.record.get('muted') || localStorage.getItem('locked') || JSON.parse(localStorage.getItem('dontDisturb')) ) me.setAudioMuted(true, true); From 0404dd6843569f72b4cfc26f504cc3fcf592aee4 Mon Sep 17 00:00:00 2001 From: wertyuwe Date: Tue, 19 Sep 2017 02:24:34 +0200 Subject: [PATCH 04/12] allow empty Auth0 credentials Fixes stuck loading animation (spinner). --- app/Application.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Application.js b/app/Application.js index cd9ababf..7a8d9668 100644 --- a/app/Application.js +++ b/app/Application.js @@ -35,7 +35,9 @@ Ext.define('Rambox.Application', { Ext.Loader.loadScript({url: Ext.util.Format.format("ext/packages/ext-locale/build/ext-locale-{0}.js", localStorage.getItem('locale-auth0') || 'en')}); // Initialize Auth0 - Rambox.ux.Auth0.init(); + if (auth0Cfg.clientID!=='', auth0Cfg.domain!==''){ + Rambox.ux.Auth0.init(); + } // Set cookies to help Tooltip.io messages segmentation Ext.util.Cookies.set('version', require('electron').remote.app.getVersion()); From 5a3e44bea98f244a3da12de5a55449b150f9d639 Mon Sep 17 00:00:00 2001 From: Justin Cherniak Date: Thu, 21 Sep 2017 12:52:20 -0700 Subject: [PATCH 05/12] Ignore muted channels when considering whether to show an indicator for Slack --- app/store/ServicesList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/store/ServicesList.js b/app/store/ServicesList.js index 92adb130..b4d2338c 100644 --- a/app/store/ServicesList.js +++ b/app/store/ServicesList.js @@ -38,7 +38,7 @@ Ext.define('Rambox.store.ServicesList', { ,description: locale['services[1]'] ,url: 'https://___.slack.com/' ,type: 'messaging' - ,js_unread: 'function checkUnread(){var e=$(".p-channel_sidebar__channel--unread").length,a=0;$(".p-channel_sidebar__badge").each(function(){a+=isNaN(parseInt($(this).html()))?0:parseInt($(this).html())}),updateBadge(e,a)}function updateBadge(e,a){var n=a>0?"("+a+") ":e>0?"(•) ":"";document.title=n+originalTitle}var originalTitle=document.title;setInterval(checkUnread,3e3);' + ,js_unread: 'function checkUnread(){var e=$(".p-channel_sidebar__channel--unread:not(.p-channel_sidebar__channel--muted)").length,a=0;$(".p-channel_sidebar__badge").each(function(){a+=isNaN(parseInt($(this).html()))?0:parseInt($(this).html())}),updateBadge(e,a)}function updateBadge(e,a){var n=a>0?"("+a+") ":e>0?"(•) ":"";document.title=n+originalTitle}var originalTitle=document.title;setInterval(checkUnread,3e3);' }, { id: 'noysi' From 2f89457fd5da245ef70b1c12896ff895aa234754 Mon Sep 17 00:00:00 2001 From: Ramiro Saenz Date: Sat, 30 Sep 2017 20:30:03 -0300 Subject: [PATCH 06/12] Prevent Unsupported browser in Discord Fixes #1177 --- app/store/ServicesList.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/store/ServicesList.js b/app/store/ServicesList.js index 92adb130..c32e5bac 100644 --- a/app/store/ServicesList.js +++ b/app/store/ServicesList.js @@ -188,6 +188,7 @@ Ext.define('Rambox.store.ServicesList', { ,titleBlink: true ,js_unread: 'function checkUnread(){var a=document.getElementsByClassName("guild unread").length,b=0,c=document.getElementsByClassName("badge");for(i=0;i0?"("+b+") ":a>0?"(•) ":"";document.title=c+originalTitle}var originalTitle=document.title;setInterval(checkUnread,3e3);' ,note: 'To enable desktop notifications, you have to go to Options inside Discord.' + ,userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36' }, { id: 'outlook' From 558d9e45a5020d16f2f5caf0e16477e7300855e6 Mon Sep 17 00:00:00 2001 From: Ramiro Saenz Date: Sat, 30 Sep 2017 20:42:42 -0300 Subject: [PATCH 07/12] Fixes #1022 --- app/store/ServicesList.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/store/ServicesList.js b/app/store/ServicesList.js index c32e5bac..b8968405 100644 --- a/app/store/ServicesList.js +++ b/app/store/ServicesList.js @@ -188,6 +188,7 @@ Ext.define('Rambox.store.ServicesList', { ,titleBlink: true ,js_unread: 'function checkUnread(){var a=document.getElementsByClassName("guild unread").length,b=0,c=document.getElementsByClassName("badge");for(i=0;i0?"("+b+") ":a>0?"(•) ":"";document.title=c+originalTitle}var originalTitle=document.title;setInterval(checkUnread,3e3);' ,note: 'To enable desktop notifications, you have to go to Options inside Discord.' + ,dont_update_unread_from_title: true ,userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36' }, { From 9dd5380f60d96e0da70bb057192aa67d59efd50f Mon Sep 17 00:00:00 2001 From: Ramiro Saenz Date: Sat, 30 Sep 2017 21:20:33 -0300 Subject: [PATCH 08/12] Enhance multi monitor/offscreen support Fixes #895 Fixes #920 Fixes #323 --- electron/main.js | 9 +++++++++ electron/utils/positionOnScreen.js | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 electron/utils/positionOnScreen.js diff --git a/electron/main.js b/electron/main.js index 3c571a1d..270adf4d 100644 --- a/electron/main.js +++ b/electron/main.js @@ -162,6 +162,15 @@ function createWindow () { if ( !config.get('start_minimized') && config.get('maximized') ) mainWindow.maximize(); + // Check if the window its outside of the view (ex: multi monitor setup) + const { positionOnScreen } = require('./utils/positionOnScreen'); + const inBounds = positionOnScreen([config.get('x'), config.get('y')]); + if ( inBounds ) { + mainWindow.setPosition(config.get('x'), config.get('y')); + } else { + mainWindow.center(); + } + process.setMaxListeners(10000); // Open the DevTools. diff --git a/electron/utils/positionOnScreen.js b/electron/utils/positionOnScreen.js new file mode 100644 index 00000000..35ca487b --- /dev/null +++ b/electron/utils/positionOnScreen.js @@ -0,0 +1,18 @@ +const { screen } = require('electron'); + +const positionOnScreen = (position) => { + let inBounds = false; + if (position) { + screen.getAllDisplays().forEach((display) => { + if (position[0] >= display.workArea.x && + position[0] <= display.workArea.x + display.workArea.width && + position[1] >= display.workArea.y && + position[1] <= display.workArea.y + display.workArea.height) { + inBounds = true; + } + }); + } + return inBounds; +}; + +module.exports = {positionOnScreen}; From ac6183fbb7dda9638202506b4d1734a65bacd396 Mon Sep 17 00:00:00 2001 From: Ramiro Saenz Date: Sat, 30 Sep 2017 21:32:57 -0300 Subject: [PATCH 09/12] Autofocus in password field in Lock Window Fixes #886 --- app/view/main/MainController.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/view/main/MainController.js b/app/view/main/MainController.js index ab93b03d..58bd4f64 100644 --- a/app/view/main/MainController.js +++ b/app/view/main/MainController.js @@ -384,6 +384,13 @@ Ext.define('Rambox.view.main.MainController', { ] } ] + ,listeners: { + render: function(win) { + win.getEl().on('click', function() { + win.down('textfield').focus(100); + }); + } + } }).show(); winLock.down('textfield').focus(1000); } From b327f70f93654e4d3a89fd1cc6b66c82c5955bf1 Mon Sep 17 00:00:00 2001 From: Ramiro Saenz Date: Mon, 2 Oct 2017 14:19:09 -0300 Subject: [PATCH 10/12] Improve removing service option Clearing all cache, storage data, etc. before removing but it keeps a folder inside the app Partitions folder. This seems to be a "bug" of Electron. Related #828 --- app/ux/WebView.js | 8 ++++ app/view/main/MainController.js | 66 ++++++++++++++++++++++++--------- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/app/ux/WebView.js b/app/ux/WebView.js index da8c6f8b..aa58c4e9 100644 --- a/app/ux/WebView.js +++ b/app/ux/WebView.js @@ -658,4 +658,12 @@ Ext.define('Rambox.ux.WebView',{ me.record.set('zoomLevel', me.zoomLevel); } } + + ,getWebView: function() { + if ( this.record.get('enabled') ) { + return this.down('component').el.dom; + } else { + return false; + } + } }); diff --git a/app/view/main/MainController.js b/app/view/main/MainController.js index 58bd4f64..8404ad03 100644 --- a/app/view/main/MainController.js +++ b/app/view/main/MainController.js @@ -69,7 +69,7 @@ Ext.define('Rambox.view.main.MainController', { Ext.getCmp('tab_'+e.record.get('id')).setTitle(e.record.get('name')); } - ,onEnableDisableService: function(cc, rowIndex, checked) { + ,onEnableDisableService: function(cc, rowIndex, checked, obj, hideTab) { var rec = Ext.getStore('Services').getAt(rowIndex); if ( !checked ) { @@ -87,8 +87,9 @@ Ext.define('Rambox.view.main.MainController', { ,displayTabUnreadCounter: rec.get('displayTabUnreadCounter') ,enabled: rec.get('enabled') ,record: rec + ,hidden: hideTab ,tabConfig: { - service: rec + service: rec } }); } @@ -100,32 +101,60 @@ Ext.define('Rambox.view.main.MainController', { }); } - ,removeServiceFn: function(serviceId) { + ,removeServiceFn: function(serviceId, total, actual) { + var me = this; if ( !serviceId ) return false; - // Get Tab - var tab = Ext.getCmp('tab_'+serviceId); // Get Record var rec = Ext.getStore('Services').getById(serviceId); - // Clear all trash data - if ( rec.get('enabled') && tab.down('component').el ) { - tab.down('component').el.dom.getWebContents().session.clearCache(Ext.emptyFn); - tab.down('component').el.dom.getWebContents().session.clearStorageData({}, Ext.emptyFn); + if ( !rec.get('enabled') ) { + rec.set('enabled', true); + me.onEnableDisableService(null, Ext.getStore('Services').indexOf(rec), true, null, true); + Ext.defer(function() { + // Get Tab + var tab = Ext.getCmp('tab_'+serviceId); + // Clear all trash data + const webview = tab.getWebView(); + + webview.addEventListener("did-finish-load", function() { + clearData(webview, tab); + }); + }, 1000); + } else { + // Get Tab + var tab = Ext.getCmp('tab_'+serviceId); + // Clear all trash data + const webview = tab.getWebView(); + clearData(webview, tab); } - // Remove record from localStorage - Ext.getStore('Services').remove(rec); - - // Close tab - tab.close(); + function clearData(webview, tab) { + webview.getWebContents().clearHistory(); + webview.getWebContents().session.flushStorageData(); + webview.getWebContents().session.clearCache(function() { + webview.getWebContents().session.clearStorageData(function() { + webview.getWebContents().session.cookies.flushStore(function() { + // Remove record from localStorage + Ext.getStore('Services').remove(rec); + // Close tab + tab.close(); + // Close waiting message + if ( total === actual ) Ext.Msg.hide(); + }); + }); + }); + } } ,removeService: function( gridView, rowIndex, colIndex, col, e, rec, rowEl ) { var me = this; Ext.Msg.confirm(locale['app.window[12]'], locale['app.window[13]']+' '+rec.get('name')+'?', function(btnId) { - if ( btnId === 'yes' ) me.removeServiceFn(rec.get('id')); + if ( btnId === 'yes' ) { + Ext.Msg.wait('Please wait until we clear all.', 'Removing...'); + me.removeServiceFn(rec.get('id'), 1, 1); + } }); } @@ -140,8 +169,11 @@ Ext.define('Rambox.view.main.MainController', { if ( btnId === 'yes' ) { Ext.cq1('app-main').suspendEvent('remove'); Ext.getStore('Services').load(); + Ext.Msg.wait('Please wait until we clear all.', 'Removing...'); + const count = Ext.getStore('Services').getCount(); + var i = 1; Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) { - me.removeServiceFn(serviceId); + me.removeServiceFn(serviceId, count, i++); }); if ( Ext.isFunction(callback) ) callback(); Ext.cq1('app-main').resumeEvent('remove'); @@ -152,7 +184,7 @@ Ext.define('Rambox.view.main.MainController', { Ext.cq1('app-main').suspendEvent('remove'); Ext.getStore('Services').load(); Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) { - me.removeServiceFn(serviceId); + me.removeServiceFn(serviceId, 1, 2); }); if ( Ext.isFunction(callback) ) callback(); Ext.cq1('app-main').resumeEvent('remove'); From 0666771b92b053dcdd0a33407d2adda7bf87b5f5 Mon Sep 17 00:00:00 2001 From: Ramiro Saenz Date: Mon, 2 Oct 2017 17:35:05 -0300 Subject: [PATCH 11/12] Feature to set default service to display Fixes #957 Fixes #1132 --- app/store/Services.js | 26 +++++++++++++------------- app/view/main/MainController.js | 5 +++++ app/view/preferences/Preferences.js | 26 ++++++++++++++++++++++++++ electron/main.js | 1 + 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/app/store/Services.js b/app/store/Services.js index 134efc34..506f9a4b 100644 --- a/app/store/Services.js +++ b/app/store/Services.js @@ -26,19 +26,6 @@ Ext.define('Rambox.store.Services', { var servicesLeft = []; var servicesRight = []; store.each(function(service) { - // Fix some services with bad IDs - // TODO: Remove in next release - switch ( service.get('type') ) { - case 'office365': - service.set('type', 'outlook365'); - break; - case ' irccloud': - service.set('type', 'irccloud'); - break; - default: - break; - } - // If the service is disabled, we dont add it to tab bar if ( !service.get('enabled') ) return; @@ -65,6 +52,19 @@ Ext.define('Rambox.store.Services', { if ( !Ext.isEmpty(servicesLeft) ) Ext.cq1('app-main').insert(1, servicesLeft); if ( !Ext.isEmpty(servicesRight) ) Ext.cq1('app-main').add(servicesRight); + // Set default active service + const config = ipc.sendSync('getConfig'); + switch ( config.default_service ) { + case 'last': + Ext.cq1('app-main').setActiveTab(localStorage.getItem('last_active_service')); + break; + case 'ramboxTab': + break; + default: + if ( Ext.getCmp('tab_'+config.default_service) ) Ext.cq1('app-main').setActiveTab('tab_'+config.default_service); + break; + } + store.suspendEvent('load'); Ext.cq1('app-main').resumeEvent('add'); } diff --git a/app/view/main/MainController.js b/app/view/main/MainController.js index 8404ad03..24f65487 100644 --- a/app/view/main/MainController.js +++ b/app/view/main/MainController.js @@ -10,6 +10,8 @@ Ext.define('Rambox.view.main.MainController', { // Set Google Analytics event ga_storage._trackPageview('/index.html', 'main'); + localStorage.setItem('last_active_service', newTab.id); + if ( newTab.id === 'ramboxTab' ) { if ( Rambox.app.getTotalNotifications() > 0 ) { document.title = 'Rambox ('+ Rambox.app.getTotalNotifications() +')'; @@ -129,6 +131,9 @@ Ext.define('Rambox.view.main.MainController', { clearData(webview, tab); } + const config = ipc.sendSync('getConfig'); + if ( config.default_service === rec.get('id') ) ipc.send('setConfig', Ext.apply(config, { default_service: 'ramboxTab' })); + function clearData(webview, tab) { webview.getWebContents().clearHistory(); webview.getWebContents().session.flushStorageData(); diff --git a/app/view/preferences/Preferences.js b/app/view/preferences/Preferences.js index 4e9541c8..3eb40737 100644 --- a/app/view/preferences/Preferences.js +++ b/app/view/preferences/Preferences.js @@ -38,6 +38,16 @@ Ext.define('Rambox.view.preferences.Preferences',{ ,initComponent: function() { var config = ipc.sendSync('getConfig'); + var defaultServiceOptions = []; + defaultServiceOptions.push({ value: 'ramboxTab', label: 'Rambox Tab' }); + defaultServiceOptions.push({ value: 'last', label: 'Last Active Service' }); + Ext.getStore('Services').each(function(rec) { + defaultServiceOptions.push({ + value: rec.get('id') + ,label: rec.get('name') + }); + }); + this.items = [ { xtype: 'form' @@ -114,6 +124,22 @@ Ext.define('Rambox.view.preferences.Preferences',{ ,value: config.hide_menu_bar ,hidden: process.platform !== 'win32' } + ,{ + xtype: 'combo' + ,name: 'default_service' + ,fieldLabel: 'Default service to display when Rambox starts' + ,labelAlign: 'top' + //,width: 380 + //,labelWidth: 105 + ,value: config.default_service + ,displayField: 'label' + ,valueField: 'value' + ,editable: false + ,store: Ext.create('Ext.data.Store', { + fields: ['value', 'label'] + ,data: defaultServiceOptions + }) + } ,{ xtype: 'combo' ,name: 'window_display_behavior' diff --git a/electron/main.js b/electron/main.js index 270adf4d..5a12b003 100644 --- a/electron/main.js +++ b/electron/main.js @@ -34,6 +34,7 @@ const config = new Config({ ,proxyPort: '' ,locale: 'en' ,enable_hidpi_support: false + ,default_service: 'ramboxTab' ,x: undefined ,y: undefined From f16c6ec70478e694b72f8a19dcbd72776192735c Mon Sep 17 00:00:00 2001 From: Ramiro Saenz Date: Mon, 2 Oct 2017 17:39:10 -0300 Subject: [PATCH 12/12] Update Application.js --- app/Application.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/Application.js b/app/Application.js index 7a8d9668..5c8ba338 100644 --- a/app/Application.js +++ b/app/Application.js @@ -35,9 +35,7 @@ Ext.define('Rambox.Application', { Ext.Loader.loadScript({url: Ext.util.Format.format("ext/packages/ext-locale/build/ext-locale-{0}.js", localStorage.getItem('locale-auth0') || 'en')}); // Initialize Auth0 - if (auth0Cfg.clientID!=='', auth0Cfg.domain!==''){ - Rambox.ux.Auth0.init(); - } + if ( auth0Cfg.clientID !== '' && auth0Cfg.domain !== '' ) Rambox.ux.Auth0.init(); // Set cookies to help Tooltip.io messages segmentation Ext.util.Cookies.set('version', require('electron').remote.app.getVersion());