debian-mirror-gitlab/app/assets/javascripts/merge_conflicts/store/actions.js
2021-04-17 20:07:23 +05:30

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 });
};