summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/merge_conflicts/store/actions.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/merge_conflicts/store/actions.js')
-rw-r--r--app/assets/javascripts/merge_conflicts/store/actions.js120
1 files changed, 120 insertions, 0 deletions
diff --git a/app/assets/javascripts/merge_conflicts/store/actions.js b/app/assets/javascripts/merge_conflicts/store/actions.js
new file mode 100644
index 00000000000..8036e90c58c
--- /dev/null
+++ b/app/assets/javascripts/merge_conflicts/store/actions.js
@@ -0,0 +1,120 @@
+import Cookies from 'js-cookie';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
+import { INTERACTIVE_RESOLVE_MODE, EDIT_RESOLVE_MODE } from '../constants';
+import { decorateFiles, restoreFileLinesState, markLine } from '../utils';
+import * as types from './mutation_types';
+
+export const fetchConflictsData = async ({ commit, dispatch }, conflictsPath) => {
+ commit(types.SET_LOADING_STATE, true);
+ try {
+ const { data } = await axios.get(conflictsPath);
+ if (data.type === 'error') {
+ commit(types.SET_FAILED_REQUEST, data.message);
+ } else {
+ dispatch('setConflictsData', data);
+ }
+ } catch (e) {
+ commit(types.SET_FAILED_REQUEST);
+ }
+ commit(types.SET_LOADING_STATE, false);
+};
+
+export const setConflictsData = async ({ commit }, data) => {
+ const files = decorateFiles(data.files);
+ commit(types.SET_CONFLICTS_DATA, { ...data, files });
+};
+
+export const submitResolvedConflicts = async ({ commit, getters }, resolveConflictsPath) => {
+ commit(types.SET_SUBMIT_STATE, true);
+ try {
+ const { data } = await axios.post(resolveConflictsPath, getters.getCommitData);
+ window.location.assign(data.redirect_to);
+ } catch (e) {
+ commit(types.SET_SUBMIT_STATE, false);
+ createFlash({ message: __('Failed to save merge conflicts resolutions. Please try again!') });
+ }
+};
+
+export const setLoadingState = ({ commit }, isLoading) => {
+ commit(types.SET_LOADING_STATE, isLoading);
+};
+
+export const setErrorState = ({ commit }, hasError) => {
+ commit(types.SET_ERROR_STATE, hasError);
+};
+
+export const setFailedRequest = ({ commit }, message) => {
+ commit(types.SET_FAILED_REQUEST, message);
+};
+
+export const setViewType = ({ commit }, viewType) => {
+ commit(types.SET_VIEW_TYPE, viewType);
+ Cookies.set('diff_view', viewType);
+};
+
+export const setSubmitState = ({ commit }, isSubmitting) => {
+ commit(types.SET_SUBMIT_STATE, isSubmitting);
+};
+
+export const updateCommitMessage = ({ commit }, commitMessage) => {
+ commit(types.UPDATE_CONFLICTS_DATA, { commitMessage });
+};
+
+export const setFileResolveMode = ({ commit, state, getters }, { file, mode }) => {
+ const index = getters.getFileIndex(file);
+ const updated = { ...state.conflictsData.files[index] };
+ if (mode === INTERACTIVE_RESOLVE_MODE) {
+ updated.showEditor = false;
+ } else if (mode === EDIT_RESOLVE_MODE) {
+ // Restore Interactive mode when switching to Edit mode
+ updated.showEditor = true;
+ updated.loadEditor = true;
+ updated.resolutionData = {};
+
+ const { inlineLines, parallelLines } = restoreFileLinesState(updated);
+ updated.parallelLines = parallelLines;
+ updated.inlineLines = inlineLines;
+ }
+ updated.resolveMode = mode;
+ commit(types.UPDATE_FILE, { file: updated, index });
+};
+
+export const setPromptConfirmationState = (
+ { commit, state, getters },
+ { file, promptDiscardConfirmation },
+) => {
+ const index = getters.getFileIndex(file);
+ const updated = { ...state.conflictsData.files[index], promptDiscardConfirmation };
+ commit(types.UPDATE_FILE, { file: updated, index });
+};
+
+export const handleSelected = ({ commit, state, getters }, { file, line: { id, section } }) => {
+ const index = getters.getFileIndex(file);
+ const updated = { ...state.conflictsData.files[index] };
+ updated.resolutionData = { ...updated.resolutionData, [id]: section };
+
+ updated.inlineLines = file.inlineLines.map((line) => {
+ if (id === line.id && (line.hasConflict || line.isHeader)) {
+ return markLine(line, section);
+ }
+ return line;
+ });
+
+ updated.parallelLines = file.parallelLines.map((lines) => {
+ let left = { ...lines[0] };
+ let right = { ...lines[1] };
+ const hasSameId = right.id === id || left.id === id;
+ const isLeftMatch = left.hasConflict || left.isHeader;
+ const isRightMatch = right.hasConflict || right.isHeader;
+
+ if (hasSameId && (isLeftMatch || isRightMatch)) {
+ left = markLine(left, section);
+ right = markLine(right, section);
+ }
+ return [left, right];
+ });
+
+ commit(types.UPDATE_FILE, { file: updated, index });
+};