120 lines
4 KiB
JavaScript
120 lines
4 KiB
JavaScript
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 });
|
|
};
|