import { deprecatedCreateFlash as flash } from '~/flash'; import { __ } from '~/locale'; import { scrollToElement } from '~/lib/utils/common_utils'; import service from '../../../services/drafts_service'; import * as types from './mutation_types'; import { CHANGES_TAB, DISCUSSION_TAB, SHOW_TAB } from '../../../constants'; export const saveDraft = ({ dispatch }, draft) => dispatch('saveNote', { ...draft, isDraft: true }, { root: true }); export const addDraftToDiscussion = ({ commit }, { endpoint, data }) => service .addDraftToDiscussion(endpoint, data) .then(res => res.data) .then(res => { commit(types.ADD_NEW_DRAFT, res); return res; }) .catch(() => { flash(__('An error occurred adding a draft to the thread.')); }); export const createNewDraft = ({ commit }, { endpoint, data }) => service .createNewDraft(endpoint, data) .then(res => res.data) .then(res => { commit(types.ADD_NEW_DRAFT, res); return res; }) .catch(() => { flash(__('An error occurred adding a new draft.')); }); export const deleteDraft = ({ commit, getters }, draft) => service .deleteDraft(getters.getNotesData.draftsPath, draft.id) .then(() => { commit(types.DELETE_DRAFT, draft.id); }) .catch(() => flash(__('An error occurred while deleting the comment'))); export const fetchDrafts = ({ commit, getters }) => service .fetchDrafts(getters.getNotesData.draftsPath) .then(res => res.data) .then(data => commit(types.SET_BATCH_COMMENTS_DRAFTS, data)) .catch(() => flash(__('An error occurred while fetching pending comments'))); export const publishSingleDraft = ({ commit, dispatch, getters }, draftId) => { commit(types.REQUEST_PUBLISH_DRAFT, draftId); service .publishDraft(getters.getNotesData.draftsPublishPath, draftId) .then(() => dispatch('updateDiscussionsAfterPublish')) .then(() => commit(types.RECEIVE_PUBLISH_DRAFT_SUCCESS, draftId)) .catch(() => commit(types.RECEIVE_PUBLISH_DRAFT_ERROR, draftId)); }; export const publishReview = ({ commit, dispatch, getters }) => { commit(types.REQUEST_PUBLISH_REVIEW); return service .publish(getters.getNotesData.draftsPublishPath) .then(() => dispatch('updateDiscussionsAfterPublish')) .then(() => commit(types.RECEIVE_PUBLISH_REVIEW_SUCCESS)) .catch(() => commit(types.RECEIVE_PUBLISH_REVIEW_ERROR)); }; export const updateDiscussionsAfterPublish = ({ dispatch, getters, rootGetters }) => dispatch('fetchDiscussions', { path: getters.getNotesData.discussionsPath }, { root: true }).then( () => dispatch('diffs/assignDiscussionsToDiff', rootGetters.discussionsStructuredByLineCode, { root: true, }), ); export const updateDraft = ( { commit, getters }, { note, noteText, resolveDiscussion, position, callback }, ) => service .update(getters.getNotesData.draftsPath, { draftId: note.id, note: noteText, resolveDiscussion, position: JSON.stringify(position), }) .then(res => res.data) .then(data => commit(types.RECEIVE_DRAFT_UPDATE_SUCCESS, data)) .then(callback) .catch(() => flash(__('An error occurred while updating the comment'))); export const scrollToDraft = ({ dispatch, rootGetters }, draft) => { const discussion = draft.discussion_id && rootGetters.getDiscussion(draft.discussion_id); const tab = draft.file_hash || (discussion && discussion.diff_discussion) ? CHANGES_TAB : SHOW_TAB; const tabEl = tab === CHANGES_TAB ? CHANGES_TAB : DISCUSSION_TAB; const draftID = `note_${draft.id}`; const el = document.querySelector(`#${tabEl} #${draftID}`); window.location.hash = draftID; if (window.mrTabs.currentAction !== tab) { window.mrTabs.tabShown(tab); } if (discussion) { dispatch('expandDiscussion', { discussionId: discussion.id }, { root: true }); } if (el) { setTimeout(() => scrollToElement(el.closest('.draft-note-component'))); } }; export const expandAllDiscussions = ({ dispatch, state }) => state.drafts .filter(draft => draft.discussion_id) .forEach(draft => { dispatch('expandDiscussion', { discussionId: draft.discussion_id }, { root: true }); }); export const toggleResolveDiscussion = ({ commit }, draftId) => { commit(types.TOGGLE_RESOLVE_DISCUSSION, draftId); };