in app/assets/javascripts/notes/store/legacy_notes/actions.js [469:594]
export function saveNote(noteData) {
// For MR discussuions we need to post as `note[note]` and issue we use `note.note`.
// For batch comments, we use draft_note
const note = noteData.data.draft_note || noteData.data['note[note]'] || noteData.data.note.note;
let placeholderText = note;
const hasQuickActions = utils.hasQuickActions(placeholderText);
const replyId = noteData.data.in_reply_to_discussion_id;
let methodToDispatch;
const postData = { ...noteData };
if (postData.isDraft === true) {
methodToDispatch = replyId
? useBatchComments().addDraftToDiscussion
: useBatchComments().createNewDraft;
if (!postData.draft_note && noteData.note) {
postData.draft_note = postData.note;
delete postData.note;
}
} else {
methodToDispatch = replyId ? this.replyToDiscussion : this.createNewNote;
}
this[types.REMOVE_PLACEHOLDER_NOTES](); // remove previous placeholders
if (hasQuickActions) {
placeholderText = utils.stripQuickActions(placeholderText);
}
if (placeholderText.length) {
this[types.SHOW_PLACEHOLDER_NOTE]({
id: uuids()[0],
noteBody: placeholderText,
replyId,
});
}
if (hasQuickActions) {
this[types.SHOW_PLACEHOLDER_NOTE]({
id: uuids()[0],
isSystemNote: true,
noteBody: utils.getQuickActionText(note),
replyId,
});
}
const processQuickActions = (res) => {
const { quick_actions_status: { messages = null, command_names: commandNames = [] } = {} } =
res;
if (commandNames?.indexOf('submit_review') >= 0) {
useBatchComments().clearDrafts();
}
/*
The following reply means that quick actions have been successfully applied:
{"commands_changes":{},"valid":false,"errors":{},"quick_actions_status":{"messages":["Commands applied"],"command_names":["due"],"commands_only":true}}
*/
if (hasQuickActions && messages) {
// synchronizing the quick action with the sidebar widget
// this is a temporary solution until we have confidentiality real-time updates
if (
confidentialWidget.setConfidentiality &&
messages.some((m) => m.includes('Made this issue confidential'))
) {
confidentialWidget.setConfidentiality();
}
$('.js-gfm-input').trigger('clear-commands-cache.atwho');
createAlert({
message: messages || __('Commands applied'),
variant: VARIANT_INFO,
parent: noteData.flashContainer,
});
}
return res;
};
const processEmojiAward = (res) => {
const { commands_changes: commandsChanges } = res;
const { emoji_award: emojiAward } = commandsChanges || {};
if (!emojiAward) {
return res;
}
const votesBlock = $('.js-awards-block').eq(0);
return loadAwardsHandler()
.then((awardsHandler) => {
awardsHandler.addAwardToEmojiBar(votesBlock, emojiAward);
awardsHandler.scrollToAwards();
})
.catch(() => {
createAlert({
message: __('Something went wrong while adding your award. Please try again.'),
parent: noteData.flashContainer,
});
})
.then(() => res);
};
const processTimeTracking = (res) => {
const { commands_changes: commandsChanges } = res;
const { spend_time: spendTime, time_estimate: timeEstimate } = commandsChanges || {};
if (spendTime != null || timeEstimate != null) {
sidebarTimeTrackingEventHub.$emit('timeTrackingUpdated', {
commands_changes: commandsChanges,
});
}
return res;
};
const removePlaceholder = (res) => {
this[types.REMOVE_PLACEHOLDER_NOTES]();
return res;
};
return methodToDispatch(postData)
.then(processQuickActions)
.then(processEmojiAward)
.then(processTimeTracking)
.then(removePlaceholder);
}