summaryrefslogtreecommitdiffstats
path: root/src/models
diff options
context:
space:
mode:
Diffstat (limited to 'src/models')
-rw-r--r--src/models/News.js2
-rw-r--r--src/models/Plan.js2
-rw-r--r--src/models/RecipePreview.js2
-rw-r--r--src/models/Service.js25
-rw-r--r--src/models/Settings.js19
-rw-r--r--src/models/User.js2
6 files changed, 46 insertions, 6 deletions
diff --git a/src/models/News.js b/src/models/News.js
index e8953ff8c..a96e6550f 100644
--- a/src/models/News.js
+++ b/src/models/News.js
@@ -6,7 +6,7 @@ export default class News {
6 type: string = 'primary'; 6 type: string = 'primary';
7 sticky: bool = false; 7 sticky: bool = false;
8 8
9 constructor(data: Object) { 9 constructor(data) {
10 if (!data.id) { 10 if (!data.id) {
11 throw Error('News requires Id'); 11 throw Error('News requires Id');
12 } 12 }
diff --git a/src/models/Plan.js b/src/models/Plan.js
index 1f2a44902..e77353824 100644
--- a/src/models/Plan.js
+++ b/src/models/Plan.js
@@ -10,7 +10,7 @@ export default class Plan {
10 price: 0, 10 price: 0,
11 } 11 }
12 12
13 constructor(data: Object) { 13 constructor(data) {
14 Object.assign(this, data); 14 Object.assign(this, data);
15 } 15 }
16} 16}
diff --git a/src/models/RecipePreview.js b/src/models/RecipePreview.js
index 7b497edf3..525a5c4b5 100644
--- a/src/models/RecipePreview.js
+++ b/src/models/RecipePreview.js
@@ -6,7 +6,7 @@ export default class RecipePreview {
6 icon: string = ''; // TODO: check if this isn't replaced by `icons` 6 icon: string = ''; // TODO: check if this isn't replaced by `icons`
7 featured: bool = false; 7 featured: bool = false;
8 8
9 constructor(data: Object) { 9 constructor(data) {
10 if (!data.id) { 10 if (!data.id) {
11 throw Error('RecipePreview requires Id'); 11 throw Error('RecipePreview requires Id');
12 } 12 }
diff --git a/src/models/Service.js b/src/models/Service.js
index 484252e7c..958e4b11e 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -1,4 +1,4 @@
1import { computed, observable } from 'mobx'; 1import { computed, observable, autorun } from 'mobx';
2import path from 'path'; 2import path from 'path';
3import normalizeUrl from 'normalize-url'; 3import normalizeUrl from 'normalize-url';
4 4
@@ -18,11 +18,13 @@ export default class Service {
18 18
19 @observable order = 99; 19 @observable order = 99;
20 @observable isEnabled = true; 20 @observable isEnabled = true;
21 @observable isMuted = false;
21 @observable team = ''; 22 @observable team = '';
22 @observable customUrl = ''; 23 @observable customUrl = '';
23 @observable isNotificationEnabled = true; 24 @observable isNotificationEnabled = true;
24 @observable isIndirectMessageBadgeEnabled = true; 25 @observable isIndirectMessageBadgeEnabled = true;
25 @observable customIconUrl = ''; 26 @observable customIconUrl = '';
27 @observable hasCrashed = false;
26 28
27 constructor(data, recipe) { 29 constructor(data, recipe) {
28 if (!data) { 30 if (!data) {
@@ -53,14 +55,25 @@ export default class Service {
53 this.isIndirectMessageBadgeEnabled = data.isIndirectMessageBadgeEnabled !== undefined 55 this.isIndirectMessageBadgeEnabled = data.isIndirectMessageBadgeEnabled !== undefined
54 ? data.isIndirectMessageBadgeEnabled : this.isIndirectMessageBadgeEnabled; 56 ? data.isIndirectMessageBadgeEnabled : this.isIndirectMessageBadgeEnabled;
55 57
58 this.isMuted = data.isMuted !== undefined ? data.isMuted : this.isMuted;
59
56 this.recipe = recipe; 60 this.recipe = recipe;
61
62 autorun(() => {
63 if (!this.isEnabled) {
64 this.webview = null;
65 this.isAttached = false;
66 this.unreadDirectMessageCount = 0;
67 this.unreadIndirectMessageCount = 0;
68 }
69 });
57 } 70 }
58 71
59 @computed get url() { 72 @computed get url() {
60 if (this.recipe.hasCustomUrl && this.customUrl) { 73 if (this.recipe.hasCustomUrl && this.customUrl) {
61 let url; 74 let url;
62 try { 75 try {
63 url = normalizeUrl(this.customUrl); 76 url = normalizeUrl(this.customUrl, { stripWWW: false });
64 } catch (err) { 77 } catch (err) {
65 console.error(`Service (${this.recipe.name}): '${this.customUrl}' is not a valid Url.`); 78 console.error(`Service (${this.recipe.name}): '${this.customUrl}' is not a valid Url.`);
66 } 79 }
@@ -117,6 +130,14 @@ export default class Service {
117 frameName, 130 frameName,
118 options, 131 options,
119 })); 132 }));
133
134 this.webview.addEventListener('did-start-loading', () => {
135 this.hasCrashed = false;
136 });
137
138 this.webview.addEventListener('crashed', () => {
139 this.hasCrashed = true;
140 });
120 } 141 }
121 142
122 initializeWebViewListener() { 143 initializeWebViewListener() {
diff --git a/src/models/Settings.js b/src/models/Settings.js
new file mode 100644
index 000000000..3b352f9aa
--- /dev/null
+++ b/src/models/Settings.js
@@ -0,0 +1,19 @@
1import { observable } from 'mobx';
2import { DEFAULT_APP_SETTINGS } from '../config';
3
4export default class Settings {
5 @observable autoLaunchOnStart = DEFAULT_APP_SETTINGS.autoLaunchOnStart;
6 @observable autoLaunchInBackground = DEFAULT_APP_SETTINGS.autoLaunchInBackground;
7 @observable runInBackground = DEFAULT_APP_SETTINGS.runInBackground;
8 @observable enableSystemTray = DEFAULT_APP_SETTINGS.enableSystemTray;
9 @observable minimizeToSystemTray = DEFAULT_APP_SETTINGS.minimizeToSystemTray;
10 @observable showDisabledServices = DEFAULT_APP_SETTINGS.showDisabledServices;
11 @observable enableSpellchecking = DEFAULT_APP_SETTINGS.enableSpellchecking;
12 @observable locale = DEFAULT_APP_SETTINGS.locale;
13 @observable beta = DEFAULT_APP_SETTINGS.beta;
14 @observable isAppMuted = DEFAULT_APP_SETTINGS.isAppMuted;
15
16 constructor(data) {
17 Object.assign(this, data);
18 }
19}
diff --git a/src/models/User.js b/src/models/User.js
index 94b579928..e2d2fc0c8 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -16,7 +16,7 @@ export default class User {
16 @observable isDonor = false; 16 @observable isDonor = false;
17 @observable isMiner = false; 17 @observable isMiner = false;
18 18
19 constructor(data: Object) { 19 constructor(data) {
20 if (!data.id) { 20 if (!data.id) {
21 throw Error('User requires Id'); 21 throw Error('User requires Id');
22 } 22 }