aboutsummaryrefslogtreecommitdiffstats
path: root/src/webview/lib
diff options
context:
space:
mode:
authorLibravatar Bennett <hello@vantezzen.io>2020-04-12 13:33:11 +0200
committerLibravatar GitHub <noreply@github.com>2020-04-12 12:33:11 +0100
commit9ab996a5f01ef88d72d8d5bb28fea518db8c88e6 (patch)
tree58cdb855c1074ce54d0d669910328d4ebb805d2a /src/webview/lib
parentFix cache clearing not working in Windows 10 (#541) (#544) (diff)
downloadferdium-app-9ab996a5f01ef88d72d8d5bb28fea518db8c88e6.tar.gz
ferdium-app-9ab996a5f01ef88d72d8d5bb28fea518db8c88e6.tar.zst
ferdium-app-9ab996a5f01ef88d72d8d5bb28fea518db8c88e6.zip
Improve user scripts (#559)
* Add template to user.js creation * Add Userscript library * Add internalOpen function * Fix lint * Remove excess line break
Diffstat (limited to 'src/webview/lib')
-rw-r--r--src/webview/lib/Userscript.js132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/webview/lib/Userscript.js b/src/webview/lib/Userscript.js
new file mode 100644
index 000000000..2043d9fff
--- /dev/null
+++ b/src/webview/lib/Userscript.js
@@ -0,0 +1,132 @@
1import { ipcRenderer } from 'electron';
2
3export default class Userscript {
4 // Current ./lib/RecipeWebview instance
5 recipe = null;
6
7 // Current ./recipe.js instance
8 controller = null;
9
10 // Service configuration
11 config = {};
12
13 // Ferdi and service settings
14 settings = {};
15
16 settingsUpdateHandler = null;
17
18 constructor(recipe, controller, config) {
19 this.recipe = recipe;
20 this.controller = controller;
21 this.internal_setSettings(controller.settings);
22 this.config = config;
23 }
24
25 /**
26 * Set internal copy of Ferdi's settings.
27 * This is only used internally and can not be used to change any settings
28 *
29 * @param {*} settings
30 */
31 // eslint-disable-next-line
32 internal_setSettings(settings) {
33 // This is needed to get a clean JS object from the settings itself to provide better accessibility
34 // Otherwise this will be a mobX instance
35 this.settings = JSON.parse(JSON.stringify(settings));
36
37 if (typeof this.settingsUpdateHandler === 'function') {
38 this.settingsUpdateHandler();
39 }
40 }
41
42 /**
43 * Register a settings handler to be executed when the settings change
44 *
45 * @param {function} handler
46 */
47 onSettingsUpdate(handler) {
48 this.settingsUpdateHandler = handler;
49 }
50
51 /**
52 * Set badge count for the current service
53 * @param {*} direct Direct messages
54 * @param {*} indirect Indirect messages
55 */
56 setBadge(direct = 0, indirect = 0) {
57 if (this.recipe && this.recipe.setBadge) {
58 this.recipe.setBadge(direct, indirect);
59 }
60 }
61
62 /**
63 * Inject CSS files into the current page
64 *
65 * @param {...string} files
66 */
67 injectCSSFiles(...files) {
68 if (this.recipe && this.recipe.injectCSS) {
69 this.recipe.injectCSS(...files);
70 }
71 }
72
73 /**
74 * Inject a CSS string into the page
75 *
76 * @param {string} css
77 */
78 injectCSS(css) {
79 const style = document.createElement('style');
80 style.textContent = css;
81 document.head.append(style);
82 }
83
84 /**
85 * Open "Find in Page" popup
86 */
87 openFindInPage() {
88 this.controller.openFindInPage();
89 }
90
91 /**
92 * Set or update value in storage
93 *
94 * @param {*} key
95 * @param {*} value
96 */
97 set(key, value) {
98 window.localStorage.setItem(
99 `ferdi-user-${key}`, JSON.stringify(value),
100 );
101 }
102
103 /**
104 * Get value from storage
105 *
106 * @param {*} key
107 * @return Value of the key
108 */
109 get(key) {
110 return JSON.parse(window.localStorage.getItem(
111 `ferdi-user-${key}`,
112 ));
113 }
114
115 /**
116 * Open a URL in an external browser
117 *
118 * @param {*} url
119 */
120 externalOpen(url) {
121 ipcRenderer.sendToHost('new-window', url);
122 }
123
124 /**
125 * Open a URL in the current service
126 *
127 * @param {*} url
128 */
129 internalOpen(url) {
130 window.location.href = url;
131 }
132}