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. 730
      app/Application.js
  2. 75
      app/store/ServicesList.js
  3. 640
      app/ux/Auth0.js
  4. 1777
      app/ux/WebView.js
  5. 1209
      app/view/main/MainController.js
  6. 778
      app/view/preferences/Preferences.js
  7. 64
      electron/main.js
  8. 478
      package.json
  9. 22
      resources/js/darkreader.js
  10. 9
      resources/js/rambox-service-api.js
  11. 253
      resources/languages/en.js

730
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'
]
requires: [
"Rambox.ux.Auth0",
"Rambox.util.MD5",
"Ext.window.Toast",
"Ext.util.Cookies",
],
,stores: [
'ServicesList'
,'Services'
]
stores: ["ServicesList", "Services"],
,profiles: [
'Offline'
,'Online'
]
profiles: ["Offline", "Online"],
,config: {
totalServicesLoaded: 0
,totalNotifications: 0
,googleURLs: []
}
config: {
totalServicesLoaded: 0,
totalNotifications: 0,
googleURLs: [],
},
,launch: function () {
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);
}
});
})();
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:
"<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) {
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);
},
},
],
});
}
// 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()
);
Ext.getStore('ServicesList').load(function (records, operations, success) {
// 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"
),
});
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); }
}
]
});
}
// 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
}
}
// Initialize Auth0
if (auth0Cfg.clientID !== "" && auth0Cfg.domain !== "")
Rambox.ux.Auth0.init();
// 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());
// 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);
// 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')});
// Check for updates
if (
require("electron").remote.process.argv.indexOf("--without-update") ===
-1
)
Rambox.app.checkUpdate(true);
// Initialize Auth0
if ( auth0Cfg.clientID !== '' && auth0Cfg.domain !== '' ) Rambox.ux.Auth0.init();
// 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);
},
});
// 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);
// 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);
}
);
// Check for updates
if ( require('electron').remote.process.argv.indexOf('--without-update') === -1 ) Rambox.app.checkUpdate(true);
// Mouse Wheel zooming
document.addEventListener("mousewheel", function (e) {
if (e.ctrlKey) {
var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail));
// 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);
}
});
var tabPanel = Ext.cq1("app-main");
if (tabPanel.items.indexOf(tabPanel.getActiveTab()) === 0)
return false;
// 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);
});
if (delta === 1) {
// Zoom In
tabPanel.getActiveTab().zoomIn();
} else {
// Zoom Out
tabPanel.getActiveTab().zoomOut();
}
}
});
// Mouse Wheel zooming
document.addEventListener('mousewheel', function(e) {
if( e.ctrlKey ) {
var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
// Define default value
if (localStorage.getItem("dontDisturb") === null)
localStorage.setItem("dontDisturb", false);
ipc.send("setDontDisturb", localStorage.getItem("dontDisturb")); // We store it in config
var tabPanel = Ext.cq1('app-main');
if ( tabPanel.items.indexOf(tabPanel.getActiveTab()) === 0 ) return false;
if (localStorage.getItem("locked")) {
console.info("Lock Rambox:", "Enabled");
Ext.cq1("app-main").getController().showLockWindow();
}
Ext.getStore("Services").load();
});
},
if ( delta === 1 ) { // Zoom In
tabPanel.getActiveTab().zoomIn();
} else { // Zoom Out
tabPanel.getActiveTab().zoomOut();
}
}
});
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";
}
}
},
// Define default value
if ( localStorage.getItem('dontDisturb') === null ) localStorage.setItem('dontDisturb', false);
ipc.send('setDontDisturb', localStorage.getItem('dontDisturb')); // We store it in config
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:
"<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");
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,
});
}
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: '<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');
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.');
}
});
}
console.info("Your version is the latest. No need to update.");
},
});
},
});

75
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',
reader: {
type: 'json',
rootProperty: 'responseText'
}
}
,listeners: {
load: function () {
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'
}]
proxy: {
type: "ajax",
url:
"https://raw.githubusercontent.com/ramboxapp/community-edition/gh-pages/api/services.json",
reader: {
type: "json",
rootProperty: "responseText",
},
},
listeners: {
load: function () {
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",
},
],
,autoLoad: true
,autoSync: true
,pageSize: 100000
autoLoad: true,
autoSync: true,
pageSize: 100000,
});

640
app/ux/Auth0.js

@ -1,298 +1,344 @@
Ext.define('Rambox.ux.Auth0', {
singleton: true
// private
,lock: null
,auth0: null
,authService: null
,backupCurrent: false
,init: function() {
var me = this;
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'
});
me.auth0 = new Auth0.WebAuth({ clientID: auth0Cfg.clientID, domain : auth0Cfg.domain });
//me.defineEvents();
}
,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);
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
});
}
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]']);
// Google Analytics Event
ga_storage._trackEvent('Users', 'loggedIn');
// Set cookies to help Tooltip.io messages segmentation
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 ) {
Ext.each(profile.user_metadata.services, function(s) {
var service = Ext.create('Rambox.model.Service', s);
service.save();
Ext.getStore('Services').add(service);
});
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);
});
}
,backupConfiguration: function(callback) {
var me = this;
Ext.Msg.wait('Saving backup...', 'Please wait...');
// Getting all services
var lastupdate = (new Date()).toJSON();
var services = [];
Ext.getStore('Services').each(function(service) {
var s = Ext.clone(service);
delete s.data.id;
delete s.data.zoomLevel;
services.push(s.data);
});
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) {
Ext.Msg.hide();
// Save the last update in localStorage
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());
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
});
if ( Ext.isFunction(callback) ) callback.bind(me)();
}
,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
});
if ( Ext.isFunction(callback) ) callback.bind(me)();
console.error(response);
}
});
}
,restoreConfiguration: function() {
var me = this;
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
});
}
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.each(profile.user_metadata.services, function(s) {
var service = Ext.create('Rambox.model.Service', s);
service.save();
Ext.getStore('Services').add(service);
});
require('electron').remote.getCurrentWindow().reload();
});
});
}
,checkConfiguration: function() {
var me = this;
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
});
}
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
});
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) ) {
Ext.toast({
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
});
}
});
}
,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) {
var json = Ext.decode(response.responseText);
localStorage.setItem('access_token', json.access_token);
localStorage.setItem('id_token', json.id_token);
if ( Ext.isFunction(callback) ) callback.bind(me)();
}
,failure: function(response) {
console.error(response);
}
});
}
,login: function() {
var me = this;
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'
}
});
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) => {
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 });
});
});
authWindow.webContents.on('did-navigate', function(e, url) {
me.authService.requestAccessCode(url, me.onLogin.bind(me), authWindow);
});
}
,logout: function() {
var me = this;
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.define("Rambox.ux.Auth0", {
singleton: true,
// private
lock: null,
auth0: null,
authService: null,
backupCurrent: false,
init: function () {
var me = this;
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",
});
me.auth0 = new Auth0.WebAuth({
clientID: auth0Cfg.clientID,
domain: auth0Cfg.domain,
});
//me.defineEvents();
},
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);
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,
});
}
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]"]);
// Google Analytics Event
ga_storage._trackEvent("Users", "loggedIn");
// Set cookies to help Tooltip.io messages segmentation
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
) {
Ext.each(profile.user_metadata.services, function (s) {
var service = Ext.create("Rambox.model.Service", s);
service.save();
Ext.getStore("Services").add(service);
});
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);
});
},
backupConfiguration: function (callback) {
var me = this;
Ext.Msg.wait("Saving backup...", "Please wait...");
// Getting all services
var lastupdate = new Date().toJSON();
var services = [];
Ext.getStore("Services").each(function (service) {
var s = Ext.clone(service);
delete s.data.id;
delete s.data.zoomLevel;
services.push(s.data);
});
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) {
Ext.Msg.hide();
// Save the last update in localStorage
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());
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,
});
if (Ext.isFunction(callback)) callback.bind(me)();
},
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,
});
if (Ext.isFunction(callback)) callback.bind(me)();
console.error(response);
},
});
},
restoreConfiguration: function () {
var me = this;
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,
});
}
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.each(profile.user_metadata.services, function (s) {
var service = Ext.create("Rambox.model.Service", s);
service.save();
Ext.getStore("Services").add(service);
});
require("electron").remote.getCurrentWindow().reload();
});
}
);
},
checkConfiguration: function () {
var me = this;
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,
});
}
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,
});
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
)
) {
Ext.toast({
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,
});
}
}
);
},
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) {
var json = Ext.decode(response.responseText);
localStorage.setItem("access_token", json.access_token);
localStorage.setItem("id_token", json.id_token);
if (Ext.isFunction(callback)) callback.bind(me)();
},
failure: function (response) {
console.error(response);
},
});
},
login: function () {
var me = this;
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",
},
});
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) => {
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 });
}
);
});
authWindow.webContents.on("did-navigate", function (e, url) {
me.authService.requestAccessCode(url, me.onLogin.bind(me), authWindow);
});
},
logout: function () {
var me = this;
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);
},
});

1777
app/ux/WebView.js

File diff suppressed because it is too large Load Diff

1209
app/view/main/MainController.js

File diff suppressed because it is too large Load Diff

778
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: rec.get('id')
,label: rec.get('name')
});
});
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'
,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: {
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
//,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
}
]
}
];
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",
//,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: {
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,
//,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,
},
],
},
];
this.callParent();
}
this.callParent();
},
});

64
electron/main.js

@ -33,38 +33,38 @@ 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
}
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,
},
});
// Fix issues with HiDPI scaling on Windows platform

478
package.json

@ -1,241 +1,241 @@
{
"name": "Rambox",
"productName": "Rambox",
"version": "0.7.9",
"description": "Free and Open Source messaging and emailing app that combines common web applications into one.",
"main": "electron/main.js",
"repository": {
"type": "git",
"url": "https://github.com/ramboxapp/community-edition.git"
},
"bugs": {
"url": "https://github.com/ramboxapp/community-edition/issues"
},
"homepage": "https://rambox.app",
"keywords": [
"Rambox",
"messaging",
"app",
"slack",
"whatsapp",
"facebook",
"messenger",
"telegram",
"google",
"hangouts",
"skype"
],
"author": "Rambox LLC <[email protected]>",
"license": "GPL-3.0",
"scripts": {
"start": "electron electron/main.js",
"start:debug": "electron electron/main.js --enable-logging",
"dev": "electron electron/main.js",
"test": "./node_modules/.bin/mocha test/tests/**/*.spec.js",
"sencha:clean": "rm -rf ./build/production",
"sencha:compile": "sencha app build && npm --prefix ./build/production/Rambox/ install ./build/production/Rambox/",
"sencha:compile:build": "sencha app build",
"clean": "rm -rf ./dist",
"clean:osx": "rm -rf ./dist/Rambox-darwin-*",
"clean:win": "rm -rf ./dist/Rambox-win32-*",
"pack": "npm run pack:osx && npm run pack:win",
"pack:osx": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=darwin --arch=x64 --icon=resources/installer/Icon.icns --app-version=0.2.0 --build-version=64-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"pack:win": "npm run pack:win32 && npm run pack:win64",
"pack:win32": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=win32 --arch=ia32 --icon=resources/installer/Icon.ico --app-version=0.2.0 --build-version=32-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"pack:win64": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=win32 --arch=x64 --icon=resources/installer/Icon.ico --app-version=0.2.0 --build-version=64-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"pack:linux": "npm run pack:linux32 && npm run pack:linux64",
"pack:linux32": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=linux --arch=ia32 --icon=resources/installer/Icon.ico --app-version=0.2.0 --build-version=64-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"pack:linux64": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=linux --arch=x64 --icon=resources/installer/Icon.ico --app-version=0.2.0 --build-version=64-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"build": "npm run build:linux && npm run build:osx && npm run build:win",
"build:osx": "electron-builder --macos",
"build:linux": "electron-builder --linux --publish=onTagOrDraft",
"build:linux32": "electron-builder --linux --ia32 --publish=onTagOrDraft",
"build:linux64": "electron-builder --linux --x64 --publish=onTagOrDraft",
"build:win": "electron-builder --win --ia32 --x64",
"build:win32": "electron-builder --win --ia32",
"build:win64": "electron-builder --win --x64",
"setup:osx": "npm run sencha:clean && npm run sencha:compile && npm run clean:osx && npm run pack:osx && npm run build:osx",
"setup:win": "npm run sencha:clean && npm run sencha:compile && npm run clean:win && npm run pack:win && npm run build:win",
"all:win": "npm run sencha:clean && npm run sencha:compile && npm run clean:win && npm run pack:win && npm run zip:win32 && npm run zip:win64 && npm run build:win",
"all:linux": "npm run sencha:clean && npm run sencha:compile && npm run build:linux",
"translations:download": "node languages.js download",
"translations:generate": "node languages.js generate"
},
"build": {
"productName": "Rambox",
"appId": "com.grupovrs.ramboxce",
"afterSign": "resources/installer/notarize.js",
"asar": true,
"electronVersion": "11.4.10",
"electronDownload": {
"version": "11.4.10"
},
"mac": {
"category": "public.app-category.productivity",
"artifactName": "Rambox-${version}-mac.${ext}",
"target": [
"default"
],
"hardenedRuntime": true,
"gatekeeperAssess": false,
"entitlements": "resources/installer/entitlements.mac.plist",
"entitlementsInherit": "resources/installer/entitlements.mac.plist",
"extendInfo": {
"NSMicrophoneUsageDescription": "Apps inside Rambox CE may need access to your microphone. Please, grant access to have a better experience.",
"NSCameraUsageDescription": "Apps inside Rambox CE may need access to your camera. Please, grant access to have a better experience."
}
},
"dmg": {
"title": "Rambox",
"iconSize": 128,
"sign": false,
"contents": [
{
"x": 355,
"y": 125,
"type": "link",
"path": "/Applications"
},
{
"x": 155,
"y": 125,
"type": "file"
}
]
},
"win": {
"publisherName": "Rambox LLC",
"artifactName": "Rambox-${version}-win-${arch}.${ext}",
"target": [
"nsis",
"zip"
]
},
"nsis": {
"deleteAppDataOnUninstall": true,
"oneClick": false,
"perMachine": false,
"runAfterFinish": true
},
"snap": {
"publish": [
{
"provider": "github"
}
],
"plugs": [
"default",
"camera",
"audio-record",
"audio-playback",
"removable-media",
"raw-usb",
"u2f-devices",
"cups-control"
]
},
"linux": {
"icon": "resources/installer/icons",
"category": "Network",
"desktop": {
"Terminal": "false",
"Type": "Application",
"Categories": "GTK;GNOME;Network;Email;Chat;InstantMessaging;"
},
"artifactName": "Rambox-${version}-linux-${arch}.${ext}",
"executableArgs": [
"--no-sandbox"
],
"target": [
{
"target": "snap",
"arch": [
"x64"
]
},
{
"target": "AppImage",
"arch": [
"x64",
"ia32"
]
},
{
"target": "deb",
"arch": [
"x64",
"ia32"
]
},
{
"target": "rpm",
"arch": [
"x64",
"ia32"
]
},
{
"target": "zip",
"arch": [
"x64",
"ia32"
]
},
{
"target": "tar.gz",
"arch": [
"x64",
"ia32"
]
}
]
},
"directories": {
"buildResources": "resources/installer/",
"output": "dist/"
},
"publish": [
{
"provider": "github",
"owner": "ramboxapp",
"repo": "community-edition",
"vPrefixedTagName": false
}
]
},
"devDependencies": {
"asar": "0.12.4",
"chai": "3.5.0",
"crowdin": "1.0.0",
"csvjson": "4.3.3",
"electron": "11.4.10",
"electron-builder": "22.9.1",
"electron-notarize": "1.0.0",
"electron-packager": "15.1.0",
"mocha": "5.2.0",
"spectron": "3.8.0"
},
"dependencies": {
"@exponent/electron-cookies": "2.0.0",
"auth0-js": "9.13.2",
"auto-launch-patched": "5.0.2",
"crypto": "1.0.1",
"darkreader": "4.9.17",
"diskusage": "1.1.3",
"electron-contextmenu-wrapper": "git+https://github.com/ramboxapp/electron-contextmenu-wrapper.git",
"electron-is-dev": "0.3.0",
"electron-log": "2.2.17",
"electron-store": "6.0.0",
"electron-updater": "4.1.2",
"is-online": "8.2.0",
"mime": "2.3.1",
"mousetrap": "1.6.3",
"request": "2.88.0",
"request-promise": "4.2.2",
"rimraf": "2.6.1",
"tmp": "0.0.28"
},
"volta": {
"node": "14.16.1"
}
"name": "Rambox",
"productName": "Rambox",
"version": "0.7.9",
"description": "Free and Open Source messaging and emailing app that combines common web applications into one.",
"main": "electron/main.js",
"repository": {
"type": "git",
"url": "https://github.com/ramboxapp/community-edition.git"
},
"bugs": {
"url": "https://github.com/ramboxapp/community-edition/issues"
},
"homepage": "https://rambox.app",
"keywords": [
"Rambox",
"messaging",
"app",
"slack",
"whatsapp",
"facebook",
"messenger",
"telegram",
"google",
"hangouts",
"skype"
],
"author": "Rambox LLC <[email protected]>",
"license": "GPL-3.0",
"scripts": {
"start": "electron electron/main.js",
"start:debug": "electron electron/main.js --enable-logging",
"dev": "electron electron/main.js",
"test": "./node_modules/.bin/mocha test/tests/**/*.spec.js",
"sencha:clean": "rm -rf ./build/production",
"sencha:compile": "sencha app build && npm --prefix ./build/production/Rambox/ install ./build/production/Rambox/",
"sencha:compile:build": "sencha app build",
"clean": "rm -rf ./dist",
"clean:osx": "rm -rf ./dist/Rambox-darwin-*",
"clean:win": "rm -rf ./dist/Rambox-win32-*",
"pack": "npm run pack:osx && npm run pack:win",
"pack:osx": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=darwin --arch=x64 --icon=resources/installer/Icon.icns --app-version=0.2.0 --build-version=64-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"pack:win": "npm run pack:win32 && npm run pack:win64",
"pack:win32": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=win32 --arch=ia32 --icon=resources/installer/Icon.ico --app-version=0.2.0 --build-version=32-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"pack:win64": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=win32 --arch=x64 --icon=resources/installer/Icon.ico --app-version=0.2.0 --build-version=64-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"pack:linux": "npm run pack:linux32 && npm run pack:linux64",
"pack:linux32": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=linux --arch=ia32 --icon=resources/installer/Icon.ico --app-version=0.2.0 --build-version=64-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"pack:linux64": "electron-packager \"./build/production/Rambox/\" \"Rambox\" --out=dist --platform=linux --arch=x64 --icon=resources/installer/Icon.ico --app-version=0.2.0 --build-version=64-bit --version-string.CompanyName=\"Rambox\" --version-string.ProductName=\"Rambox\" --asar --prune --overwrite",
"build": "npm run build:linux && npm run build:osx && npm run build:win",
"build:osx": "electron-builder --macos",
"build:linux": "electron-builder --linux --publish=onTagOrDraft",
"build:linux32": "electron-builder --linux --ia32 --publish=onTagOrDraft",
"build:linux64": "electron-builder --linux --x64 --publish=onTagOrDraft",
"build:win": "electron-builder --win --ia32 --x64",
"build:win32": "electron-builder --win --ia32",
"build:win64": "electron-builder --win --x64",
"setup:osx": "npm run sencha:clean && npm run sencha:compile && npm run clean:osx && npm run pack:osx && npm run build:osx",
"setup:win": "npm run sencha:clean && npm run sencha:compile && npm run clean:win && npm run pack:win && npm run build:win",
"all:win": "npm run sencha:clean && npm run sencha:compile && npm run clean:win && npm run pack:win && npm run zip:win32 && npm run zip:win64 && npm run build:win",
"all:linux": "npm run sencha:clean && npm run sencha:compile && npm run build:linux",
"translations:download": "node languages.js download",
"translations:generate": "node languages.js generate"
},
"build": {
"productName": "Rambox",
"appId": "com.grupovrs.ramboxce",
"afterSign": "resources/installer/notarize.js",
"asar": true,
"electronVersion": "11.4.10",
"electronDownload": {
"version": "11.4.10"
},
"mac": {
"category": "public.app-category.productivity",
"artifactName": "Rambox-${version}-mac.${ext}",
"target": [
"default"
],
"hardenedRuntime": true,
"gatekeeperAssess": false,
"entitlements": "resources/installer/entitlements.mac.plist",
"entitlementsInherit": "resources/installer/entitlements.mac.plist",
"extendInfo": {
"NSMicrophoneUsageDescription": "Apps inside Rambox CE may need access to your microphone. Please, grant access to have a better experience.",
"NSCameraUsageDescription": "Apps inside Rambox CE may need access to your camera. Please, grant access to have a better experience."
}
},
"dmg": {
"title": "Rambox",
"iconSize": 128,
"sign": false,
"contents": [
{
"x": 355,
"y": 125,
"type": "link",
"path": "/Applications"
},
{
"x": 155,
"y": 125,
"type": "file"
}
]
},
"win": {
"publisherName": "Rambox LLC",
"artifactName": "Rambox-${version}-win-${arch}.${ext}",
"target": [
"nsis",
"zip"
]
},
"nsis": {
"deleteAppDataOnUninstall": true,
"oneClick": false,
"perMachine": false,
"runAfterFinish": true
},
"snap": {
"publish": [
{
"provider": "github"
}
],
"plugs": [
"default",
"camera",
"audio-record",
"audio-playback",
"removable-media",
"raw-usb",
"u2f-devices",
"cups-control"
]
},
"linux": {
"icon": "resources/installer/icons",
"category": "Network",
"desktop": {
"Terminal": "false",
"Type": "Application",
"Categories": "GTK;GNOME;Network;Email;Chat;InstantMessaging;"
},
"artifactName": "Rambox-${version}-linux-${arch}.${ext}",
"executableArgs": [
"--no-sandbox"
],
"target": [
{
"target": "snap",
"arch": [
"x64"
]
},
{
"target": "AppImage",
"arch": [
"x64",
"ia32"
]
},
{
"target": "deb",
"arch": [
"x64",
"ia32"
]
},
{
"target": "rpm",
"arch": [
"x64",
"ia32"
]
},
{
"target": "zip",
"arch": [
"x64",
"ia32"
]
},
{
"target": "tar.gz",
"arch": [
"x64",
"ia32"
]
}
]
},
"directories": {
"buildResources": "resources/installer/",
"output": "dist/"
},
"publish": [
{
"provider": "github",
"owner": "ramboxapp",
"repo": "community-edition",
"vPrefixedTagName": false
}
]
},
"devDependencies": {
"asar": "0.12.4",
"chai": "3.5.0",
"crowdin": "1.0.0",
"csvjson": "4.3.3",
"electron": "11.4.10",
"electron-builder": "22.9.1",
"electron-notarize": "1.0.0",
"electron-packager": "15.1.0",
"mocha": "5.2.0",
"spectron": "3.8.0"
},
"dependencies": {
"@exponent/electron-cookies": "2.0.0",
"auth0-js": "9.13.2",
"auto-launch-patched": "5.0.2",
"crypto": "1.0.1",
"darkreader": "4.9.17",
"diskusage": "1.1.3",
"electron-contextmenu-wrapper": "git+https://github.com/ramboxapp/electron-contextmenu-wrapper.git",
"electron-is-dev": "0.3.0",
"electron-log": "2.2.17",
"electron-store": "6.0.0",
"electron-updater": "4.1.2",
"is-online": "8.2.0",
"mime": "2.3.1",
"mousetrap": "1.6.3",
"request": "2.88.0",
"request-promise": "4.2.2",
"rimraf": "2.6.1",
"tmp": "0.0.28"
},
"volta": {
"node": "14.16.1"
}
}

22
resources/js/darkreader.js

@ -1,14 +1,14 @@
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)
if (canEnable()) {
getIsEnabled()? darkreader.enable(): darkreader.disable();
}
});
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