mutations.js 7.4 KB
Newer Older
F
Felipe Artur 已提交
1
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
2
import { sortTree } from '~/ide/stores/utils';
3 4 5 6 7
import {
  findDiffFile,
  addLineReferences,
  removeMatchLine,
  addContextLines,
8
  prepareDiffData,
9
  isDiscussionApplicableToLine,
10
  generateTreeList,
11
} from './utils';
F
Felipe Artur 已提交
12 13 14
import * as types from './mutation_types';

export default {
15 16 17
  [types.SET_BASE_CONFIG](state, options) {
    const { endpoint, projectPath } = options;
    Object.assign(state, { endpoint, projectPath });
F
Felipe Artur 已提交
18 19 20 21 22 23 24
  },

  [types.SET_LOADING](state, isLoading) {
    Object.assign(state, { isLoading });
  },

  [types.SET_DIFF_DATA](state, data) {
P
Phil Hughes 已提交
25 26
    prepareDiffData(data);
    const { tree, treeEntries } = generateTreeList(data.diff_files);
T
Tim Zallmann 已提交
27

F
Felipe Artur 已提交
28
    Object.assign(state, {
P
Phil Hughes 已提交
29
      ...convertObjectPropsToCamelCase(data),
30 31
      tree: sortTree(tree),
      treeEntries,
T
Tim Zallmann 已提交
32 33 34 35 36 37
    });
  },

  [types.RENDER_FILE](state, file) {
    Object.assign(file, {
      renderIt: true,
F
Felipe Artur 已提交
38 39 40 41 42
    });
  },

  [types.SET_MERGE_REQUEST_DIFFS](state, mergeRequestDiffs) {
    Object.assign(state, {
P
Phil Hughes 已提交
43
      mergeRequestDiffs,
F
Felipe Artur 已提交
44 45 46 47 48 49 50
    });
  },

  [types.SET_DIFF_VIEW_TYPE](state, diffViewType) {
    Object.assign(state, { diffViewType });
  },

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
  [types.TOGGLE_LINE_HAS_FORM](state, { lineCode, fileHash, hasForm }) {
    const diffFile = state.diffFiles.find(f => f.file_hash === fileHash);

    if (!diffFile) return;

    if (diffFile.highlighted_diff_lines) {
      diffFile.highlighted_diff_lines.find(l => l.line_code === lineCode).hasForm = hasForm;
    }

    if (diffFile.parallel_diff_lines) {
      const line = diffFile.parallel_diff_lines.find(l => {
        const { left, right } = l;

        return (left && left.line_code === lineCode) || (right && right.line_code === lineCode);
      });

      if (line.left && line.left.line_code === lineCode) {
        line.left.hasForm = hasForm;
      }
F
Felipe Artur 已提交
70

71 72 73 74
      if (line.right && line.right.line_code === lineCode) {
        line.right.hasForm = hasForm;
      }
    }
F
Felipe Artur 已提交
75 76 77 78 79 80 81 82
  },

  [types.ADD_CONTEXT_LINES](state, options) {
    const { lineNumbers, contextLines, fileHash } = options;
    const { bottom } = options.params;
    const diffFile = findDiffFile(state.diffFiles, fileHash);

    removeMatchLine(diffFile, lineNumbers, bottom);
83 84 85

    const lines = addLineReferences(contextLines, lineNumbers, bottom).map(line => ({
      ...line,
P
Phil Hughes 已提交
86
      line_code: line.line_code || `${fileHash}_${line.old_line}_${line.new_line}`,
87
      discussions: line.discussions || [],
88
      hasForm: false,
89 90
    }));

F
Felipe Artur 已提交
91
    addContextLines({
P
Phil Hughes 已提交
92 93
      inlineLines: diffFile.highlighted_diff_lines,
      parallelLines: diffFile.parallel_diff_lines,
F
Felipe Artur 已提交
94 95 96 97 98 99 100
      contextLines: lines,
      bottom,
      lineNumbers,
    });
  },

  [types.ADD_COLLAPSED_DIFFS](state, { file, data }) {
P
Phil Hughes 已提交
101 102 103
    prepareDiffData(data);
    const [newFileData] = data.diff_files.filter(f => f.file_hash === file.file_hash);
    const selectedFile = state.diffFiles.find(f => f.file_hash === file.file_hash);
104
    Object.assign(selectedFile, { ...newFileData });
F
Felipe Artur 已提交
105 106 107
  },

  [types.EXPAND_ALL_FILES](state) {
F
Filipa Lacerda 已提交
108 109 110 111
    state.diffFiles = state.diffFiles.map(file => ({
      ...file,
      collapsed: false,
    }));
F
Felipe Artur 已提交
112
  },
113

P
Phil Hughes 已提交
114
  [types.SET_LINE_DISCUSSIONS_FOR_FILE](state, { discussion, diffPositionByLineCode }) {
P
Phil Hughes 已提交
115 116
    const { latestDiff } = state;

P
Phil Hughes 已提交
117 118
    const discussionLineCode = discussion.line_code;
    const fileHash = discussion.diff_file.file_hash;
P
Phil Hughes 已提交
119 120
    const lineCheck = line =>
      line.line_code === discussionLineCode &&
P
Phil Hughes 已提交
121 122
      isDiscussionApplicableToLine({
        discussion,
P
Phil Hughes 已提交
123
        diffPosition: diffPositionByLineCode[line.line_code],
P
Phil Hughes 已提交
124 125 126 127
        latestDiff,
      });

    state.diffFiles = state.diffFiles.map(diffFile => {
P
Phil Hughes 已提交
128
      if (diffFile.file_hash === fileHash) {
P
Phil Hughes 已提交
129 130
        const file = { ...diffFile };

P
Phil Hughes 已提交
131 132
        if (file.highlighted_diff_lines) {
          file.highlighted_diff_lines = file.highlighted_diff_lines.map(line => {
133
            if (!line.discussions.some(({ id }) => discussion.id === id) && lineCheck(line)) {
P
Phil Hughes 已提交
134 135 136 137 138 139 140
              return {
                ...line,
                discussions: line.discussions.concat(discussion),
              };
            }

            return line;
141 142
          });
        }
143

P
Phil Hughes 已提交
144 145
        if (file.parallel_diff_lines) {
          file.parallel_diff_lines = file.parallel_diff_lines.map(line => {
P
Phil Hughes 已提交
146 147 148 149 150 151 152
            const left = line.left && lineCheck(line.left);
            const right = line.right && lineCheck(line.right);

            if (left || right) {
              return {
                left: {
                  ...line.left,
153 154 155 156
                  discussions:
                    left && !line.left.discussions.some(({ id }) => id === discussion.id)
                      ? line.left.discussions.concat(discussion)
                      : (line.left && line.left.discussions) || [],
P
Phil Hughes 已提交
157 158 159
                },
                right: {
                  ...line.right,
160 161 162 163
                  discussions:
                    right && !left && !line.right.discussions.some(({ id }) => id === discussion.id)
                      ? line.right.discussions.concat(discussion)
                      : (line.right && line.right.discussions) || [],
P
Phil Hughes 已提交
164 165 166 167 168
                },
              };
            }

            return line;
169 170
          });
        }
P
Phil Hughes 已提交
171

P
Phil Hughes 已提交
172
        if (!file.parallel_diff_lines || !file.highlighted_diff_lines) {
173
          file.discussions = (file.discussions || []).concat(discussion);
P
Phil Hughes 已提交
174 175 176
        }

        return file;
P
Phil Hughes 已提交
177
      }
P
Phil Hughes 已提交
178 179

      return diffFile;
P
Phil Hughes 已提交
180
    });
181 182
  },

183
  [types.REMOVE_LINE_DISCUSSIONS_FOR_FILE](state, { fileHash, lineCode, id }) {
P
Phil Hughes 已提交
184
    const selectedFile = state.diffFiles.find(f => f.file_hash === fileHash);
185
    if (selectedFile) {
P
Phil Hughes 已提交
186 187
      if (selectedFile.parallel_diff_lines) {
        const targetLine = selectedFile.parallel_diff_lines.find(
188
          line =>
P
Phil Hughes 已提交
189 190
            (line.left && line.left.line_code === lineCode) ||
            (line.right && line.right.line_code === lineCode),
191 192
        );
        if (targetLine) {
P
Phil Hughes 已提交
193
          const side = targetLine.left && targetLine.left.line_code === lineCode ? 'left' : 'right';
194 195 196 197 198

          Object.assign(targetLine[side], {
            discussions: [],
          });
        }
199
      }
200

P
Phil Hughes 已提交
201 202 203
      if (selectedFile.highlighted_diff_lines) {
        const targetInlineLine = selectedFile.highlighted_diff_lines.find(
          line => line.line_code === lineCode,
204 205 206 207 208 209 210 211
        );

        if (targetInlineLine) {
          Object.assign(targetInlineLine, {
            discussions: [],
          });
        }
      }
212 213 214 215 216 217

      if (selectedFile.discussions && selectedFile.discussions.length) {
        selectedFile.discussions = selectedFile.discussions.filter(
          discussion => discussion.id !== id,
        );
      }
218
    }
219
  },
220 221 222 223 224 225 226 227 228
  [types.TOGGLE_FOLDER_OPEN](state, path) {
    state.treeEntries[path].opened = !state.treeEntries[path].opened;
  },
  [types.TOGGLE_SHOW_TREE_LIST](state) {
    state.showTreeList = !state.showTreeList;
  },
  [types.UPDATE_CURRENT_DIFF_FILE_ID](state, fileId) {
    state.currentDiffFileId = fileId;
  },
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
  [types.OPEN_DIFF_FILE_COMMENT_FORM](state, formData) {
    state.commentForms.push({
      ...formData,
    });
  },
  [types.UPDATE_DIFF_FILE_COMMENT_FORM](state, formData) {
    const { fileHash } = formData;

    state.commentForms = state.commentForms.map(form => {
      if (form.fileHash === fileHash) {
        return {
          ...formData,
        };
      }

      return form;
    });
  },
  [types.CLOSE_DIFF_FILE_COMMENT_FORM](state, fileHash) {
    state.commentForms = state.commentForms.filter(form => form.fileHash !== fileHash);
  },
250 251 252
  [types.SET_HIGHLIGHTED_ROW](state, lineCode) {
    state.highlightedRow = lineCode;
  },
F
Felipe Artur 已提交
253
};