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 { popupAjaxError } from "discourse/lib/ajax-error"; import { safariHacksDisabled, isiPad, iOSWithVisualViewport } from "discourse/lib/utilities"; import { computed } from "@ember/object"; const USER_HOMES = { 1: "latest", 2: "categories", 3: "unread", 4: "new", 5: "top" }; const TEXT_SIZES = ["smaller", "normal", "larger", "largest"]; const TITLE_COUNT_MODES = ["notifications", "contextual"]; export default Controller.extend({ @discourseComputed("makeThemeDefault") saveAttrNames(makeDefault) { let attrs = [ "locale", "external_links_in_new_tab", "dynamic_favicon", "enable_quoting", "enable_defer", "automatically_unpin_topics", "allow_private_messages", "homepage_id", "hide_profile_and_presence", "text_size", "title_count_mode" ]; if (makeDefault) { attrs.push("theme_ids"); } return attrs; }, preferencesController: inject("preferences"), @discourseComputed() isiPad() { // TODO: remove this preference checkbox when iOS adoption > 90% // (currently only applies to iOS 12 and below) return isiPad() && !iOSWithVisualViewport(); }, @discourseComputed() disableSafariHacks() { return safariHacksDisabled(); }, @discourseComputed() availableLocales() { return JSON.parse(this.siteSettings.available_locales); }, @discourseComputed textSizes() { return TEXT_SIZES.map(value => { return { name: I18n.t(`user.text_size.${value}`), value }; }); }, homepageId: computed( "model.user_option.homepage_id", "userSelectableHome.[]", function() { return ( this.model.user_option.homepage_id || this.userSelectableHome.firstObject.value ); } ), @discourseComputed titleCountModes() { return TITLE_COUNT_MODES.map(value => { return { name: I18n.t(`user.title_count_mode.${value}`), value }; }); }, @discourseComputed userSelectableThemes() { return listThemes(this.site); }, @discourseComputed("userSelectableThemes") showThemeSelector(themes) { return themes && themes.length > 1; }, @observes("themeId") themeIdChanged() { const id = this.themeId; previewTheme([id]); }, @discourseComputed("model.user_option.theme_ids", "themeId") showThemeSetDefault(userOptionThemes, selectedTheme) { return !userOptionThemes || userOptionThemes[0] !== selectedTheme; }, @discourseComputed("model.user_option.text_size", "textSize") showTextSetDefault(userOptionTextSize, selectedTextSize) { return userOptionTextSize !== selectedTextSize; }, homeChanged() { const siteHome = this.siteSettings.top_menu.split("|")[0].split(",")[0]; const userHome = USER_HOMES[this.get("model.user_option.homepage_id")]; setDefaultHomepage(userHome || siteHome); }, @discourseComputed() userSelectableHome() { let homeValues = {}; Object.keys(USER_HOMES).forEach(newValue => { const newKey = USER_HOMES[newValue]; homeValues[newKey] = newValue; }); let result = []; this.siteSettings.top_menu.split("|").forEach(m => { let id = homeValues[m]; if (id) { result.push({ name: I18n.t(`filters.${m}.title`), value: Number(id) }); } }); return result; }, actions: { save() { this.set("saved", false); const makeThemeDefault = this.makeThemeDefault; if (makeThemeDefault) { this.set("model.user_option.theme_ids", [this.themeId]); } const makeTextSizeDefault = this.makeTextSizeDefault; if (makeTextSizeDefault) { this.set("model.user_option.text_size", this.textSize); } return this.model .save(this.saveAttrNames) .then(() => { this.set("saved", true); if (makeThemeDefault) { setLocalTheme([]); } else { setLocalTheme( [this.themeId], this.get("model.user_option.theme_key_seq") ); } if (makeTextSizeDefault) { this.model.updateTextSizeCookie(null); } else { this.model.updateTextSizeCookie(this.textSize); } this.homeChanged(); if (this.isiPad) { if (safariHacksDisabled() !== this.disableSafariHacks) { Discourse.set("assetVersion", "forceRefresh"); } localStorage.setItem( "safari-hacks-disabled", this.disableSafariHacks.toString() ); } }) .catch(popupAjaxError); }, selectTextSize(newSize) { const classList = document.documentElement.classList; TEXT_SIZES.forEach(name => { const className = `text-size-${name}`; if (newSize === name) { classList.add(className); } else { classList.remove(className); } }); // Force refresh when leaving this screen Discourse.set("assetVersion", "forceRefresh"); this.set("textSize", newSize); } } });