diff --git a/app/assets/javascripts/discourse/app/pre-initializers/svg-sprite-fontawesome.js b/app/assets/javascripts/discourse/app/initializers/svg-sprite-fontawesome.js similarity index 71% rename from app/assets/javascripts/discourse/app/pre-initializers/svg-sprite-fontawesome.js rename to app/assets/javascripts/discourse/app/initializers/svg-sprite-fontawesome.js index 7547b1769cc..b9351be0665 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/svg-sprite-fontawesome.js +++ b/app/assets/javascripts/discourse/app/initializers/svg-sprite-fontawesome.js @@ -2,10 +2,11 @@ import { loadSprites } from "discourse/lib/svg-sprite-loader"; export default { name: "svg-sprite-fontawesome", - after: "discourse-bootstrap", + after: "export-application-global", initialize(container) { - let session = container.lookup("service:session"); + const session = container.lookup("service:session"); + if (session.svgSpritePath) { loadSprites(session.svgSpritePath, "fontawesome"); } diff --git a/app/assets/javascripts/discourse/app/pre-initializers/theme-errors-handler.js b/app/assets/javascripts/discourse/app/initializers/theme-errors-handler.js similarity index 52% rename from app/assets/javascripts/discourse/app/pre-initializers/theme-errors-handler.js rename to app/assets/javascripts/discourse/app/initializers/theme-errors-handler.js index 4299d09233c..827b26ea0cd 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/theme-errors-handler.js +++ b/app/assets/javascripts/discourse/app/initializers/theme-errors-handler.js @@ -14,7 +14,7 @@ const showingErrors = new Set(); export default { name: "theme-errors-handler", - after: "inject-discourse-objects", + after: "export-application-global", initialize(container) { if (isTesting()) { @@ -23,9 +23,7 @@ export default { this.currentUser = container.lookup("service:current-user"); - getAndClearUnhandledThemeErrors().forEach((e) => { - reportThemeError(this.currentUser, e); - }); + getAndClearUnhandledThemeErrors().forEach((e) => this.reportThemeError(e)); document.addEventListener("discourse-error", this.handleDiscourseError); }, @@ -38,12 +36,65 @@ export default { @bind handleDiscourseError(e) { if (e.detail?.themeId) { - reportThemeError(this.currentUser, e); + this.reportThemeError(e); } else { - reportGenericError(this.currentUser, e); + this.reportGenericError(e); } + e.preventDefault(); // Mark as handled }, + + reportThemeError(e) { + const { themeId, error } = e.detail; + const source = { + type: "theme", + ...getThemeInfo(themeId), + }; + + reportToConsole(error, source); + reportToLogster(source.name, error); + + const message = I18n.t("themes.broken_theme_alert"); + this.displayErrorNotice(this.currentUser, message, source); + }, + + reportGenericError(e) { + const { messageKey, error } = e.detail; + + const message = I18n.t(messageKey); + const source = identifySource(error); + + reportToConsole(error, source); + + if (messageKey && !showingErrors.has(messageKey)) { + showingErrors.add(messageKey); + this.displayErrorNotice(message, source); + } + }, + + displayErrorNotice(message, source) { + if (!this.currentUser?.admin) { + return; + } + + let html = `⚠️ ${message}`; + + if (source && source.type === "theme") { + html += `
${I18n.t("themes.error_caused_by", { + name: escape(source.name), + path: source.path, + })}`; + } + + html += `
${I18n.t( + "themes.only_admins" + )}`; + + const alertDiv = document.createElement("div"); + alertDiv.classList.add("broken-theme-alert"); + alertDiv.innerHTML = html; + document.body.prepend(alertDiv); + }, }; function reportToLogster(name, error) { @@ -59,36 +110,6 @@ function reportToLogster(name, error) { }); } -function reportThemeError(currentUser, e) { - const { themeId, error } = e.detail; - - const source = { - type: "theme", - ...getThemeInfo(themeId), - }; - - reportToConsole(error, source); - reportToLogster(source.name, error); - - const message = I18n.t("themes.broken_theme_alert"); - displayErrorNotice(currentUser, message, source); -} - -function reportGenericError(currentUser, e) { - const { messageKey, error } = e.detail; - - let message = I18n.t(messageKey); - - const source = identifySource(error); - - reportToConsole(error, source); - - if (messageKey && !showingErrors.has(messageKey)) { - showingErrors.add(messageKey); - displayErrorNotice(currentUser, message, source); - } -} - function reportToConsole(error, source) { const prefix = consolePrefix(error, source); if (prefix) { @@ -99,27 +120,3 @@ function reportToConsole(error, source) { console.error(error); } } - -function displayErrorNotice(currentUser, message, source) { - if (!currentUser?.admin) { - return; - } - - let html = `⚠️ ${message}`; - - if (source && source.type === "theme") { - html += `
${I18n.t("themes.error_caused_by", { - name: escape(source.name), - path: source.path, - })}`; - } - - html += `
${I18n.t( - "themes.only_admins" - )}`; - - const alertDiv = document.createElement("div"); - alertDiv.classList.add("broken-theme-alert"); - alertDiv.innerHTML = html; - document.body.prepend(alertDiv); -} diff --git a/app/assets/javascripts/discourse/app/mapping-router.js b/app/assets/javascripts/discourse/app/mapping-router.js index cb000cc1f36..9f372413af3 100644 --- a/app/assets/javascripts/discourse/app/mapping-router.js +++ b/app/assets/javascripts/discourse/app/mapping-router.js @@ -141,14 +141,3 @@ export function mapRoutes() { this.route("unknown", { path: "*path" }); }); } -export function teardownRouter(routerClass) { - routerClass.dslCallbacks.splice(0, routerClass.dslCallbacks.length); -} - -export function registerRouter(registry) { - registry.unregister("router:main"); - let router = mapRoutes(); - - registry.register("router:main", router); - return router; -} diff --git a/app/assets/javascripts/discourse/app/pre-initializers/map-routes.js b/app/assets/javascripts/discourse/app/pre-initializers/map-routes.js index 27b1196a8ca..cf911e834fd 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/map-routes.js +++ b/app/assets/javascripts/discourse/app/pre-initializers/map-routes.js @@ -1,16 +1,15 @@ -import { registerRouter, teardownRouter } from "discourse/mapping-router"; +import { mapRoutes } from "discourse/mapping-router"; export default { name: "map-routes", after: "inject-discourse-objects", - initialize(container, app) { - let routerClass = registerRouter(app); - container.registry.register("router:main", routerClass); - this.routerClass = routerClass; + initialize(_, app) { + this.routerClass = mapRoutes(); + app.register("router:main", this.routerClass); }, teardown() { - teardownRouter(this.routerClass); + this.routerClass.dslCallbacks.length = 0; }, };