summaryrefslogtreecommitdiffstats
path: root/webapp/plugins/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/plugins/index.js')
-rw-r--r--webapp/plugins/index.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/webapp/plugins/index.js b/webapp/plugins/index.js
new file mode 100644
index 000000000..2e8240cec
--- /dev/null
+++ b/webapp/plugins/index.js
@@ -0,0 +1,51 @@
+// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+// EXPERIMENTAL - SUBJECT TO CHANGE
+
+import store from 'stores/redux_store.jsx';
+import {ActionTypes} from 'utils/constants.jsx';
+import {getSiteURL} from 'utils/url.jsx';
+
+window.plugins = {};
+
+export function registerComponents(components) {
+ store.dispatch({
+ type: ActionTypes.RECEIVED_PLUGIN_COMPONENTS,
+ data: components || {}
+ });
+}
+
+export function initializePlugins() {
+ const pluginJson = window.mm_config.Plugins || '[]';
+
+ let pluginManifests;
+ try {
+ pluginManifests = JSON.parse(pluginJson);
+ } catch (error) {
+ console.error('Invalid plugins JSON: ' + error); //eslint-disable-line no-console
+ return;
+ }
+
+ pluginManifests.forEach((m) => {
+ function onLoad() {
+ // Add the plugin's js to the page
+ const script = document.createElement('script');
+ script.type = 'text/javascript';
+ script.text = this.responseText;
+ document.getElementsByTagName('head')[0].appendChild(script);
+
+ // Initialize the plugin
+ console.log('Registering ' + m.id + ' plugin...'); //eslint-disable-line no-console
+ const plugin = window.plugins[m.id];
+ plugin.initialize(registerComponents, store);
+ console.log('...done'); //eslint-disable-line no-console
+ }
+
+ // Fetch the plugin's bundled js
+ const xhrObj = new XMLHttpRequest();
+ xhrObj.open('GET', getSiteURL() + m.bundle_path, true);
+ xhrObj.addEventListener('load', onLoad);
+ xhrObj.send('');
+ });
+}