Browse Source

Format abea666

pull/3163/head
prettifier[bot] 4 years ago committed by GitHub
parent
commit
92a4ee0745
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 572
      app/Application.js
  2. 69
      app/store/ServicesList.js
  3. 354
      app/ux/Auth0.js
  4. 985
      app/ux/WebView.js
  5. 671
      app/view/main/MainController.js
  6. 746
      app/view/preferences/Preferences.js
  7. 62
      electron/main.js
  8. 14
      resources/js/darkreader.js
  9. 9
      resources/js/rambox-service-api.js
  10. 253
      resources/languages/en.js

572
app/Application.js

@ -1,334 +1,444 @@
Ext.define('Rambox.Application', {
extend: 'Ext.app.Application'
Ext.define("Rambox.Application", {
extend: "Ext.app.Application",
,name: 'Rambox'
name: "Rambox",
,requires: [
'Rambox.ux.Auth0'
,'Rambox.util.MD5'
,'Ext.window.Toast'
,'Ext.util.Cookies'
]
,stores: [
'ServicesList'
,'Services'
]
requires: [
"Rambox.ux.Auth0",
"Rambox.util.MD5",
"Ext.window.Toast",
"Ext.util.Cookies",
],
,profiles: [
'Offline'
,'Online'
]
stores: ["ServicesList", "Services"],
,config: {
totalServicesLoaded: 0
,totalNotifications: 0
,googleURLs: []
}
profiles: ["Offline", "Online"],
,launch: function () {
config: {
totalServicesLoaded: 0,
totalNotifications: 0,
googleURLs: [],
},
const isOnline = require('is-online');
const Mousetrap = require('mousetrap');
launch: function () {
const isOnline = require("is-online");
const Mousetrap = require("mousetrap");
(async () => {
await isOnline().then(res => {
var hideNoConnection = ipc.sendSync('getConfig').hideNoConnectionDialog
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.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 });
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
},
icon: Ext.Msg.QUESTION,
});
setTimeout(function () {
if ( !hideNoConnection ) ipc.send('reloadApp')
}, 10000)
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: '<b>Rambox CE needs permissions to use Microphone and Camera for the apps.</b>'
}
,{
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); }
}
]
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:
"<b>Rambox CE needs permissions to use Microphone and Camera for the apps.</b>",
},
{
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) {
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: '<b>Services couldn\'t be loaded, some Rambox features will not be available.</b>'
}
,{
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); }
}
]
Ext.cq1("app-main").addDocked({
xtype: "toolbar",
dock: "top",
ui: "servicesnotloaded",
style: { background: "#efef6d" },
items: [
"->",
{
xtype: "label",
html:
"<b>Services couldn't be loaded, some Rambox features will not be available.</b>",
},
{
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') ) {
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
}
_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());
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')});
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());
if ( Ext.util.Cookies.get('auth0') === null ) Ext.util.Cookies.set('auth0', false);
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);
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) {
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;
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');
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++;
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);
});
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');
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;
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++;
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');
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--;
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();
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');
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);
});
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);
});
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) {
document.addEventListener("mousewheel", function (e) {
if (e.ctrlKey) {
var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
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;
var tabPanel = Ext.cq1("app-main");
if (tabPanel.items.indexOf(tabPanel.getActiveTab()) === 0)
return false;
if ( delta === 1 ) { // Zoom In
if (delta === 1) {
// Zoom In
tabPanel.getActiveTab().zoomIn();
} else { // Zoom Out
} 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("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();
if (localStorage.getItem("locked")) {
console.info("Lock Rambox:", "Enabled");
Ext.cq1("app-main").getController().showLockWindow();
}
Ext.getStore('Services').load();
Ext.getStore("Services").load();
});
}
},
,updateTotalNotifications: function( newValue, oldValue ) {
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');
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) + ')';
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');
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';
}
document.title = "Rambox";
}
}
},
,checkUpdate: function(silence) {
console.info('Checking for updates...');
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) {
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: '<b>'+locale['app.update[0]']+'</b> ('+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); }
}
]
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:
"<b>" +
locale["app.update[0]"] +
"</b> (" +
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');
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
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.');
}
console.info("Your version is the latest. No need to update.");
},
});
}
},
});

69
app/store/ServicesList.js

@ -1,42 +1,43 @@
Ext.define('Rambox.store.ServicesList', {
extend: 'Ext.data.Store'
,alias: 'store.serviceslist'
Ext.define("Rambox.store.ServicesList", {
extend: "Ext.data.Store",
alias: "store.serviceslist",
,requires: [
'Ext.data.proxy.LocalStorage'
]
requires: ["Ext.data.proxy.LocalStorage"],
,model: 'Rambox.model.ServiceList'
model: "Rambox.model.ServiceList",
,proxy: {
type: 'ajax',
url: 'https://raw.githubusercontent.com/ramboxapp/community-edition/gh-pages/api/services.json',
proxy: {
type: "ajax",
url:
"https://raw.githubusercontent.com/ramboxapp/community-edition/gh-pages/api/services.json",
reader: {
type: 'json',
rootProperty: 'responseText'
}
}
,listeners: {
type: "json",
rootProperty: "responseText",
},
},
listeners: {
load: function () {
Ext.get('spinner') ? Ext.get('spinner').destroy() : null;
Ext.get('background') ? Ext.get('background').destroy() : null;
Ext.get("spinner") ? Ext.get("spinner").destroy() : null;
Ext.get("background") ? Ext.get("background").destroy() : null;
this.add({
id: 'custom'
,logo: 'custom.png'
,name: '_Custom Service'
,description: locale['services[38]']
,url: '___'
,type: 'custom'
,allow_popups: true
})
}
}
,sorters: [{
property: 'name'
,direction: 'ASC'
}]
id: "custom",
logo: "custom.png",
name: "_Custom Service",
description: locale["services[38]"],
url: "___",
type: "custom",
allow_popups: true,
});
},
},
sorters: [
{
property: "name",
direction: "ASC",
},
],
,autoLoad: true
,autoSync: true
,pageSize: 100000
autoLoad: true,
autoSync: true,
pageSize: 100000,
});

354
app/ux/Auth0.js

@ -1,94 +1,103 @@
Ext.define('Rambox.ux.Auth0', {
singleton: true
Ext.define("Rambox.ux.Auth0", {
singleton: true,
// private
,lock: null
,auth0: null
,authService: null
,backupCurrent: false
lock: null,
auth0: null,
authService: null,
backupCurrent: false,
,init: function() {
init: function () {
var me = this;
var Auth0 = require('auth0-js');
var _AuthService = require('./resources/js/AuthService');
var Auth0 = require("auth0-js");
var _AuthService = require("./resources/js/AuthService");
me.authService = new _AuthService.default({
clientId: auth0Cfg.clientID,
authorizeEndpoint: 'https://'+auth0Cfg.domain+'/authorize',
audience: 'https://'+auth0Cfg.domain+'/userinfo',
scope: 'openid profile offline_access',
redirectUri: 'https://'+auth0Cfg.domain+'/mobile',
tokenEndpoint: 'https://'+auth0Cfg.domain+'/oauth/token'
authorizeEndpoint: "https://" + auth0Cfg.domain + "/authorize",
audience: "https://" + auth0Cfg.domain + "/userinfo",
scope: "openid profile offline_access",
redirectUri: "https://" + auth0Cfg.domain + "/mobile",
tokenEndpoint: "https://" + auth0Cfg.domain + "/oauth/token",
});
me.auth0 = new Auth0.WebAuth({ clientID: auth0Cfg.clientID, domain : auth0Cfg.domain });
me.auth0 = new Auth0.WebAuth({
clientID: auth0Cfg.clientID,
domain: auth0Cfg.domain,
});
//me.defineEvents();
}
},
,onLogin: function(token, authWindow) {
onLogin: function (token, authWindow) {
var me = this;
authWindow.close();
me.auth0.client.userInfo(token.access_token, function (err, profile) {
if (err) {
if ( err.error === 401 || err.error === 'Unauthorized' ) return me.renewToken(me.checkConfiguration);
if (err.error === 401 || err.error === "Unauthorized")
return me.renewToken(me.checkConfiguration);
Ext.Msg.hide();
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.error_description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
title: "Error",
message:
"There was an error getting the profile: " + err.error_description,
icon: Ext.Msg.ERROR,
buttons: Ext.Msg.OK,
});
}
profile.user_metadata = profile['https://rambox.pro/user_metadata'];
delete profile['https://rambox.pro/user_metadata'];
profile.user_metadata = profile["https://rambox.pro/user_metadata"];
delete profile["https://rambox.pro/user_metadata"];
// Display a spinner while waiting
Ext.Msg.wait(locale['app.window[29]'], locale['app.window[28]']);
Ext.Msg.wait(locale["app.window[29]"], locale["app.window[28]"]);
// Google Analytics Event
ga_storage._trackEvent('Users', 'loggedIn');
ga_storage._trackEvent("Users", "loggedIn");
// Set cookies to help Tooltip.io messages segmentation
Ext.util.Cookies.set('auth0', true);
Ext.util.Cookies.set("auth0", true);
// User is logged in
// Save the profile and JWT.
localStorage.setItem('profile', JSON.stringify(profile));
localStorage.setItem('access_token', token.access_token);
localStorage.setItem('id_token', token.id_token);
localStorage.setItem('refresh_token', token.refresh_token);
if ( !Ext.isEmpty(profile.user_metadata) && !Ext.isEmpty(profile.user_metadata.services) && !me.backupCurrent ) {
localStorage.setItem("profile", JSON.stringify(profile));
localStorage.setItem("access_token", token.access_token);
localStorage.setItem("id_token", token.id_token);
localStorage.setItem("refresh_token", token.refresh_token);
if (
!Ext.isEmpty(profile.user_metadata) &&
!Ext.isEmpty(profile.user_metadata.services) &&
!me.backupCurrent
) {
Ext.each(profile.user_metadata.services, function (s) {
var service = Ext.create('Rambox.model.Service', s);
var service = Ext.create("Rambox.model.Service", s);
service.save();
Ext.getStore('Services').add(service);
Ext.getStore("Services").add(service);
});
require('electron').remote.app.relaunch();
require('electron').remote.app.exit();
require("electron").remote.app.relaunch();
require("electron").remote.app.exit();
}
Ext.Msg.hide();
Ext.cq1('app-main').getViewModel().set('username', profile.name);
Ext.cq1('app-main').getViewModel().set('avatar', profile.picture);
Ext.cq1("app-main").getViewModel().set("username", profile.name);
Ext.cq1("app-main").getViewModel().set("avatar", profile.picture);
});
}
},
,backupConfiguration: function(callback) {
backupConfiguration: function (callback) {
var me = this;
Ext.Msg.wait('Saving backup...', 'Please wait...');
Ext.Msg.wait("Saving backup...", "Please wait...");
// Getting all services
var lastupdate = (new Date()).toJSON();
var lastupdate = new Date().toJSON();
var services = [];
Ext.getStore('Services').each(function(service) {
Ext.getStore("Services").each(function (service) {
var s = Ext.clone(service);
delete s.data.id;
delete s.data.zoomLevel;
@ -96,203 +105,240 @@ Ext.define('Rambox.ux.Auth0', {
});
Ext.Ajax.request({
url: 'https://rambox.auth0.com/api/v2/users/'+Ext.decode(localStorage.getItem('profile')).sub
,method: 'PATCH'
,headers: { authorization: "Bearer " + localStorage.getItem('id_token') }
,jsonData: { user_metadata: { services: services, services_lastupdate: lastupdate } }
,success: function(response) {
url:
"https://rambox.auth0.com/api/v2/users/" +
Ext.decode(localStorage.getItem("profile")).sub,
method: "PATCH",
headers: { authorization: "Bearer " + localStorage.getItem("id_token") },
jsonData: {
user_metadata: { services: services, services_lastupdate: lastupdate },
},
success: function (response) {
Ext.Msg.hide();
// Save the last update in localStorage
var profile = Ext.decode(localStorage.getItem('profile'));
var profile = Ext.decode(localStorage.getItem("profile"));
if (!profile.user_metadata) profile.user_metadata = {};
profile.user_metadata.services_lastupdate = lastupdate;
localStorage.setItem('profile', Ext.encode(profile));
Ext.cq1('app-main').getViewModel().set('last_sync', new Date(lastupdate).toUTCString());
localStorage.setItem("profile", Ext.encode(profile));
Ext.cq1("app-main")
.getViewModel()
.set("last_sync", new Date(lastupdate).toUTCString());
Ext.toast({
html: '<i class="fa fa-check fa-3x fa-pull-left" aria-hidden="true"></i> Your configuration were successfully backed up.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
html:
'<i class="fa fa-check fa-3x fa-pull-left" aria-hidden="true"></i> Your configuration were successfully backed up.',
title: "Synchronize Configuration",
width: 300,
align: "t",
closable: false,
});
if (Ext.isFunction(callback)) callback.bind(me)();
}
,failure: function(response) {
if ( response.status === 401 ) return me.renewToken(me.backupConfiguration);
},
failure: function (response) {
if (response.status === 401)
return me.renewToken(me.backupConfiguration);
Ext.Msg.hide();
Ext.toast({
html: '<i class="fa fa-times fa-3x fa-pull-left" aria-hidden="true"></i> Error occurred when trying to backup your configuration.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
html:
'<i class="fa fa-times fa-3x fa-pull-left" aria-hidden="true"></i> Error occurred when trying to backup your configuration.',
title: "Synchronize Configuration",
width: 300,
align: "t",
closable: false,
});
if (Ext.isFunction(callback)) callback.bind(me)();
console.error(response);
}
},
});
}
},
,restoreConfiguration: function() {
restoreConfiguration: function () {
var me = this;
me.auth0.client.userInfo(localStorage.getItem('access_token'), function(err, profile) {
me.auth0.client.userInfo(
localStorage.getItem("access_token"),
function (err, profile) {
if (err) {
if (err.code === 401) return me.renewToken(me.restoreConfiguration);
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
title: "Error",
message:
"There was an error getting the profile: " + err.description,
icon: Ext.Msg.ERROR,
buttons: Ext.Msg.OK,
});
}
profile.user_metadata = profile['https://rambox.pro/user_metadata'];
delete profile['https://rambox.pro/user_metadata'];
profile.user_metadata = profile["https://rambox.pro/user_metadata"];
delete profile["https://rambox.pro/user_metadata"];
// First we remove all current services
Ext.cq1('app-main').getController().removeAllServices(false, function() {
if ( !profile.user_metadata || !profile.user_metadata.services ) return;
Ext.cq1("app-main")
.getController()
.removeAllServices(false, function () {
if (!profile.user_metadata || !profile.user_metadata.services)
return;
Ext.each(profile.user_metadata.services, function (s) {
var service = Ext.create('Rambox.model.Service', s);
var service = Ext.create("Rambox.model.Service", s);
service.save();
Ext.getStore('Services').add(service);
Ext.getStore("Services").add(service);
});
require('electron').remote.getCurrentWindow().reload();
});
require("electron").remote.getCurrentWindow().reload();
});
}
);
},
,checkConfiguration: function() {
checkConfiguration: function () {
var me = this;
me.auth0.client.userInfo(localStorage.getItem('access_token'), function(err, profile) {
me.auth0.client.userInfo(
localStorage.getItem("access_token"),
function (err, profile) {
if (err) {
if (err.code === 401) return me.renewToken(me.checkConfiguration);
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
title: "Error",
message:
"There was an error getting the profile: " + err.description,
icon: Ext.Msg.ERROR,
buttons: Ext.Msg.OK,
});
}
profile.user_metadata = profile['https://rambox.pro/user_metadata'];
delete profile['https://rambox.pro/user_metadata'];
profile.user_metadata = profile["https://rambox.pro/user_metadata"];
delete profile["https://rambox.pro/user_metadata"];
if (!profile.user_metadata) {
Ext.toast({
html: 'You don\'t have any backup yet.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
html: "You don't have any backup yet.",
title: "Synchronize Configuration",
width: 300,
align: "t",
closable: false,
});
return;
}
if ( Math.floor(new Date(profile.user_metadata.services_lastupdate) / 1000) > Math.floor(new Date(Ext.decode(localStorage.getItem('profile')).user_metadata.services_lastupdate) / 1000) ) {
if (
Math.floor(
new Date(profile.user_metadata.services_lastupdate) / 1000
) >
Math.floor(
new Date(
Ext.decode(
localStorage.getItem("profile")
).user_metadata.services_lastupdate
) / 1000
)
) {
Ext.toast({
html: 'Your settings are out of date.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
html: "Your settings are out of date.",
title: "Synchronize Configuration",
width: 300,
align: "t",
closable: false,
});
} else {
Ext.toast({
html: '<i class="fa fa-check fa-3x fa-pull-left" aria-hidden="true"></i> Latest backup is already applied.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
html:
'<i class="fa fa-check fa-3x fa-pull-left" aria-hidden="true"></i> Latest backup is already applied.',
title: "Synchronize Configuration",
width: 300,
align: "t",
closable: false,
});
}
});
}
);
},
,renewToken: function(callback) {
renewToken: function (callback) {
var me = this;
Ext.Ajax.request({
url: 'https://rambox.auth0.com/oauth/token'
,method: 'POST'
,jsonData: {
grant_type: 'refresh_token'
,client_id: auth0Cfg.clientID
,client_secret: auth0Cfg.clientSecret
,refresh_token: localStorage.getItem('refresh_token')
,api_type: 'app'
}
,success: function(response) {
url: "https://rambox.auth0.com/oauth/token",
method: "POST",
jsonData: {
grant_type: "refresh_token",
client_id: auth0Cfg.clientID,
client_secret: auth0Cfg.clientSecret,
refresh_token: localStorage.getItem("refresh_token"),
api_type: "app",
},
success: function (response) {
var json = Ext.decode(response.responseText);
localStorage.setItem('access_token', json.access_token);
localStorage.setItem('id_token', json.id_token);
localStorage.setItem("access_token", json.access_token);
localStorage.setItem("id_token", json.id_token);
if (Ext.isFunction(callback)) callback.bind(me)();
}
,failure: function(response) {
},
failure: function (response) {
console.error(response);
}
},
});
}
},
,login: function() {
login: function () {
var me = this;
var electron = require('electron').remote;
var electron = require("electron").remote;
var authWindow = new electron.BrowserWindow({
title: 'Rambox - Login'
,width: 400
,height: 600
,maximizable: false
,minimizable: false
,resizable: true
,closable: true
,center: true
,autoHideMenuBar: true
,skipTaskbar: true
,fullscreenable: false
,parent: require('electron').remote.getCurrentWindow()
,webPreferences: {
partition: 'persist:rambox'
}
title: "Rambox - Login",
width: 400,
height: 600,
maximizable: false,
minimizable: false,
resizable: true,
closable: true,
center: true,
autoHideMenuBar: true,
skipTaskbar: true,
fullscreenable: false,
parent: require("electron").remote.getCurrentWindow(),
webPreferences: {
partition: "persist:rambox",
},
});
authWindow.on('closed', function() {
authWindow.on("closed", function () {
authWindow = null;
});
authWindow.loadURL(me.authService.requestAuthCode());
authWindow.webContents.on('did-start-loading', function(e) {
authWindow.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => {
authWindow.webContents.on("did-start-loading", function (e) {
authWindow.webContents.session.webRequest.onBeforeSendHeaders(
(details, callback) => {
Rambox.app.config.googleURLs.forEach((loginURL) => {
if ( details.url.indexOf(loginURL) > -1 ) details.requestHeaders['User-Agent'] = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0' })
callback({ cancel: false, requestHeaders: details.requestHeaders });
if (details.url.indexOf(loginURL) > -1)
details.requestHeaders["User-Agent"] =
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0";
});
callback({ cancel: false, requestHeaders: details.requestHeaders });
}
);
});
authWindow.webContents.on('did-navigate', function(e, url) {
authWindow.webContents.on("did-navigate", function (e, url) {
me.authService.requestAccessCode(url, me.onLogin.bind(me), authWindow);
});
}
},
,logout: function() {
logout: function () {
var me = this;
localStorage.removeItem('profile');
localStorage.removeItem('id_token');
localStorage.removeItem('refresh_token');
localStorage.removeItem('access_token');
localStorage.removeItem("profile");
localStorage.removeItem("id_token");
localStorage.removeItem("refresh_token");
localStorage.removeItem("access_token");
// Set cookies to help Tooltip.io messages segmentation
Ext.util.Cookies.set('auth0', false);
}
Ext.util.Cookies.set("auth0", false);
},
});

985
app/ux/WebView.js

File diff suppressed because it is too large Load Diff

671
app/view/main/MainController.js

@ -1,12 +1,12 @@
const darkreader = require('darkreader');
const darkreader = require("darkreader");
Ext.define('Rambox.view.main.MainController', {
extend: 'Ext.app.ViewController'
Ext.define("Rambox.view.main.MainController", {
extend: "Ext.app.ViewController",
,alias: 'controller.main'
alias: "controller.main",
,initialize: function( tabPanel ) {
const config = ipc.sendSync('getConfig');
initialize: function (tabPanel) {
const config = ipc.sendSync("getConfig");
if (config.darkreader) {
darkreader.enable();
@ -16,7 +16,9 @@ Ext.define('Rambox.view.main.MainController', {
tabPanel.setTabPosition(config.tabbar_location);
tabPanel.setTabRotation(0);
var reorderer = tabPanel.plugins.find(function(plugin) { return plugin.ptype == "tabreorderer"});
var reorderer = tabPanel.plugins.find(function (plugin) {
return plugin.ptype == "tabreorderer";
});
if (reorderer !== undefined) {
const names = reorderer.container.getLayout().names;
@ -24,31 +26,31 @@ Ext.define('Rambox.view.main.MainController', {
reorderer.dd.startAttr = names.beforeX;
reorderer.dd.endAttr = names.afterX;
}
}
},
// Make focus on webview every time the user change tabs, to enable the autofocus in websites
,onTabChange: function( tabPanel, newTab, oldTab ) {
onTabChange: function (tabPanel, newTab, oldTab) {
var me = this;
// Set Google Analytics event
ga_storage._trackPageview('/index.html', 'main');
ga_storage._trackPageview("/index.html", "main");
localStorage.setItem('last_active_service', newTab.id);
localStorage.setItem("last_active_service", newTab.id);
if ( newTab.id === 'ramboxTab' ) {
if (newTab.id === "ramboxTab") {
if (Rambox.app.getTotalNotifications() > 0) {
document.title = 'Rambox ('+ Rambox.app.getTotalNotifications() +')';
document.title = "Rambox (" + Rambox.app.getTotalNotifications() + ")";
} else {
document.title = 'Rambox';
document.title = "Rambox";
}
return;
}
if (!newTab.record.get('enabled') ) {
if (!newTab.record.get("enabled")) {
return;
}
var webview = newTab.down('component').el.dom;
var webview = newTab.down("component").el.dom;
setTimeout(function () {
if (webview) {
@ -59,99 +61,122 @@ Ext.define('Rambox.view.main.MainController', {
// Update the main window so it includes the active tab title.
if (Rambox.app.getTotalNotifications() > 0) {
document.title = 'Rambox ('+ Rambox.app.getTotalNotifications() +') - ' + newTab.record.get('name');
document.title =
"Rambox (" +
Rambox.app.getTotalNotifications() +
") - " +
newTab.record.get("name");
} else {
document.title = 'Rambox - ' + newTab.record.get('name');
}
document.title = "Rambox - " + newTab.record.get("name");
}
},
,updatePositions: function(tabPanel, tab) {
if ( tab.id === 'ramboxTab' || tab.id === 'tbfill' ) return true;
updatePositions: function (tabPanel, tab) {
if (tab.id === "ramboxTab" || tab.id === "tbfill") return true;
console.log('Updating Tabs positions...');
console.log("Updating Tabs positions...");
var store = Ext.getStore('Services');
var align = 'left';
store.suspendEvent('remove');
var store = Ext.getStore("Services");
var align = "left";
store.suspendEvent("remove");
Ext.each(tabPanel.items.items, function (t, i) {
if ( t.id !== 'ramboxTab' && t.id !== 'tbfill' && t.record.get('enabled') ) {
var rec = store.getById(t.record.get('id'));
if ( align === 'right' ) i--;
rec.set('align', align);
rec.set('position', i);
if (
t.id !== "ramboxTab" &&
t.id !== "tbfill" &&
t.record.get("enabled")
) {
var rec = store.getById(t.record.get("id"));
if (align === "right") i--;
rec.set("align", align);
rec.set("position", i);
rec.save();
} else if (t.id === "tbfill") {
align = "right";
}
else if ( t.id === 'tbfill' ) {
align = 'right';
}
});
store.load();
store.resumeEvent('remove');
}
store.resumeEvent("remove");
},
,showServiceTab: function( grid, record, tr, rowIndex, e ) {
if ( e.position.colIdx === 0 ) { // Service Logo
Ext.getCmp('tab_'+record.get('id')).show();
}
showServiceTab: function (grid, record, tr, rowIndex, e) {
if (e.position.colIdx === 0) {
// Service Logo
Ext.getCmp("tab_" + record.get("id")).show();
}
},
,onRenameService: function(editor, e) {
onRenameService: function (editor, e) {
var me = this;
e.record.commit();
// Change the title of the Tab
Ext.getCmp('tab_'+e.record.get('id')).setTitle(e.record.get('name'));
}
Ext.getCmp("tab_" + e.record.get("id")).setTitle(e.record.get("name"));
},
,onEnableDisableService: function(cc, rowIndex, checked, obj, hideTab) {
var rec = Ext.getStore('Services').getAt(rowIndex);
onEnableDisableService: function (cc, rowIndex, checked, obj, hideTab) {
var rec = Ext.getStore("Services").getAt(rowIndex);
if (!checked) {
Ext.getCmp('tab_'+rec.get('id')).destroy();
Ext.getCmp("tab_" + rec.get("id")).destroy();
} else {
Ext.cq1('app-main').insert(rec.get('align') === 'left' ? rec.get('position') : rec.get('position')+1, {
xtype: 'webview'
,id: 'tab_'+rec.get('id')
,title: rec.get('name')
,icon: rec.get('type') !== 'custom' ? 'resources/icons/'+rec.get('logo') : ( rec.get('logo') === '' ? 'resources/icons/custom.png' : rec.get('logo'))
,src: rec.get('url')
,type: rec.get('type')
,muted: rec.get('muted')
,includeInGlobalUnreadCounter: rec.get('includeInGlobalUnreadCounter')
,displayTabUnreadCounter: rec.get('displayTabUnreadCounter')
,enabled: rec.get('enabled')
,record: rec
,useragent: ipc.sendSync('getConfig').user_agent
,hidden: hideTab
,tabConfig: {
service: rec
}
});
Ext.cq1("app-main").insert(
rec.get("align") === "left"
? rec.get("position")
: rec.get("position") + 1,
{
xtype: "webview",
id: "tab_" + rec.get("id"),
title: rec.get("name"),
icon:
rec.get("type") !== "custom"
? "resources/icons/" + rec.get("logo")
: rec.get("logo") === ""
? "resources/icons/custom.png"
: rec.get("logo"),
src: rec.get("url"),
type: rec.get("type"),
muted: rec.get("muted"),
includeInGlobalUnreadCounter: rec.get("includeInGlobalUnreadCounter"),
displayTabUnreadCounter: rec.get("displayTabUnreadCounter"),
enabled: rec.get("enabled"),
record: rec,
useragent: ipc.sendSync("getConfig").user_agent,
hidden: hideTab,
tabConfig: {
service: rec,
},
}
);
}
},
,onNewServiceSelect: function( view, record, item, index, e ) {
Ext.create('Rambox.view.add.Add', {
record: record
onNewServiceSelect: function (view, record, item, index, e) {
Ext.create("Rambox.view.add.Add", {
record: record,
});
}
},
,removeServiceFn: function(serviceId, total, actual, callback) {
removeServiceFn: function (serviceId, total, actual, callback) {
var me = this;
if (!serviceId) return false;
// Get Record
var rec = Ext.getStore('Services').getById(serviceId);
if ( !rec.get('enabled') ) {
rec.set('enabled', true);
me.onEnableDisableService(null, Ext.getStore('Services').indexOf(rec), true, null, true);
var rec = Ext.getStore("Services").getById(serviceId);
if (!rec.get("enabled")) {
rec.set("enabled", true);
me.onEnableDisableService(
null,
Ext.getStore("Services").indexOf(rec),
true,
null,
true
);
// Get Tab
var tab = Ext.getCmp('tab_'+serviceId);
var tab = Ext.getCmp("tab_" + serviceId);
// Clear all trash data
const webview = tab.getWebView();
webview.addEventListener("did-start-loading", function () {
@ -159,14 +184,18 @@ Ext.define('Rambox.view.main.MainController', {
});
} else {
// Get Tab
var tab = Ext.getCmp('tab_'+serviceId);
var tab = Ext.getCmp("tab_" + serviceId);
// Clear all trash data
const webview = tab.getWebView();
clearData(webview, tab);
}
const config = ipc.sendSync('getConfig');
if ( config.default_service === rec.get('id') ) ipc.send('setConfig', Ext.apply(config, { default_service: 'ramboxTab' }));
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) {
const currentWebView = require("electron").remote.webContents.fromId(
@ -175,11 +204,17 @@ Ext.define('Rambox.view.main.MainController', {
currentWebView.clearHistory();
currentWebView.session.flushStorageData();
currentWebView.session.clearCache().then(() => {
currentWebView.session.clearStorageData().then(() => {
currentWebView.session.cookies.flushStore().then(() => {
currentWebView.session
.clearCache()
.then(() => {
currentWebView.session
.clearStorageData()
.then(() => {
currentWebView.session.cookies
.flushStore()
.then(() => {
// Remove record from localStorage
Ext.getStore('Services').remove(rec);
Ext.getStore("Services").remove(rec);
// Close tab
tab.close();
// Close waiting message
@ -187,338 +222,428 @@ Ext.define('Rambox.view.main.MainController', {
Ext.Msg.hide();
if (Ext.isFunction(callback)) callback();
}
}).catch(err => { console.log(err) })
}).catch(err => { console.log(err) })
}).catch(err => { console.log(err) })
}
})
.catch((err) => {
console.log(err);
});
})
.catch((err) => {
console.log(err);
});
})
.catch((err) => {
console.log(err);
});
}
},
,removeService: function( gridView, rowIndex, colIndex, col, e, rec, rowEl ) {
removeService: function (gridView, rowIndex, colIndex, col, e, rec, rowEl) {
var me = this;
Ext.Msg.confirm(locale['app.window[12]'], locale['app.window[13]']+' <b>'+rec.get('name')+'</b>?', function(btnId) {
if ( btnId === 'yes' ) {
Ext.Msg.wait('Please wait until we clear all.', 'Removing...');
me.removeServiceFn(rec.get('id'), 1, 1);
Ext.Msg.confirm(
locale["app.window[12]"],
locale["app.window[13]"] + " <b>" + rec.get("name") + "</b>?",
function (btnId) {
if (btnId === "yes") {
Ext.Msg.wait("Please wait until we clear all.", "Removing...");
me.removeServiceFn(rec.get("id"), 1, 1);
}
});
}
);
},
,removeAllServices: function(btn, callback) {
removeAllServices: function (btn, callback) {
var me = this;
if (btn) {
Ext.Msg.confirm(locale['app.window[12]'], locale['app.window[14]'], function(btnId) {
if ( btnId === 'yes' ) {
Ext.Msg.confirm(
locale["app.window[12]"],
locale["app.window[14]"],
function (btnId) {
if (btnId === "yes") {
// Clear counter for unread messaging
document.title = 'Rambox';
document.title = "Rambox";
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();
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) {
Ext.Array.each(
Ext.getStore("Services").collect("id"),
function (serviceId) {
me.removeServiceFn(serviceId, count, i++, callback || false);
});
}
);
if (count === 0 && Ext.isFunction(callback)) callback();
Ext.cq1('app-main').resumeEvent('remove');
Ext.cq1("app-main").resumeEvent("remove");
}
});
}
);
} else {
Ext.cq1('app-main').suspendEvent('remove');
Ext.getStore('Services').load();
const count = Ext.getStore('Services').getCount();
Ext.cq1("app-main").suspendEvent("remove");
Ext.getStore("Services").load();
const count = Ext.getStore("Services").getCount();
var i = 1;
Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) {
Ext.Array.each(
Ext.getStore("Services").collect("id"),
function (serviceId) {
me.removeServiceFn(serviceId, count, i++, callback || false);
});
if ( count === 0 && Ext.isFunction(callback) ) callback();
Ext.cq1('app-main').resumeEvent('remove');
}
}
,configureService: function( gridView, rowIndex, colIndex, col, e, rec, rowEl ) {
Ext.create('Rambox.view.add.Add', {
record: rec
,service: Ext.getStore('ServicesList').getById(rec.get('type'))
,edit: true
);
if (count === 0 && Ext.isFunction(callback)) callback();
Ext.cq1("app-main").resumeEvent("remove");
}
},
configureService: function (
gridView,
rowIndex,
colIndex,
col,
e,
rec,
rowEl
) {
Ext.create("Rambox.view.add.Add", {
record: rec,
service: Ext.getStore("ServicesList").getById(rec.get("type")),
edit: true,
});
}
},
,onSearchRender: function( field ) {
onSearchRender: function (field) {
field.focus(false, 1000);
}
},
,onSearchEnter: function( field, e ) {
onSearchEnter: function (field, e) {
var me = this;
if ( e.getKey() == e.ENTER && Ext.getStore('ServicesList').getCount() === 2 ) { // Two because we always shows Custom Service option
me.onNewServiceSelect(field.up().down('dataview'), Ext.getStore('ServicesList').getAt(0));
if (
e.getKey() == e.ENTER &&
Ext.getStore("ServicesList").getCount() === 2
) {
// Two because we always shows Custom Service option
me.onNewServiceSelect(
field.up().down("dataview"),
Ext.getStore("ServicesList").getAt(0)
);
me.onClearClick(field);
}
}
},
,doTypeFilter: function( cg, newValue, oldValue ) {
doTypeFilter: function (cg, newValue, oldValue) {
var me = this;
Ext.getStore('ServicesList').getFilters().replaceAll({
Ext.getStore("ServicesList")
.getFilters()
.replaceAll({
fn: function (record) {
return Ext.Array.contains(Ext.Object.getKeys(cg.getValue()), record.get('type')) || record.get('type') === 'custom';
}
return (
Ext.Array.contains(
Ext.Object.getKeys(cg.getValue()),
record.get("type")
) || record.get("type") === "custom"
);
},
});
}
},
,onSearchServiceChange: function(field, newValue, oldValue) {
onSearchServiceChange: function (field, newValue, oldValue) {
var me = this;
var cg = field.up().down('checkboxgroup');
var cg = field.up().down("checkboxgroup");
if (!Ext.isEmpty(newValue) && newValue.length > 0) {
field.getTrigger('clear').show();
field.getTrigger("clear").show();
Ext.getStore('ServicesList').getFilters().replaceAll({
Ext.getStore("ServicesList")
.getFilters()
.replaceAll({
fn: function (record) {
if ( record.get('type') === 'custom' ) return true;
if ( !Ext.Array.contains(Ext.Object.getKeys(cg.getValue()), record.get('type')) ) return false;
return record.get('name').toLowerCase().indexOf(newValue.toLowerCase()) > -1 ? true : false;
}
if (record.get("type") === "custom") return true;
if (
!Ext.Array.contains(
Ext.Object.getKeys(cg.getValue()),
record.get("type")
)
)
return false;
return record
.get("name")
.toLowerCase()
.indexOf(newValue.toLowerCase()) > -1
? true
: false;
},
});
} else {
field.getTrigger('clear').hide();
Ext.getStore('ServicesList').getFilters().removeAll();
field.getTrigger("clear").hide();
Ext.getStore("ServicesList").getFilters().removeAll();
me.doTypeFilter(cg);
}
field.updateLayout();
}
},
,onClearClick: function(field, trigger, e) {
onClearClick: function (field, trigger, e) {
var me = this;
var cg = field.up().down('checkboxgroup');
var cg = field.up().down("checkboxgroup");
field.reset();
field.getTrigger('clear').hide();
field.getTrigger("clear").hide();
field.updateLayout();
Ext.getStore('ServicesList').getFilters().removeAll();
Ext.getStore("ServicesList").getFilters().removeAll();
me.doTypeFilter(cg);
}
},
,dontDisturb: function(btn, e, called) {
console.info('Dont Disturb:', btn.pressed ? 'Enabled' : 'Disabled');
dontDisturb: function (btn, e, called) {
console.info("Dont Disturb:", btn.pressed ? "Enabled" : "Disabled");
// Google Analytics Event
if ( !called ) ga_storage._trackEvent('Usability', 'dontDisturb', ( btn.pressed ? 'on' : 'off' ));
if (!called)
ga_storage._trackEvent(
"Usability",
"dontDisturb",
btn.pressed ? "on" : "off"
);
Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) {
Ext.Array.each(
Ext.getStore("Services").collect("id"),
function (serviceId) {
// Get Tab
var tab = Ext.getCmp('tab_'+serviceId);
var tab = Ext.getCmp("tab_" + serviceId);
if (!tab) return; // Skip disabled services
// Mute sounds
tab.setAudioMuted(btn.pressed ? true : tab.record.get('muted'), true);
tab.setAudioMuted(btn.pressed ? true : tab.record.get("muted"), true);
// Prevent Notifications
tab.setNotifications(btn.pressed ? false : tab.record.get('notifications'), true);
});
tab.setNotifications(
btn.pressed ? false : tab.record.get("notifications"),
true
);
}
);
localStorage.setItem('dontDisturb', btn.pressed);
localStorage.setItem("dontDisturb", btn.pressed);
ipc.send('setDontDisturb', btn.pressed);
ipc.send("setDontDisturb", btn.pressed);
btn.setText(locale['app.main[16]']+': ' + ( btn.pressed ? locale['app.window[20]'] : locale['app.window[21]'] ));
btn.setText(
locale["app.main[16]"] +
": " +
(btn.pressed ? locale["app.window[20]"] : locale["app.window[21]"])
);
// var btn_icon = document.getElementById('disturbBtn-btnIconEl');
// btn_icon.innerHTML = btn.pressed ? "" : "";
btn.pressed ? btn.setGlyph('xf1f7@FontAwesome') : btn.setGlyph('xf0f3@FontAwesome');
btn.pressed
? btn.setGlyph("xf1f7@FontAwesome")
: btn.setGlyph("xf0f3@FontAwesome");
Ext.getCmp('mainTabBar').getEl().toggleCls('dontdisturb');
Ext.getCmp("mainTabBar").getEl().toggleCls("dontdisturb");
// If this method is called from Lock method, prevent showing toast
if (!e) return;
Ext.toast({
html: btn.pressed ? 'ENABLED' : 'DISABLED'
,title: 'Don\'t Disturb'
,width: 200
,align: 't'
,closable: false
html: btn.pressed ? "ENABLED" : "DISABLED",
title: "Don't Disturb",
width: 200,
align: "t",
closable: false,
});
}
},
,lockRambox: function(btn) {
lockRambox: function (btn) {
var me = this;
if ( ipc.sendSync('getConfig').master_password ) {
Ext.Msg.confirm(locale['app.main[19]'], 'Do you want to use the Master Password as your temporal password?', function(btnId) {
if ( btnId === 'yes' ) {
setLock(ipc.sendSync('getConfig').master_password);
if (ipc.sendSync("getConfig").master_password) {
Ext.Msg.confirm(
locale["app.main[19]"],
"Do you want to use the Master Password as your temporal password?",
function (btnId) {
if (btnId === "yes") {
setLock(ipc.sendSync("getConfig").master_password);
} else {
showTempPass();
}
});
}
);
} else {
showTempPass();
}
function showTempPass() {
var msgbox = Ext.Msg.prompt(locale['app.main[19]'], locale['app.window[22]'], function(btnId, text) {
if ( btnId === 'ok' ) {
var msgbox2 = Ext.Msg.prompt(locale['app.main[19]'], locale['app.window[23]'], function(btnId, text2) {
if ( btnId === 'ok' ) {
var msgbox = Ext.Msg.prompt(
locale["app.main[19]"],
locale["app.window[22]"],
function (btnId, text) {
if (btnId === "ok") {
var msgbox2 = Ext.Msg.prompt(
locale["app.main[19]"],
locale["app.window[23]"],
function (btnId, text2) {
if (btnId === "ok") {
if (text !== text2) {
Ext.Msg.show({
title: locale['app.window[24]']
,message: locale['app.window[25]']
,icon: Ext.Msg.WARNING
,buttons: Ext.Msg.OK
,fn: me.lockRambox
title: locale["app.window[24]"],
message: locale["app.window[25]"],
icon: Ext.Msg.WARNING,
buttons: Ext.Msg.OK,
fn: me.lockRambox,
});
return false;
}
setLock(Rambox.util.MD5.encypt(text));
}
});
msgbox2.textField.inputEl.dom.type = 'password';
}
});
msgbox.textField.inputEl.dom.type = 'password';
);
msgbox2.textField.inputEl.dom.type = "password";
}
}
);
msgbox.textField.inputEl.dom.type = "password";
}
function setLock(text) {
var ramboxTab = Ext.cq1('#ramboxTab');
var ramboxTab = Ext.cq1("#ramboxTab");
// Related to issue #2065. Focusing in an sub frame is a workaround
if (ramboxTab.getWebView) {
ramboxTab.down('component').el.dom.executeJavaScript(`
ramboxTab.down("component").el.dom.executeJavaScript(`
var iframeFix = document.createElement('iframe');
document.body.appendChild(iframeFix);
iframeFix.focus();
document.body.removeChild(iframeFix);
`);
}
console.info('Lock Rambox:', 'Enabled');
console.info("Lock Rambox:", "Enabled");
// Save encrypted password in localStorage to show locked when app is reopen
localStorage.setItem('locked', text);
localStorage.setItem("locked", text);
// Google Analytics Event
ga_storage._trackEvent('Usability', 'locked');
ga_storage._trackEvent("Usability", "locked");
me.lookupReference('disturbBtn').setPressed(true);
me.dontDisturb(me.lookupReference('disturbBtn'), false, true);
me.lookupReference("disturbBtn").setPressed(true);
me.dontDisturb(me.lookupReference("disturbBtn"), false, true);
me.showLockWindow();
}
}
},
,showLockWindow: function() {
showLockWindow: function () {
var me = this;
var validateFn = function () {
if ( localStorage.getItem('locked') === Rambox.util.MD5.encypt(winLock.down('textfield').getValue()) ) {
console.info('Lock Rambox:', 'Disabled');
localStorage.removeItem('locked');
if (
localStorage.getItem("locked") ===
Rambox.util.MD5.encypt(winLock.down("textfield").getValue())
) {
console.info("Lock Rambox:", "Disabled");
localStorage.removeItem("locked");
winLock.close();
me.lookupReference('disturbBtn').setPressed(false);
me.dontDisturb(me.lookupReference('disturbBtn'), false);
me.lookupReference("disturbBtn").setPressed(false);
me.dontDisturb(me.lookupReference("disturbBtn"), false);
} else {
winLock.down('textfield').reset();
winLock.down('textfield').markInvalid('Unlock password is invalid');
winLock.down("textfield").reset();
winLock.down("textfield").markInvalid("Unlock password is invalid");
}
};
var winLock = Ext.create('Ext.window.Window', {
maximized: true
,closable: false
,resizable: false
,minimizable: false
,maximizable: false
,draggable: false
,onEsc: Ext.emptyFn
,layout: 'center'
,bodyStyle: 'background-color:#2e658e;'
,items: [
var winLock = Ext.create("Ext.window.Window", {
maximized: true,
closable: false,
resizable: false,
minimizable: false,
maximizable: false,
draggable: false,
onEsc: Ext.emptyFn,
layout: "center",
bodyStyle: "background-color:#2e658e;",
items: [
{
xtype: 'container'
,layout: 'vbox'
,items: [
xtype: "container",
layout: "vbox",
items: [
{
xtype: 'image'
,src: 'resources/Icon.png'
,width: 256
,height: 256
}
,{
xtype: 'component'
,autoEl: {
tag: 'h1'
,html: locale['app.window[26]']
,style: 'text-align:center;width:256px;'
}
}
,{
xtype: 'textfield'
,inputType: 'password'
,width: 256
,listeners: {
xtype: "image",
src: "resources/Icon.png",
width: 256,
height: 256,
},
{
xtype: "component",
autoEl: {
tag: "h1",
html: locale["app.window[26]"],
style: "text-align:center;width:256px;",
},
},
{
xtype: "textfield",
inputType: "password",
width: 256,
listeners: {
specialkey: function (field, e) {
if (e.getKey() == e.ENTER) {
validateFn();
}
}
}
}
,{
xtype: 'button'
,text: locale['app.window[27]']
,glyph: 'xf13e@FontAwesome'
,width: 256
,scale: 'large'
,handler: validateFn
}
]
}
]
,listeners: {
},
},
},
{
xtype: "button",
text: locale["app.window[27]"],
glyph: "xf13e@FontAwesome",
width: 256,
scale: "large",
handler: validateFn,
},
],
},
],
listeners: {
render: function (win) {
win.getEl().on('click', function() {
win.down('textfield').focus(100);
win.getEl().on("click", function () {
win.down("textfield").focus(100);
});
}
}
},
},
}).show();
winLock.down('textfield').focus(1000);
}
winLock.down("textfield").focus(1000);
},
,openPreferences: function( btn ) {
openPreferences: function (btn) {
var me = this;
Ext.create('Rambox.view.preferences.Preferences').show();
}
Ext.create("Rambox.view.preferences.Preferences").show();
},
,login: function(btn) {
login: function (btn) {
var me = this;
Rambox.ux.Auth0.login();
}
},
,logout: function(btn) {
logout: function (btn) {
var me = this;
var logoutFn = function (callback) {
Ext.Msg.wait(locale['app.window[37]'], locale['app.main[21]']);
Ext.Msg.wait(locale["app.window[37]"], locale["app.main[21]"]);
// Google Analytics Event
ga_storage._trackEvent('Users', 'loggedOut');
ga_storage._trackEvent("Users", "loggedOut");
// Logout from Auth0
Rambox.ux.Auth0.logout();
Ext.cq1('app-main').getViewModel().set('username', '');
Ext.cq1('app-main').getViewModel().set('avatar', '');
Ext.cq1("app-main").getViewModel().set("username", "");
Ext.cq1("app-main").getViewModel().set("avatar", "");
if (Ext.isFunction(callback)) {
callback(false, function () {
@ -527,20 +652,24 @@ Ext.define('Rambox.view.main.MainController', {
} else {
Ext.Msg.hide();
}
}
};
if (btn) {
Ext.Msg.confirm(locale['app.main[21]'], locale['app.window[38]'], function(btnId) {
if ( btnId === 'yes' ) {
Ext.Msg.confirm(
locale["app.main[21]"],
locale["app.window[38]"],
function (btnId) {
if (btnId === "yes") {
logoutFn(me.removeAllServices.bind(me));
}
});
}
);
} else {
logoutFn();
}
}
},
,showDonate: function( btn ) {
Signalayer.API.show('tChaoq3PwSG9wswhn');
}
showDonate: function (btn) {
Signalayer.API.show("tChaoq3PwSG9wswhn");
},
});

746
app/view/preferences/Preferences.js

@ -1,382 +1,412 @@
Ext.define('Rambox.view.preferences.Preferences',{
extend: 'Ext.window.Window'
,xtype: 'preferences'
Ext.define("Rambox.view.preferences.Preferences", {
extend: "Ext.window.Window",
xtype: "preferences",
,requires: [
'Rambox.view.preferences.PreferencesController'
,'Rambox.view.preferences.PreferencesModel'
,'Ext.form.field.ComboBox'
,'Ext.form.field.Checkbox'
]
requires: [
"Rambox.view.preferences.PreferencesController",
"Rambox.view.preferences.PreferencesModel",
"Ext.form.field.ComboBox",
"Ext.form.field.Checkbox",
],
,controller: 'preferences-preferences'
,viewModel: {
type: 'preferences-preferences'
}
controller: "preferences-preferences",
viewModel: {
type: "preferences-preferences",
},
,title: locale['preferences[0]']
,width: 420
,height: 500
,modal: true
,closable: true
,minimizable: false
,maximizable: false
,draggable: true
,resizable: false
,scrollable: 'vertical'
,bodyStyle: 'margin-right:15px;'
,buttons: [
{
text: locale['button[1]']
,ui: 'decline'
,handler: 'cancel'
}
,'->'
,{
text: locale['button[4]']
,handler: 'save'
}
]
title: locale["preferences[0]"],
width: 420,
height: 500,
modal: true,
closable: true,
minimizable: false,
maximizable: false,
draggable: true,
resizable: false,
scrollable: "vertical",
bodyStyle: "margin-right:15px;",
buttons: [
{
text: locale["button[1]"],
ui: "decline",
handler: "cancel",
},
"->",
{
text: locale["button[4]"],
handler: "save",
},
],
,initComponent: function() {
var config = ipc.sendSync('getConfig');
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: "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')
value: rec.get("id"),
label: rec.get("name"),
});
});
this.items = [
{
xtype: 'form'
,bodyPadding: 20
,items: [
{
xtype: 'container'
,layout: 'hbox'
,items: [
{
xtype: 'combo'
,name: 'locale'
,fieldLabel: 'Language'
,labelAlign: 'left'
,flex: 1
,labelWidth: 80
,value: config.locale
,displayField: 'label'
,valueField: 'value'
,editable: false
,store: Ext.create('Ext.data.Store', {
fields: ['value', 'label']
,data: [
{ 'value': 'af', 'auth0': 'af', 'label': 'Afrikaans' }
,{ 'value': 'ar', 'auth0': 'en', 'label': 'Arabic' }
,{ 'value': 'bs2', 'auth0': 'en', 'label': 'Barndutsch, Switzerland' }
,{ 'value': 'bn', 'auth0': 'en', 'label': 'Bengali' }
,{ 'value': 'bg', 'auth0': 'en', 'label': 'Bulgarian' }
,{ 'value': 'ca', 'auth0': 'ca', 'label': 'Catalan' }
,{ 'value': 'ceb', 'auth0': 'en', 'label': 'Cebuano' }
,{ 'value': 'zh-CN', 'auth0': 'zh', 'label': 'Chinese Simplified' }
,{ 'value': 'zh-TW', 'auth0': 'zh-tw', 'label': 'Chinese Traditional' }
,{ 'value': 'hr', 'auth0': 'en', 'label': 'Croatian' }
,{ 'value': 'cs', 'auth0': 'cs', 'label': 'Czech' }
,{ 'value': 'da', 'auth0': 'da', 'label': 'Danish' }
,{ 'value': 'nl', 'auth0': 'nl', 'label': 'Dutch' }
,{ 'value': 'en', 'auth0': 'en', 'label': 'English' }
,{ 'value': 'fi', 'auth0': 'fi', 'label': 'Finnish' }
,{ 'value': 'fil', 'auth0': 'en', 'label': 'Filipino' }
,{ 'value': 'fr', 'auth0': 'fr', 'label': 'French' }
,{ 'value': 'de', 'auth0': 'de', 'label': 'German' }
,{ 'value': 'de-CH', 'auth0': 'de', 'label': 'German, Switzerland' }
,{ 'value': 'el', 'auth0': 'el', 'label': 'Greek' }
,{ 'value': 'he', 'auth0': 'en', 'label': 'Hebrew' }
,{ 'value': 'hi', 'auth0': 'en', 'label': 'Hindi' }
,{ 'value': 'hu', 'auth0': 'hu', 'label': 'Hungarian' }
,{ 'value': 'id', 'auth0': 'en', 'label': 'Indonesian' }
,{ 'value': 'it', 'auth0': 'it', 'label': 'Italian' }
,{ 'value': 'ja', 'auth0': 'ja', 'label': 'Japanese' }
,{ 'value': 'ko', 'auth0': 'ko', 'label': 'Korean' }
,{ 'value': 'no', 'auth0': 'no', 'label': 'Norwegian' }
,{ 'value': 'fa', 'auth0': 'fa', 'label': 'Persian' }
,{ 'value': 'pl', 'auth0': 'pl', 'label': 'Polish' }
,{ 'value': 'pt-PT', 'auth0': 'pt-br', 'label': 'Portuguese' }
,{ 'value': 'pt-BR', 'auth0': 'pt-br', 'label': 'Portuguese (Brazilian)' }
,{ 'value': 'ro', 'auth0': 'ro', 'label': 'Romanian' }
,{ 'value': 'ru', 'auth0': 'ru', 'label': 'Russian' }
,{ 'value': 'sr', 'auth0': 'en', 'label': 'Serbian (Cyrillic)' }
,{ 'value': 'sk', 'auth0': 'sk', 'label': 'Slovak' }
,{ 'value': 'es-ES', 'auth0': 'es', 'label': 'Spanish' }
,{ 'value': 'sv-SE', 'auth0': 'sv', 'label': 'Swedish' }
,{ 'value': 'tl', 'auth0': 'en', 'label': 'Tagalog' }
,{ 'value': 'th', 'auth0': 'en', 'label': 'Thai' }
,{ 'value': 'tr', 'auth0': 'tr', 'label': 'Turkish' }
,{ 'value': 'uk', 'auth0': 'en', 'label': 'Ukrainian' }
,{ 'value': 'ur-PK', 'auth0': 'en', 'label': 'Urdu (Pakistan)' }
,{ 'value': 'vi', 'auth0': 'en', 'label': 'Vietnamese' }
]
})
}
,{
xtype: 'button'
,text: 'Help us Translate'
,style: 'border-top-left-radius:0;border-bottom-left-radius:0;'
,href: 'https://crowdin.com/project/rambox/invite'
}
]
}
,{
xtype: 'label'
,text: 'English is the only language that has full translation. We are working with all the others, help us!'
,style: 'display:block;font-size:10px;line-height:15px;'
,margin: '0 0 10 0'
}
,{
xtype: 'checkbox'
,name: 'auto_launch'
,boxLabel: locale['preferences[5]']
,value: config.auto_launch
}
,{
xtype: 'checkbox'
,name: 'start_minimized'
,boxLabel: locale['preferences[4]']
,value: config.start_minimized
}
,{
xtype: 'checkbox'
,name: 'darkreader'
,boxLabel: locale['preferences[29]']
,value: config.darkreader
}
,{
xtype: 'checkbox'
,name: 'hide_menu_bar'
,boxLabel: locale['preferences[1]']+' (<code>Alt</code> key to display)'
,value: config.hide_menu_bar
,hidden: process.platform === 'darwin'
}
,{
xtype: 'combo'
,name: 'tabbar_location'
,fieldLabel: locale['preferences[11]']
,labelAlign: 'left'
,width: 380
,labelWidth: 180
,value: config.tabbar_location
,displayField: 'label'
,valueField: 'value'
,editable: false
,store: Ext.create('Ext.data.Store', {
fields: ['value', 'label']
,data: [
{ 'value': 'top', 'label': 'Top' }
,{ 'value': 'left', 'label': 'Left' }
,{ 'value': 'bottom', 'label': 'Bottom' }
,{ 'value': 'right', 'label': 'Right' }
]
})
}
,{
xtype: 'checkbox'
,name: 'hide_tabbar_labels'
,boxLabel: locale['preferences[28]']
,value: config.hide_tabbar_labels
}
,{
xtype: 'combo'
,name: 'default_service'
,fieldLabel: locale['preferences[12]']
,labelAlign: 'top'
xtype: "form",
bodyPadding: 20,
items: [
{
xtype: "container",
layout: "hbox",
items: [
{
xtype: "combo",
name: "locale",
fieldLabel: "Language",
labelAlign: "left",
flex: 1,
labelWidth: 80,
value: config.locale,
displayField: "label",
valueField: "value",
editable: false,
store: Ext.create("Ext.data.Store", {
fields: ["value", "label"],
data: [
{ value: "af", auth0: "af", label: "Afrikaans" },
{ value: "ar", auth0: "en", label: "Arabic" },
{
value: "bs2",
auth0: "en",
label: "Barndutsch, Switzerland",
},
{ value: "bn", auth0: "en", label: "Bengali" },
{ value: "bg", auth0: "en", label: "Bulgarian" },
{ value: "ca", auth0: "ca", label: "Catalan" },
{ value: "ceb", auth0: "en", label: "Cebuano" },
{
value: "zh-CN",
auth0: "zh",
label: "Chinese Simplified",
},
{
value: "zh-TW",
auth0: "zh-tw",
label: "Chinese Traditional",
},
{ value: "hr", auth0: "en", label: "Croatian" },
{ value: "cs", auth0: "cs", label: "Czech" },
{ value: "da", auth0: "da", label: "Danish" },
{ value: "nl", auth0: "nl", label: "Dutch" },
{ value: "en", auth0: "en", label: "English" },
{ value: "fi", auth0: "fi", label: "Finnish" },
{ value: "fil", auth0: "en", label: "Filipino" },
{ value: "fr", auth0: "fr", label: "French" },
{ value: "de", auth0: "de", label: "German" },
{
value: "de-CH",
auth0: "de",
label: "German, Switzerland",
},
{ value: "el", auth0: "el", label: "Greek" },
{ value: "he", auth0: "en", label: "Hebrew" },
{ value: "hi", auth0: "en", label: "Hindi" },
{ value: "hu", auth0: "hu", label: "Hungarian" },
{ value: "id", auth0: "en", label: "Indonesian" },
{ value: "it", auth0: "it", label: "Italian" },
{ value: "ja", auth0: "ja", label: "Japanese" },
{ value: "ko", auth0: "ko", label: "Korean" },
{ value: "no", auth0: "no", label: "Norwegian" },
{ value: "fa", auth0: "fa", label: "Persian" },
{ value: "pl", auth0: "pl", label: "Polish" },
{ value: "pt-PT", auth0: "pt-br", label: "Portuguese" },
{
value: "pt-BR",
auth0: "pt-br",
label: "Portuguese (Brazilian)",
},
{ value: "ro", auth0: "ro", label: "Romanian" },
{ value: "ru", auth0: "ru", label: "Russian" },
{ value: "sr", auth0: "en", label: "Serbian (Cyrillic)" },
{ value: "sk", auth0: "sk", label: "Slovak" },
{ value: "es-ES", auth0: "es", label: "Spanish" },
{ value: "sv-SE", auth0: "sv", label: "Swedish" },
{ value: "tl", auth0: "en", label: "Tagalog" },
{ value: "th", auth0: "en", label: "Thai" },
{ value: "tr", auth0: "tr", label: "Turkish" },
{ value: "uk", auth0: "en", label: "Ukrainian" },
{ value: "ur-PK", auth0: "en", label: "Urdu (Pakistan)" },
{ value: "vi", auth0: "en", label: "Vietnamese" },
],
}),
},
{
xtype: "button",
text: "Help us Translate",
style: "border-top-left-radius:0;border-bottom-left-radius:0;",
href: "https://crowdin.com/project/rambox/invite",
},
],
},
{
xtype: "label",
text:
"English is the only language that has full translation. We are working with all the others, help us!",
style: "display:block;font-size:10px;line-height:15px;",
margin: "0 0 10 0",
},
{
xtype: "checkbox",
name: "auto_launch",
boxLabel: locale["preferences[5]"],
value: config.auto_launch,
},
{
xtype: "checkbox",
name: "start_minimized",
boxLabel: locale["preferences[4]"],
value: config.start_minimized,
},
{
xtype: "checkbox",
name: "darkreader",
boxLabel: locale["preferences[29]"],
value: config.darkreader,
},
{
xtype: "checkbox",
name: "hide_menu_bar",
boxLabel:
locale["preferences[1]"] + " (<code>Alt</code> key to display)",
value: config.hide_menu_bar,
hidden: process.platform === "darwin",
},
{
xtype: "combo",
name: "tabbar_location",
fieldLabel: locale["preferences[11]"],
labelAlign: "left",
width: 380,
labelWidth: 180,
value: config.tabbar_location,
displayField: "label",
valueField: "value",
editable: false,
store: Ext.create("Ext.data.Store", {
fields: ["value", "label"],
data: [
{ value: "top", label: "Top" },
{ value: "left", label: "Left" },
{ value: "bottom", label: "Bottom" },
{ value: "right", label: "Right" },
],
}),
},
{
xtype: "checkbox",
name: "hide_tabbar_labels",
boxLabel: locale["preferences[28]"],
value: config.hide_tabbar_labels,
},
{
xtype: "combo",
name: "default_service",
fieldLabel: locale["preferences[12]"],
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'
,fieldLabel: locale['preferences[13]']
,labelAlign: 'left'
,width: 380
,labelWidth: 105
,value: config.window_display_behavior
,displayField: 'label'
,valueField: 'value'
,editable: false
,store: Ext.create('Ext.data.Store', {
fields: ['value', 'label']
,data: [
{ 'value': 'show_taskbar', 'label': locale['preferences[14]'] }
,{ 'value': 'show_trayIcon', 'label': locale['preferences[15]'] }
,{ 'value': 'taskbar_tray', 'label': locale['preferences[16]'] }
]
})
,hidden: process.platform === 'darwin'
}
,{
xtype: 'combo'
,name: 'window_close_behavior'
,fieldLabel: locale['preferences[17]']
,labelAlign: 'left'
,width: 380
,labelWidth: 180
,value: config.window_close_behavior
,displayField: 'label'
,valueField: 'value'
,editable: false
,store: Ext.create('Ext.data.Store', {
fields: ['value', 'label']
,data: [
{ 'value': 'keep_in_tray', 'label': locale['preferences[18]'] }
,{ 'value': 'keep_in_tray_and_taskbar', 'label': locale['preferences[19]'] }
,{ 'value': 'quit', 'label': locale['preferences[20]'] }
]
})
,hidden: process.platform === 'darwin'
}
,{
xtype: 'checkbox'
,name: 'always_on_top'
,boxLabel: locale['preferences[21]']
,value: config.always_on_top
}
,{
xtype: 'checkbox'
,name: 'systemtray_indicator'
,boxLabel: locale['preferences[22]']
,value: config.systemtray_indicator
,hidden: process.platform === 'darwin'
}
,{
xtype: 'checkbox'
,name: 'flash_frame'
,boxLabel: process.platform === 'darwin' ? locale['preferences[10]'] : locale['preferences[9]']
,value: config.flash_frame
}
,{
xtype: 'checkbox'
,name: 'disable_gpu'
,boxLabel: locale['preferences[23]']
,value: config.disable_gpu
}
,{
xtype: 'checkbox'
,name: 'enable_hidpi_support'
,boxLabel: locale['preferences[8]']
,value: config.enable_hidpi_support
,hidden: process.platform !== 'win32'
},
{
xtype: 'textfield'
,fieldLabel: 'Override User-Agent for all services (needs to relaunch)'
,labelAlign: 'top'
,name: 'user_agent'
,value: config.user_agent
,width: 360
,emptyText: 'Leave blank for default user agent'
}
,{
xtype: 'fieldset'
,title: locale['preferences[24]']
,collapsed: !config.master_password
,checkboxToggle: true
,checkboxName: 'master_password'
,margin: '10 0 0 0'
,padding: 10
,layout: 'hbox'
,defaults: { labelAlign: 'top' }
,items: [
{
xtype: 'textfield'
,inputType: 'password'
,fieldLabel: locale['preferences[25]']
,name: 'master_password1'
,itemId: 'pass'
,flex: 1
,listeners: {
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",
fieldLabel: locale["preferences[13]"],
labelAlign: "left",
width: 380,
labelWidth: 105,
value: config.window_display_behavior,
displayField: "label",
valueField: "value",
editable: false,
store: Ext.create("Ext.data.Store", {
fields: ["value", "label"],
data: [
{ value: "show_taskbar", label: locale["preferences[14]"] },
{ value: "show_trayIcon", label: locale["preferences[15]"] },
{ value: "taskbar_tray", label: locale["preferences[16]"] },
],
}),
hidden: process.platform === "darwin",
},
{
xtype: "combo",
name: "window_close_behavior",
fieldLabel: locale["preferences[17]"],
labelAlign: "left",
width: 380,
labelWidth: 180,
value: config.window_close_behavior,
displayField: "label",
valueField: "value",
editable: false,
store: Ext.create("Ext.data.Store", {
fields: ["value", "label"],
data: [
{ value: "keep_in_tray", label: locale["preferences[18]"] },
{
value: "keep_in_tray_and_taskbar",
label: locale["preferences[19]"],
},
{ value: "quit", label: locale["preferences[20]"] },
],
}),
hidden: process.platform === "darwin",
},
{
xtype: "checkbox",
name: "always_on_top",
boxLabel: locale["preferences[21]"],
value: config.always_on_top,
},
{
xtype: "checkbox",
name: "systemtray_indicator",
boxLabel: locale["preferences[22]"],
value: config.systemtray_indicator,
hidden: process.platform === "darwin",
},
{
xtype: "checkbox",
name: "flash_frame",
boxLabel:
process.platform === "darwin"
? locale["preferences[10]"]
: locale["preferences[9]"],
value: config.flash_frame,
},
{
xtype: "checkbox",
name: "disable_gpu",
boxLabel: locale["preferences[23]"],
value: config.disable_gpu,
},
{
xtype: "checkbox",
name: "enable_hidpi_support",
boxLabel: locale["preferences[8]"],
value: config.enable_hidpi_support,
hidden: process.platform !== "win32",
},
{
xtype: "textfield",
fieldLabel:
"Override User-Agent for all services (needs to relaunch)",
labelAlign: "top",
name: "user_agent",
value: config.user_agent,
width: 360,
emptyText: "Leave blank for default user agent",
},
{
xtype: "fieldset",
title: locale["preferences[24]"],
collapsed: !config.master_password,
checkboxToggle: true,
checkboxName: "master_password",
margin: "10 0 0 0",
padding: 10,
layout: "hbox",
defaults: { labelAlign: "top" },
items: [
{
xtype: "textfield",
inputType: "password",
fieldLabel: locale["preferences[25]"],
name: "master_password1",
itemId: "pass",
flex: 1,
listeners: {
validitychange: function (field) {
field.next().validate();
},
blur: function (field) {
field.next().validate();
}
}
}
,{
xtype: 'textfield'
,inputType: 'password'
,fieldLabel: locale['preferences[26]']
,name: 'master_password2'
,margin: '0 0 0 10'
,vtype: 'password'
,initialPassField: 'pass'
,flex: 1
}
]
}
,{
xtype: 'fieldset'
,title: 'Proxy (needs to relaunch) - <a href="https://github.com/saenzramiro/rambox/wiki/FREE-PROXY-SERVERS" target="_blank">Free Proxy Servers</a>'
,collapsed: !config.proxy
,checkboxToggle: true
,checkboxName: 'proxy'
,margin: '10 0 0 0'
,padding: 10
,layout: 'vbox'
,defaults: { labelAlign: 'left' }
,items: [
{
xtype: 'textfield'
,vtype: 'url'
,fieldLabel: 'Host'
,name: 'proxyHost'
,value: config.proxyHost
},
},
},
{
xtype: "textfield",
inputType: "password",
fieldLabel: locale["preferences[26]"],
name: "master_password2",
margin: "0 0 0 10",
vtype: "password",
initialPassField: "pass",
flex: 1,
},
],
},
{
xtype: "fieldset",
title:
'Proxy (needs to relaunch) - <a href="https://github.com/saenzramiro/rambox/wiki/FREE-PROXY-SERVERS" target="_blank">Free Proxy Servers</a>',
collapsed: !config.proxy,
checkboxToggle: true,
checkboxName: "proxy",
margin: "10 0 0 0",
padding: 10,
layout: "vbox",
defaults: { labelAlign: "left" },
items: [
{
xtype: "textfield",
vtype: "url",
fieldLabel: "Host",
name: "proxyHost",
value: config.proxyHost,
//,flex: 1
}
,{
xtype: 'numberfield'
,fieldLabel: 'Port'
,name: 'proxyPort'
,value: config.proxyPort
}
,{
xtype: 'textfield'
,fieldLabel: 'Login'
,name: 'proxyLogin'
,value: config.proxyLogin
,emptyText: 'Optional'
}
,{
xtype: 'textfield'
,fieldLabel: 'Password'
,name: 'proxyPassword'
,value: config.proxyPassword
,emptyText: 'Optional'
,inputType: 'password'
}
]
}
,{
xtype: 'checkbox'
,name: 'sendStatistics'
,boxLabel: locale['preferences[27]']
,value: config.sendStatistics
}
]
}
},
{
xtype: "numberfield",
fieldLabel: "Port",
name: "proxyPort",
value: config.proxyPort,
},
{
xtype: "textfield",
fieldLabel: "Login",
name: "proxyLogin",
value: config.proxyLogin,
emptyText: "Optional",
},
{
xtype: "textfield",
fieldLabel: "Password",
name: "proxyPassword",
value: config.proxyPassword,
emptyText: "Optional",
inputType: "password",
},
],
},
{
xtype: "checkbox",
name: "sendStatistics",
boxLabel: locale["preferences[27]"],
value: config.sendStatistics,
},
],
},
];
this.callParent();
}
},
});

62
electron/main.js

@ -34,37 +34,37 @@ if (isDev)
// Initial Config
const config = new Config({
defaults: {
always_on_top: false
,hide_menu_bar: false
,tabbar_location: 'top'
,hide_tabbar_labels: false
,window_display_behavior: 'taskbar_tray'
,auto_launch: !isDev
,flash_frame: true
,window_close_behavior: 'keep_in_tray'
,start_minimized: false
,darkreader: true
,systemtray_indicator: true
,master_password: false
,dont_disturb: false
,disable_gpu: process.platform === 'linux'
,proxy: false
,proxyHost: ''
,proxyPort: ''
,proxyLogin: ''
,proxyPassword: ''
,locale: 'en'
,enable_hidpi_support: false
,user_agent: ''
,default_service: 'ramboxTab'
,sendStatistics: false
,x: undefined
,y: undefined
,width: 1000
,height: 800
,maximized: false
}
always_on_top: false,
hide_menu_bar: false,
tabbar_location: "top",
hide_tabbar_labels: false,
window_display_behavior: "taskbar_tray",
auto_launch: !isDev,
flash_frame: true,
window_close_behavior: "keep_in_tray",
start_minimized: false,
darkreader: true,
systemtray_indicator: true,
master_password: false,
dont_disturb: false,
disable_gpu: process.platform === "linux",
proxy: false,
proxyHost: "",
proxyPort: "",
proxyLogin: "",
proxyPassword: "",
locale: "en",
enable_hidpi_support: false,
user_agent: "",
default_service: "ramboxTab",
sendStatistics: false,
x: undefined,
y: undefined,
width: 1000,
height: 800,
maximized: false,
},
});
// Fix issues with HiDPI scaling on Windows platform

14
resources/js/darkreader.js

@ -1,13 +1,13 @@
const { ipcRenderer } = require('electron');
const darkreader = require('darkreader');
const { ipcRenderer } = require("electron");
const darkreader = require("darkreader");
darkreader.setFetchMethod(window.fetch);
const getIsEnabled = () => ipcRenderer.sendSync("getConfig").darkreader;
const canEnable = () =>
document.readyState === "complete" || document.readyState === "interactive";
const getIsEnabled = () => ipcRenderer.sendSync('getConfig').darkreader;
const canEnable = () => document.readyState === 'complete' || document.readyState === 'interactive';
document.addEventListener('readystatechange', () => {
console.log(document.readyState)
document.addEventListener("readystatechange", () => {
console.log(document.readyState);
if (canEnable()) {
getIsEnabled() ? darkreader.enable() : darkreader.disable();
}

9
resources/js/rambox-service-api.js

@ -3,9 +3,12 @@
*/
const { desktopCapturer, ipcRenderer } = require("electron");
require("./darkreader.js")
const { ipcRenderer } = require('electron');
const { ContextMenuBuilder, ContextMenuListener } = require('electron-contextmenu-wrapper');
require("./darkreader.js");
const { ipcRenderer } = require("electron");
const {
ContextMenuBuilder,
ContextMenuListener,
} = require("electron-contextmenu-wrapper");
/**
* Make the Rambox API available via a global "rambox" variable.

253
resources/languages/en.js

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save