diff options
Diffstat (limited to 'src/webview/lib/RecipeWebview.js')
-rw-r--r-- | src/webview/lib/RecipeWebview.js | 48 |
1 files changed, 23 insertions, 25 deletions
diff --git a/src/webview/lib/RecipeWebview.js b/src/webview/lib/RecipeWebview.js index b8fe7dc52..3bb9352f6 100644 --- a/src/webview/lib/RecipeWebview.js +++ b/src/webview/lib/RecipeWebview.js | |||
@@ -1,14 +1,12 @@ | |||
1 | import { ipcRenderer } from 'electron'; | 1 | import { ipcRenderer } from 'electron'; |
2 | import { pathExistsSync, readFile } from 'fs-extra'; | 2 | import { exists, pathExistsSync, readFile } from 'fs-extra'; |
3 | 3 | ||
4 | const debug = require('debug')('Ferdi:Plugin:RecipeWebview'); | 4 | const debug = require('debug')('Ferdi:Plugin:RecipeWebview'); |
5 | 5 | ||
6 | class RecipeWebview { | 6 | class RecipeWebview { |
7 | constructor() { | 7 | constructor(badgeHandler, notificationsHandler) { |
8 | this.countCache = { | 8 | this.badgeHandler = badgeHandler; |
9 | direct: 0, | 9 | this.notificationsHandler = notificationsHandler; |
10 | indirect: 0, | ||
11 | }; | ||
12 | 10 | ||
13 | ipcRenderer.on('poll', () => { | 11 | ipcRenderer.on('poll', () => { |
14 | this.loopFunc(); | 12 | this.loopFunc(); |
@@ -45,24 +43,7 @@ class RecipeWebview { | |||
45 | * me directly to me eg. in a channel | 43 | * me directly to me eg. in a channel |
46 | */ | 44 | */ |
47 | setBadge(direct = 0, indirect = 0) { | 45 | setBadge(direct = 0, indirect = 0) { |
48 | if (this.countCache.direct === direct | 46 | this.badgeHandler.setBadge(direct, indirect); |
49 | && this.countCache.indirect === indirect) return; | ||
50 | |||
51 | // Parse number to integer | ||
52 | // This will correct errors that recipes may introduce, e.g. | ||
53 | // by sending a String instead of an integer | ||
54 | const directInt = parseInt(direct, 10); | ||
55 | const indirectInt = parseInt(indirect, 10); | ||
56 | |||
57 | const count = { | ||
58 | direct: Math.max(directInt, 0), | ||
59 | indirect: Math.max(indirectInt, 0), | ||
60 | }; | ||
61 | |||
62 | ipcRenderer.sendToHost('message-counts', count); | ||
63 | Object.assign(this.countCache, count); | ||
64 | |||
65 | debug('Sending badge count to host', count); | ||
66 | } | 47 | } |
67 | 48 | ||
68 | /** | 49 | /** |
@@ -85,6 +66,23 @@ class RecipeWebview { | |||
85 | }); | 66 | }); |
86 | } | 67 | } |
87 | 68 | ||
69 | injectJSUnsafe(...files) { | ||
70 | Promise.all(files.map(async (file) => { | ||
71 | if (await exists(file)) { | ||
72 | const data = await readFile(file, 'utf8'); | ||
73 | return data; | ||
74 | } | ||
75 | debug('Script not found', file); | ||
76 | return null; | ||
77 | })).then(async (scripts) => { | ||
78 | const scriptsFound = scripts.filter(script => script !== null); | ||
79 | if (scriptsFound.length > 0) { | ||
80 | debug('Inject scripts to main world', scriptsFound); | ||
81 | ipcRenderer.sendToHost('inject-js-unsafe', ...scriptsFound); | ||
82 | } | ||
83 | }); | ||
84 | } | ||
85 | |||
88 | /** | 86 | /** |
89 | * Set a custom handler for turning on and off dark mode | 87 | * Set a custom handler for turning on and off dark mode |
90 | * | 88 | * |
@@ -96,7 +94,7 @@ class RecipeWebview { | |||
96 | 94 | ||
97 | onNotify(fn) { | 95 | onNotify(fn) { |
98 | if (typeof fn === 'function') { | 96 | if (typeof fn === 'function') { |
99 | window.Notification.prototype.onNotify = fn; | 97 | this.notificationsHandler.onNotify = fn; |
100 | } | 98 | } |
101 | } | 99 | } |
102 | 100 | ||