mutations.js 9.53 KB
Newer Older
Felipe Artur's avatar
Felipe Artur committed
1
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
2 3 4 5 6
import {
  findDiffFile,
  addLineReferences,
  removeMatchLine,
  addContextLines,
7
  prepareDiffData,
8
  isDiscussionApplicableToLine,
9
} from './utils';
Felipe Artur's avatar
Felipe Artur committed
10 11 12
import * as types from './mutation_types';

export default {
13
  [types.SET_BASE_CONFIG](state, options) {
14 15
    const { endpoint, projectPath, dismissEndpoint, showSuggestPopover } = options;
    Object.assign(state, { endpoint, projectPath, dismissEndpoint, showSuggestPopover });
Felipe Artur's avatar
Felipe Artur committed
16 17 18 19 20 21 22
  },

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

  [types.SET_DIFF_DATA](state, data) {
23
    prepareDiffData(data);
24

Felipe Artur's avatar
Felipe Artur committed
25
    Object.assign(state, {
26
      ...convertObjectPropsToCamelCase(data),
27 28 29 30 31 32
    });
  },

  [types.RENDER_FILE](state, file) {
    Object.assign(file, {
      renderIt: true,
Felipe Artur's avatar
Felipe Artur committed
33 34 35 36 37
    });
  },

  [types.SET_MERGE_REQUEST_DIFFS](state, mergeRequestDiffs) {
    Object.assign(state, {
38
      mergeRequestDiffs,
Felipe Artur's avatar
Felipe Artur committed
39 40 41 42 43 44 45
    });
  },

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

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
  [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;
      }
Felipe Artur's avatar
Felipe Artur committed
65

66 67 68 69
      if (line.right && line.right.line_code === lineCode) {
        line.right.hasForm = hasForm;
      }
    }
Felipe Artur's avatar
Felipe Artur committed
70 71 72 73 74 75 76 77
  },

  [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);
78 79 80

    const lines = addLineReferences(contextLines, lineNumbers, bottom).map(line => ({
      ...line,
81
      line_code: line.line_code || `${fileHash}_${line.old_line}_${line.new_line}`,
82
      discussions: line.discussions || [],
83
      hasForm: false,
84 85
    }));

Felipe Artur's avatar
Felipe Artur committed
86
    addContextLines({
87 88
      inlineLines: diffFile.highlighted_diff_lines,
      parallelLines: diffFile.parallel_diff_lines,
Felipe Artur's avatar
Felipe Artur committed
89 90 91 92 93 94 95
      contextLines: lines,
      bottom,
      lineNumbers,
    });
  },

  [types.ADD_COLLAPSED_DIFFS](state, { file, data }) {
96 97 98
    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);
99
    Object.assign(selectedFile, { ...newFileData });
Felipe Artur's avatar
Felipe Artur committed
100 101 102
  },

  [types.EXPAND_ALL_FILES](state) {
103 104
    state.diffFiles = state.diffFiles.map(file => ({
      ...file,
105 106 107 108
      viewer: {
        ...file.viewer,
        collapsed: false,
      },
109
    }));
Felipe Artur's avatar
Felipe Artur committed
110
  },
111

112
  [types.SET_LINE_DISCUSSIONS_FOR_FILE](state, { discussion, diffPositionByLineCode }) {
Phil Hughes's avatar
Phil Hughes committed
113 114
    const { latestDiff } = state;

115 116
    const discussionLineCode = discussion.line_code;
    const fileHash = discussion.diff_file.file_hash;
117 118
    const lineCheck = line =>
      line.line_code === discussionLineCode &&
119 120
      isDiscussionApplicableToLine({
        discussion,
121
        diffPosition: diffPositionByLineCode[line.line_code],
122 123
        latestDiff,
      });
124 125 126 127 128 129 130 131
    const mapDiscussions = (line, extraCheck = () => true) => ({
      ...line,
      discussions: extraCheck()
        ? line.discussions
            .filter(() => !line.discussions.some(({ id }) => discussion.id === id))
            .concat(lineCheck(line) ? discussion : line.discussions)
        : [],
    });
132 133

    state.diffFiles = state.diffFiles.map(diffFile => {
134
      if (diffFile.file_hash === fileHash) {
135 136
        const file = { ...diffFile };

137
        if (file.highlighted_diff_lines) {
138
          file.highlighted_diff_lines = file.highlighted_diff_lines.map(line =>
139
            lineCheck(line) ? mapDiscussions(line) : line,
140
          );
141
        }
142

143 144
        if (file.parallel_diff_lines) {
          file.parallel_diff_lines = file.parallel_diff_lines.map(line => {
145 146 147 148 149
            const left = line.left && lineCheck(line.left);
            const right = line.right && lineCheck(line.right);

            if (left || right) {
              return {
150
                ...line,
151 152
                left: line.left ? mapDiscussions(line.left) : null,
                right: line.right ? mapDiscussions(line.right, () => !left) : null,
153 154 155 156
              };
            }

            return line;
157 158
          });
        }
Phil Hughes's avatar
Phil Hughes committed
159

160
        if (!file.parallel_diff_lines || !file.highlighted_diff_lines) {
161 162 163
          file.discussions = (file.discussions || [])
            .filter(d => d.id !== discussion.id)
            .concat(discussion);
164 165 166
        }

        return file;
Phil Hughes's avatar
Phil Hughes committed
167
      }
168 169

      return diffFile;
Phil Hughes's avatar
Phil Hughes committed
170
    });
171 172
  },

173
  [types.REMOVE_LINE_DISCUSSIONS_FOR_FILE](state, { fileHash, lineCode }) {
174
    const selectedFile = state.diffFiles.find(f => f.file_hash === fileHash);
175
    if (selectedFile) {
176 177
      if (selectedFile.parallel_diff_lines) {
        const targetLine = selectedFile.parallel_diff_lines.find(
178
          line =>
179 180
            (line.left && line.left.line_code === lineCode) ||
            (line.right && line.right.line_code === lineCode),
181 182
        );
        if (targetLine) {
183
          const side = targetLine.left && targetLine.left.line_code === lineCode ? 'left' : 'right';
184 185

          Object.assign(targetLine[side], {
186
            discussions: targetLine[side].discussions.filter(discussion => discussion.notes.length),
187 188
          });
        }
189
      }
190

191 192 193
      if (selectedFile.highlighted_diff_lines) {
        const targetInlineLine = selectedFile.highlighted_diff_lines.find(
          line => line.line_code === lineCode,
194 195 196 197
        );

        if (targetInlineLine) {
          Object.assign(targetInlineLine, {
198
            discussions: targetInlineLine.discussions.filter(discussion => discussion.notes.length),
199 200 201
          });
        }
      }
202 203 204

      if (selectedFile.discussions && selectedFile.discussions.length) {
        selectedFile.discussions = selectedFile.discussions.filter(
205
          discussion => discussion.notes.length,
206 207
        );
      }
208
    }
209
  },
210 211 212 213 214 215 216 217 218
  [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;
  },
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
  [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);
  },
240 241 242
  [types.SET_HIGHLIGHTED_ROW](state, lineCode) {
    state.highlightedRow = lineCode;
  },
243 244 245 246
  [types.SET_TREE_DATA](state, { treeEntries, tree }) {
    state.treeEntries = treeEntries;
    state.tree = tree;
  },
247 248 249 250 251 252
  [types.SET_RENDER_TREE_LIST](state, renderTreeList) {
    state.renderTreeList = renderTreeList;
  },
  [types.SET_SHOW_WHITESPACE](state, showWhitespace) {
    state.showWhitespace = showWhitespace;
  },
253 254 255
  [types.TOGGLE_FILE_FINDER_VISIBLE](state, visible) {
    state.fileFinderVisible = visible;
  },
256 257 258 259 260 261 262 263 264 265
  [types.REQUEST_FULL_DIFF](state, filePath) {
    const file = findDiffFile(state.diffFiles, filePath, 'file_path');

    file.isLoadingFullFile = true;
  },
  [types.RECEIVE_FULL_DIFF_ERROR](state, filePath) {
    const file = findDiffFile(state.diffFiles, filePath, 'file_path');

    file.isLoadingFullFile = false;
  },
266
  [types.RECEIVE_FULL_DIFF_SUCCESS](state, { filePath }) {
267 268 269 270 271
    const file = findDiffFile(state.diffFiles, filePath, 'file_path');

    file.isShowingFullFile = true;
    file.isLoadingFullFile = false;
  },
272 273 274 275 276 277 278
  [types.SET_FILE_COLLAPSED](state, { filePath, collapsed }) {
    const file = state.diffFiles.find(f => f.file_path === filePath);

    if (file && file.viewer) {
      file.viewer.collapsed = collapsed;
    }
  },
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
  [types.SET_HIDDEN_VIEW_DIFF_FILE_LINES](state, { filePath, lines }) {
    const file = state.diffFiles.find(f => f.file_path === filePath);
    const hiddenDiffLinesKey =
      state.diffViewType === 'inline' ? 'parallel_diff_lines' : 'highlighted_diff_lines';

    file[hiddenDiffLinesKey] = lines;
  },
  [types.SET_CURRENT_VIEW_DIFF_FILE_LINES](state, { filePath, lines }) {
    const file = state.diffFiles.find(f => f.file_path === filePath);
    const currentDiffLinesKey =
      state.diffViewType === 'inline' ? 'highlighted_diff_lines' : 'parallel_diff_lines';

    file[currentDiffLinesKey] = lines;
  },
  [types.ADD_CURRENT_VIEW_DIFF_FILE_LINES](state, { filePath, line }) {
    const file = state.diffFiles.find(f => f.file_path === filePath);
    const currentDiffLinesKey =
      state.diffViewType === 'inline' ? 'highlighted_diff_lines' : 'parallel_diff_lines';

    file[currentDiffLinesKey].push(line);
  },
  [types.TOGGLE_DIFF_FILE_RENDERING_MORE](state, filePath) {
    const file = state.diffFiles.find(f => f.file_path === filePath);

    file.renderingLines = !file.renderingLines;
  },
305 306 307
  [types.SET_SHOW_SUGGEST_POPOVER](state) {
    state.showSuggestPopover = false;
  },
Felipe Artur's avatar
Felipe Artur committed
308
};