import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; import { action } from "@ember/object"; import { isEmpty } from "@ember/utils"; import { ajax } from "discourse/lib/ajax"; import { extractError } from "discourse/lib/ajax-error"; import I18n from "discourse-i18n"; const THEME_FIELD_VARIABLE_TYPE_IDS = [2, 3, 4]; const SCSS_VARIABLE_NAMES = [ // common/foundation/colors.scss "primary", "secondary", "tertiary", "quaternary", "header_background", "header_primary", "highlight", "danger", "success", "love", // common/foundation/math.scss "E", "PI", "LN2", "SQRT2", // common/foundation/variables.scss "small-width", "medium-width", "large-width", "google", "instagram", "facebook", "cas", "twitter", "github", "base-font-size", "base-line-height", "base-font-family", "primary-low", "primary-medium", "secondary-low", "secondary-medium", "tertiary-low", "quaternary-low", "highlight-low", "highlight-medium", "danger-low", "danger-medium", "success-low", "love-low", ]; export default class ThemeUploadAdd extends Component { @tracked name; @tracked fileSelected = false; @tracked flash; uploadUrl = this.args.model.uploadUrl || "/admin/themes/upload_asset"; get disabled() { return this.errorMessage && this.fileSelected; } get errorMessage() { if (!this.name) { return; } else if (!this.name.match(/^[a-z_][a-z0-9_-]*$/i)) { return I18n.t("admin.customize.theme.variable_name_error.invalid_syntax"); } else if (SCSS_VARIABLE_NAMES.includes(name.toLowerCase())) { return I18n.t("admin.customize.theme.variable_name_error.no_overwrite"); } else if ( this.args.model.themeFields.some( (tf) => THEME_FIELD_VARIABLE_TYPE_IDS.includes(tf.type_id) && this.name === tf.name ) ) { return I18n.t("admin.customize.theme.variable_name_error.must_be_unique"); } } @action updateName(e) { if (isEmpty(this.name)) { this.name = e.target.files[0].name.split(".")[0]; } this.fileSelected = e.target.files[0]; } @action async upload() { const file = document.getElementById("file-input").files[0]; const options = { type: "POST", processData: false, contentType: false, data: new FormData(), }; options.data.append("file", file); try { const result = await ajax(this.uploadUrl, options); const upload = { upload_id: result.upload_id, name: this.name, original_filename: file.name, }; this.args.model.addUpload(upload); this.args.closeModal(); } catch (e) { this.flash = extractError(e); } } }