import app from '../../forum/app'; import ComposerBody from './ComposerBody'; import Button from '../../common/components/Button'; import Link from '../../common/components/Link'; import icon from '../../common/helpers/icon'; import extractText from '../../common/utils/extractText'; function minimizeComposerIfFullScreen(e) { if (app.composer.isFullScreen()) { app.composer.minimize(); e.stopPropagation(); } } /** * The `ReplyComposer` component displays the composer content for replying to a * discussion. * * ### Attrs * * - All of the attrs of ComposerBody * - `discussion` */ export default class ReplyComposer extends ComposerBody { static initAttrs(attrs) { super.initAttrs(attrs); attrs.placeholder = attrs.placeholder || extractText(app.translator.trans('core.forum.composer_reply.body_placeholder')); attrs.submitLabel = attrs.submitLabel || app.translator.trans('core.forum.composer_reply.submit_button'); attrs.confirmExit = attrs.confirmExit || extractText(app.translator.trans('core.forum.composer_reply.discard_confirmation')); } headerItems() { const items = super.headerItems(); const discussion = this.attrs.discussion; items.add( 'title',

{icon('fas fa-reply')}{' '} {discussion.title()}

); return items; } /** * Jump to the preview when triggered by the text editor. */ jumpToPreview(e) { minimizeComposerIfFullScreen(e); m.route.set(app.route.discussion(this.attrs.discussion, 'reply')); } /** * Get the data to submit to the server when the reply is saved. * * @return {Object} */ data() { return { content: this.composer.fields.content(), relationships: { discussion: this.attrs.discussion }, }; } onsubmit() { const discussion = this.attrs.discussion; this.loading = true; m.redraw(); const data = this.data(); app.store .createRecord('posts') .save(data) .then((post) => { // If we're currently viewing the discussion which this reply was made // in, then we can update the post stream and scroll to the post. if (app.viewingDiscussion(discussion)) { const stream = app.current.get('stream'); stream.update().then(() => stream.goToNumber(post.number())); } else { // Otherwise, we'll create an alert message to inform the user that // their reply has been posted, containing a button which will // transition to their new post when clicked. let alert; const viewButton = Button.component( { className: 'Button Button--link', onclick: () => { m.route.set(app.route.post(post)); app.alerts.dismiss(alert); }, }, app.translator.trans('core.forum.composer_reply.view_button') ); alert = app.alerts.show( { type: 'success', controls: [viewButton], }, app.translator.trans('core.forum.composer_reply.posted_message') ); } this.composer.hide(); }, this.loaded.bind(this)); } }