diff --git a/app/assets/javascripts/discourse/app/components/modal/change-post-notice.gjs b/app/assets/javascripts/discourse/app/components/modal/change-post-notice.gjs new file mode 100644 index 00000000000..97bef5aaede --- /dev/null +++ b/app/assets/javascripts/discourse/app/components/modal/change-post-notice.gjs @@ -0,0 +1,110 @@ +import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; +import { fn } from "@ember/helper"; +import { on } from "@ember/modifier"; +import { action } from "@ember/object"; +import { service } from "@ember/service"; +import { isEmpty } from "@ember/utils"; +import DButton from "discourse/components/d-button"; +import DModal from "discourse/components/d-modal"; +import DModalCancel from "discourse/components/d-modal-cancel"; +import withEventValue from "discourse/helpers/with-event-value"; +import { i18n } from "discourse-i18n"; + +export default class ChangePostNoticeModal extends Component { + @service currentUser; + @tracked post = this.args.model.post; + @tracked notice = this.args.model.post.notice?.raw ?? ""; + @tracked saving = false; + + resolve = this.args.model.resolve; + reject = this.args.model.reject; + + get disabled() { + return ( + this.saving || + isEmpty(this.notice) || + this.notice === this.post.notice?.raw + ); + } + + @action + saveNotice() { + this.setNotice(this.notice); + } + + @action + deleteNotice() { + this.setNotice(); + } + + @action + setNotice(notice) { + const { resolve, reject } = this; + + this.saving = true; + this.resolve = null; + this.reject = null; + + this.post + .updatePostField("notice", notice) + .then((response) => { + if (notice) { + return response.cooked_notice; + } + }) + .then((cooked) => { + this.post.set( + "notice", + cooked + ? { + type: "custom", + raw: notice, + cooked: cooked.toString(), + } + : null + ); + this.post.set("noticeCreatedByUser", this.currentUser); + }) + .then(resolve, reject) + .finally(() => this.args.closeModal()); + } + +