diff --git a/client/src/index.js b/client/src/index.js
index 59015317..47d0519d 100644
--- a/client/src/index.js
+++ b/client/src/index.js
@@ -16,6 +16,7 @@ import { ClientLogger as Logger } from 'common';
class BetterDiscord {
constructor() {
+ window.css = CssEditor;
window.pm = PluginManager;
window.events = Events;
window.wpm = WebpackModules;
diff --git a/client/src/modules/contentmanager.js b/client/src/modules/contentmanager.js
index e631ad7e..d409e76e 100644
--- a/client/src/modules/contentmanager.js
+++ b/client/src/modules/contentmanager.js
@@ -16,6 +16,10 @@ import { Error } from 'structs';
export default class {
+ static get errors() {
+ return this._errors || (this._errors = []);
+ }
+
static get localContent() {
return this._localContent ? this._localContent : (this._localContent = []);
}
@@ -33,16 +37,26 @@ export default class {
try {
await this.preloadContent(dir);
} catch (err) {
- //We don't want every plugin/theme to fail loading when one does
- /*Events.emit('bd-error', {
- header: `${this.moduleName} - Failed to load plugin: ${dir}`,
- text: err.message,
- type: 'err'
- });*/
+ this.errors.push(new Error({
+ module: this.moduleName,
+ message: `Failed to load ${dir}`,
+ err
+ }));
+
Logger.err(this.moduleName, err);
}
}
+ if (this.errors.length) {
+ Events.emit('bd-error', {
+ header: `${this.moduleName} - one or more ${this.contentType}(s) failed to load`,
+ module: this.moduleName,
+ type: 'err',
+ content: this.errors
+ });
+ }
+ this._errors = [];
+
return this.localContent;
} catch (err) {
throw err;
diff --git a/client/src/modules/pluginmanager.js b/client/src/modules/pluginmanager.js
index dfcd70a5..4e7a7cd9 100644
--- a/client/src/modules/pluginmanager.js
+++ b/client/src/modules/pluginmanager.js
@@ -19,6 +19,10 @@ export default class extends ContentManager {
return this.localContent;
}
+ static get contentType() {
+ return 'plugin';
+ }
+
static get moduleName() {
return 'PluginManager';
}
diff --git a/client/src/structs/error.js b/client/src/structs/error.js
index 21642a89..df6a8c16 100644
--- a/client/src/structs/error.js
+++ b/client/src/structs/error.js
@@ -12,6 +12,7 @@ export class Error {
constructor(args) {
this.args = args;
+ this.showStack = false; // For error modal
}
get module() {
@@ -26,4 +27,12 @@ export class Error {
return this.args.err;
}
+ get stackTrace() {
+ return this.err.stack;
+ }
+
+ get _type() {
+ return 'err';
+ }
+
}
diff --git a/client/src/styles/partials/generic/modals.scss b/client/src/styles/partials/generic/modals.scss
index eac7f0dc..4fa762ca 100644
--- a/client/src/styles/partials/generic/modals.scss
+++ b/client/src/styles/partials/generic/modals.scss
@@ -197,4 +197,69 @@
}
}
}
-}
\ No newline at end of file
+}
+
+.bd-modal-error .bd-modal-error-title {
+ padding: 5px;
+ background: rgba(0,0,0,.3);
+ border-radius: 3px 3px 0 0;
+}
+
+.bd-modal-error {
+ margin-top: 5px;
+
+ .bd-scroller-wrap {
+ background: rgba(0,0,0,.2);
+
+ .bd-scroller {
+ overflow-x: auto;
+ padding: 0;
+
+ &::-webkit-scrollbar-corner {
+ background: transparent;
+ }
+ }
+ }
+}
+
+.bd-modal-error .bd-scroller-wrap {
+ opacity: 0;
+}
+
+.bd-modal-error.bd-open {
+ .bd-modal-error-body {
+ transform: scaleY(1) translateY(0%);
+ margin-top: 0%;
+ opacity: 1;
+
+ span {
+ font-weight: 700;
+ }
+ }
+ .bd-scroller-wrap {
+ opacity: 1;
+ }
+}
+
+.bd-modal-error .bd-modal-error-body {
+ white-space: pre-wrap;
+ font-size: 12px;
+ font-family: 'Consolas';
+ padding: 0 5px;
+ border-radius: 3px;
+ max-height: 100px;
+ width: auto;
+ transition: transform 0.2s ease, margin-top 0.2s ease, opacity 0.2s ease;
+ transform: scaleY(0) translateY(0%);
+ margin-top: -50%;
+ opacity: 0;
+}
+
+.bd-modal-titlelink {
+ cursor: pointer;
+ color: $colbdblue;
+ &:hover {
+ text-decoration: underline;
+ color: lighten($colbdblue, 5%);
+ }
+}
diff --git a/client/src/ui/components/bd/BdModals.vue b/client/src/ui/components/bd/BdModals.vue
index e31c4e71..61e7995f 100644
--- a/client/src/ui/components/bd/BdModals.vue
+++ b/client/src/ui/components/bd/BdModals.vue
@@ -19,7 +19,9 @@
:class="[{'bd-err': modal.type && modal.type === 'err'}, {'bd-modal-out': modal.closing}]">