Ext.define("Rambox.Application", { extend: "Ext.app.Application", name: "Rambox", requires: [ "Rambox.ux.Auth0", "Rambox.util.MD5", "Ext.window.Toast", "Ext.util.Cookies", ], stores: ["ServicesList", "Services"], profiles: ["Offline", "Online"], config: { totalServicesLoaded: 0, totalNotifications: 0, googleURLs: [], }, launch: function () { const isOnline = require("is-online"); const Mousetrap = require("mousetrap"); (async () => { await isOnline().then((res) => { var hideNoConnection = ipc.sendSync("getConfig").hideNoConnectionDialog; if (!res && !hideNoConnection) { Ext.get("spinner") ? Ext.get("spinner").destroy() : null; Ext.get("background") ? Ext.get("background").destroy() : null; Ext.Msg.show({ title: "No Internet Connection", msg: "Please, check your internet connection. If you use a Proxy, please go to Preferences to configure it. Rambox will try to re-connect in 10 seconds", width: 300, closable: false, buttons: Ext.Msg.YESNO, buttonText: { yes: "Ok", no: "Never show this again", }, multiline: false, fn: function (buttonValue, inputText, showConfig) { if (buttonValue === "no") { ipc.send("sConfig", { hideNoConnectionDialog: true }); hideNoConnection = true; } }, icon: Ext.Msg.QUESTION, }); setTimeout(function () { if (!hideNoConnection) ipc.send("reloadApp"); }, 10000); } }); })(); if ( !localStorage.getItem("hideMacPermissions") && process.platform === "darwin" && (require("electron").remote.systemPreferences.getMediaAccessStatus( "microphone" ) !== "granted" || require("electron").remote.systemPreferences.getMediaAccessStatus( "camera" ) !== "granted") ) { console.info("Checking mac permissions..."); Ext.cq1("app-main").addDocked({ xtype: "toolbar", dock: "top", style: { background: "#30BBF3" }, items: [ "->", { xtype: "label", html: "Rambox CE needs permissions to use Microphone and Camera for the apps.", }, { xtype: "button", text: "Grant permissions", ui: "decline", handler: async function (btn) { await require("electron").remote.systemPreferences.askForMediaAccess( "microphone" ); await require("electron").remote.systemPreferences.askForMediaAccess( "camera" ); Ext.cq1("app-main").removeDocked(btn.up("toolbar"), true); }, }, { xtype: "button", text: "Never ask again", ui: "decline", handler: function (btn) { Ext.cq1("app-main").removeDocked(btn.up("toolbar"), true); localStorage.setItem("hideMacPermissions", true); }, }, "->", { glyph: "xf00d@FontAwesome", baseCls: "", style: "cursor:pointer;", handler: function (btn) { Ext.cq1("app-main").removeDocked(btn.up("toolbar"), true); }, }, ], }); } Ext.getStore("ServicesList").load(function (records, operations, success) { if (!success) { Ext.cq1("app-main").addDocked({ xtype: "toolbar", dock: "top", ui: "servicesnotloaded", style: { background: "#efef6d" }, items: [ "->", { xtype: "label", html: "Services couldn't be loaded, some Rambox features will not be available.", }, { xtype: "button", text: "Reload", handler: function () { ipc.send("reloadApp"); }, }, "->", { glyph: "xf00d@FontAwesome", baseCls: "", style: "cursor:pointer;", handler: function (btn) { Ext.cq1("app-main").removeDocked(btn.up("toolbar"), true); }, }, ], }); } // Prevent track if the user have disabled this option (default: false) if (!ipc.sendSync("sendStatistics")) { ga_storage = { _enableSSL: Ext.emptyFn, _disableSSL: Ext.emptyFn, _setAccount: Ext.emptyFn, _setDomain: Ext.emptyFn, _setLocale: Ext.emptyFn, _setCustomVar: Ext.emptyFn, _deleteCustomVar: Ext.emptyFn, _trackPageview: Ext.emptyFn, _trackEvent: Ext.emptyFn, }; } // Set Google Analytics events ga_storage._setAccount("UA-80680424-1"); ga_storage._trackPageview("/index.html", "main"); ga_storage._trackEvent( "Versions", require("electron").remote.app.getVersion() ); // Load language for Ext JS library 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(); // Set cookies to help Tooltip.io messages segmentation Ext.util.Cookies.set( "version", require("electron").remote.app.getVersion() ); if (Ext.util.Cookies.get("auth0") === null) Ext.util.Cookies.set("auth0", false); // Check for updates if ( require("electron").remote.process.argv.indexOf("--without-update") === -1 ) Rambox.app.checkUpdate(true); // Get Google URLs Ext.Ajax.request({ url: "https://raw.githubusercontent.com/ramboxapp/community-edition/gh-pages/api/google.json", method: "GET", success: function (response) { Rambox.app.config.googleURLs = Ext.decode(response.responseText); }, }); // Shortcuts const platform = require("electron").remote.process.platform; // Prevents default behaviour of Mousetrap, that prevents shortcuts in textareas Mousetrap.prototype.stopCallback = function (e, element, combo) { return false; }; // Add shortcuts to switch services using CTRL + Number Mousetrap.bind( platform === "darwin" ? [ "command+1", "command+2", "command+3", "command+4", "command+5", "command+6", "command+7", "command+8", "command+9", ] : [ "ctrl+1", "ctrl+2", "ctrl+3", "ctrl+4", "ctrl+5", "ctrl+6", "ctrl+7", "ctrl+8", "ctrl+9", ], function (e, combo) { // GROUPS var tabPanel = Ext.cq1("app-main"); var arg = parseInt(e.key); if (arg >= tabPanel.items.indexOf(Ext.getCmp("tbfill"))) arg++; tabPanel.setActiveTab(arg); } ); // Add shortcut to main tab (ctrl+,) Mousetrap.bind( platform === "darwin" ? "command+," : "ctrl+,", (e, combo) => { Ext.cq1("app-main").setActiveTab(0); } ); // Add shortcuts to navigate through services Mousetrap.bind(["ctrl+tab", "ctrl+pagedown"], (e, combo) => { var tabPanel = Ext.cq1("app-main"); var activeIndex = tabPanel.items.indexOf(tabPanel.getActiveTab()); var i = activeIndex + 1; // "cycle" (go to the start) when the end is reached or the end is the spacer "tbfill" if ( i === tabPanel.items.items.length || (i === tabPanel.items.items.length - 1 && tabPanel.items.items[i].id === "tbfill") ) i = 0; // skip spacer while (tabPanel.items.items[i].id === "tbfill") i++; tabPanel.setActiveTab(i); }); Mousetrap.bind(["ctrl+shift+tab", "ctrl+pageup"], (e, combo) => { var tabPanel = Ext.cq1("app-main"); var activeIndex = tabPanel.items.indexOf(tabPanel.getActiveTab()); var i = activeIndex - 1; if (i < 0) i = tabPanel.items.items.length - 1; while (tabPanel.items.items[i].id === "tbfill" || i < 0) i--; tabPanel.setActiveTab(i); }); // Add shortcut to search inside a service Mousetrap.bind( process.platform === "darwin" ? ["command+alt+f"] : ["shift+alt+f"], (e, combo) => { var currentTab = Ext.cq1("app-main").getActiveTab(); if (currentTab.getWebView) currentTab.showSearchBox(true); } ); // Add shortcut to Do Not Disturb Mousetrap.bind( platform === "darwin" ? ["command+alt+d"] : ["shift+alt+d"], function (e, combo) { var btn = Ext.getCmp("disturbBtn"); btn.toggle(); Ext.cq1("app-main").getController().dontDisturb(btn, true); } ); // Add shortcut to Lock Rambox Mousetrap.bind( platform === "darwin" ? ["command+alt+l"] : ["shift+alt+l"], (e, combo) => { var btn = Ext.getCmp("lockRamboxBtn"); Ext.cq1("app-main").getController().lockRambox(btn); } ); // Mouse Wheel zooming document.addEventListener("mousewheel", function (e) { if (e.ctrlKey) { var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail)); var tabPanel = Ext.cq1("app-main"); if (tabPanel.items.indexOf(tabPanel.getActiveTab()) === 0) return false; if (delta === 1) { // Zoom In tabPanel.getActiveTab().zoomIn(); } else { // Zoom Out tabPanel.getActiveTab().zoomOut(); } } }); // Define default value if (localStorage.getItem("dontDisturb") === null) localStorage.setItem("dontDisturb", false); ipc.send("setDontDisturb", localStorage.getItem("dontDisturb")); // We store it in config if (localStorage.getItem("locked")) { console.info("Lock Rambox:", "Enabled"); Ext.cq1("app-main").getController().showLockWindow(); } Ext.getStore("Services").load(); }); }, updateTotalNotifications: function (newValue, oldValue) { newValue = parseInt(newValue); if (newValue > 0) { if (Ext.cq1("app-main").getActiveTab().record) { document.title = "Rambox (" + Rambox.util.Format.formatNumber(newValue) + ") - " + Ext.cq1("app-main").getActiveTab().record.get("name"); } else { document.title = "Rambox (" + Rambox.util.Format.formatNumber(newValue) + ")"; } } else { if (Ext.cq1("app-main") && Ext.cq1("app-main").getActiveTab().record) { document.title = "Rambox - " + Ext.cq1("app-main").getActiveTab().record.get("name"); } else { document.title = "Rambox"; } } }, checkUpdate: function (silence) { console.info("Checking for updates..."); Ext.Ajax.request({ url: "https://api.github.com/repos/ramboxapp/community-edition/releases/latest", method: "GET", success: function (response) { var json = Ext.decode(response.responseText); var appVersion = new Ext.Version( require("electron").remote.app.getVersion() ); if ( appVersion.isLessThan(json.name) && !json.draft && !json.prerelease ) { console.info("New version is available", json.version); Ext.cq1("app-main").addDocked({ xtype: "toolbar", dock: "top", ui: "newversion", items: [ "->", { xtype: "label", html: "" + locale["app.update[0]"] + " (" + json.version + ")" + (process.platform === "win32" ? " is downloading in the background and you will be notified when it is ready to be installed." : ""), }, { xtype: "button", text: locale["app.update[1]"], href: process.platform === "darwin" ? "https://getrambox.herokuapp.com/download/" + process.platform + "_" + process.arch : "https://github.com/ramboxapp/community-edition/releases/latest", hidden: process.platform === "win32", }, { xtype: "button", text: locale["app.update[2]"], ui: "decline", tooltip: "Click here to see more information about the new version.", href: "https://github.com/ramboxapp/community-edition/releases/tag/" + json.version, }, "->", { glyph: "xf00d@FontAwesome", baseCls: "", style: "cursor:pointer;", handler: function (btn) { Ext.cq1("app-main").removeDocked(btn.up("toolbar"), true); }, }, ], }); ipc.send("autoUpdater:check-for-updates"); return; } else if (!silence) { Ext.Msg.show({ title: locale["app.update[3]"], message: locale["app.update[4]"], icon: Ext.Msg.INFO, buttons: Ext.Msg.OK, }); } console.info("Your version is the latest. No need to update."); }, }); }, });