diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/interface.js b/app/assets/javascripts/discourse/app/controllers/preferences/interface.js index 1ad85b7d7b..2fcc5781c3 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/interface.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/interface.js @@ -2,13 +2,10 @@ import I18n from "I18n"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { setDefaultHomepage } from "discourse/lib/utilities"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { - listThemes, - previewTheme, - setLocalTheme -} from "discourse/lib/theme-selector"; +import discourseComputed from "discourse-common/utils/decorators"; +import { listThemes, setLocalTheme } from "discourse/lib/theme-selector"; import { popupAjaxError } from "discourse/lib/ajax-error"; +import pageReloader from "discourse/helpers/page-reloader"; import { safariHacksDisabled, isiPad, @@ -28,6 +25,9 @@ const TEXT_SIZES = ["smaller", "normal", "larger", "largest"]; const TITLE_COUNT_MODES = ["notifications", "contextual"]; export default Controller.extend({ + currentThemeId: -1, + preferencesController: inject("preferences"), + @discourseComputed("makeThemeDefault") saveAttrNames(makeDefault) { let attrs = [ @@ -51,8 +51,6 @@ export default Controller.extend({ return attrs; }, - preferencesController: inject("preferences"), - @discourseComputed() isiPad() { // TODO: remove this preference checkbox when iOS adoption > 90% @@ -105,10 +103,14 @@ export default Controller.extend({ return themes && themes.length > 1; }, - @observes("themeId") - themeIdChanged() { - const id = this.themeId; - previewTheme([id]); + @discourseComputed("themeId") + themeIdChanged(themeId) { + if (this.currentThemeId === -1) { + this.set("currentThemeId", themeId); + return false; + } else { + return this.currentThemeId !== themeId; + } }, @discourseComputed("model.user_option.theme_ids", "themeId") @@ -189,6 +191,10 @@ export default Controller.extend({ this.disableSafariHacks.toString() ); } + + if (this.themeId !== this.currentThemeId) { + pageReloader.reload(); + } }) .catch(popupAjaxError); }, diff --git a/app/assets/javascripts/discourse/app/helpers/page-reloader.js b/app/assets/javascripts/discourse/app/helpers/page-reloader.js new file mode 100644 index 0000000000..6429be3a3c --- /dev/null +++ b/app/assets/javascripts/discourse/app/helpers/page-reloader.js @@ -0,0 +1,10 @@ +import EmberObject from "@ember/object"; +import Ember from "ember"; + +export default EmberObject.create({ + reload: function() { + if (!Ember.testing) { + location.reload(); + } + } +}); diff --git a/app/assets/javascripts/discourse/app/lib/theme-selector.js b/app/assets/javascripts/discourse/app/lib/theme-selector.js index 9d293fe312..2eb4912c9c 100644 --- a/app/assets/javascripts/discourse/app/lib/theme-selector.js +++ b/app/assets/javascripts/discourse/app/lib/theme-selector.js @@ -1,5 +1,4 @@ import I18n from "I18n"; -import { ajax } from "discourse/lib/ajax"; import deprecated from "discourse-common/lib/deprecated"; const keySelector = "meta[name=discourse_theme_ids]"; @@ -44,66 +43,6 @@ export function setLocalTheme(ids, themeSeq) { } } -export function refreshCSS(node, hash, newHref) { - let $orig = $(node); - - if ($orig.data("reloading")) { - clearTimeout($orig.data("timeout")); - $orig.data("copy").remove(); - } - - if (!$orig.data("orig")) { - $orig.data("orig", node.href); - } - - $orig.data("reloading", true); - - const orig = $(node).data("orig"); - - let reloaded = $orig.clone(true); - if (hash) { - reloaded[0].href = - orig + (orig.indexOf("?") >= 0 ? "&hash=" : "?hash=") + hash; - } else { - reloaded[0].href = newHref; - } - - $orig.after(reloaded); - - let timeout = setTimeout(() => { - $orig.remove(); - reloaded.data("reloading", false); - }, 2000); - - $orig.data("timeout", timeout); - $orig.data("copy", reloaded); -} - -export function previewTheme(ids = []) { - ids = ids.reject(id => !id); - if (!ids.includes(currentThemeId())) { - Discourse.set("assetVersion", "forceRefresh"); - - ajax(`/themes/assets/${ids.length > 0 ? ids.join("-") : "default"}`).then( - results => { - const elem = _.first($(keySelector)); - if (elem) { - elem.content = ids.join(","); - } - - results.themes.forEach(theme => { - const node = $( - `link[rel=stylesheet][data-target=${theme.target}]` - )[0]; - if (node) { - refreshCSS(node, null, theme.new_href); - } - }); - } - ); - } -} - export function listThemes(site) { let themes = site.get("user_themes"); diff --git a/app/assets/javascripts/discourse/app/templates/preferences/interface.hbs b/app/assets/javascripts/discourse/app/templates/preferences/interface.hbs index 45607c8cb7..4f1f13c614 100644 --- a/app/assets/javascripts/discourse/app/templates/preferences/interface.hbs +++ b/app/assets/javascripts/discourse/app/templates/preferences/interface.hbs @@ -5,9 +5,11 @@ {{combo-box content=userSelectableThemes value=themeId - onChange=(action (mut themeId)) }} + {{#if themeIdChanged}} +
{{i18n "user.save_to_change_theme" save_text=(i18n "save") }}
+ {{/if}} {{#if showThemeSetDefault}}