reducer.ts 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import uniq from 'lodash/uniq';
  2. import { State, Action } from './types';
  3. import { addFrameNumbers } from './helpers';
  4. export default function stackReducer(state: State, action: Action): State {
  5. switch (action.type) {
  6. case 'EXPAND_FRAMES': {
  7. const expanded = uniq([...state.expanded, ...action.frames]);
  8. return { ...state, expanded };
  9. }
  10. case 'EXPAND_ALL_VENDOR_FRAMES': {
  11. const knownFrameNumbers = addFrameNumbers(state.frames)
  12. .filter(frame => frame.relative_file !== 'unknown')
  13. .map(frame => frame.frame_number);
  14. return { ...state, expanded: knownFrameNumbers };
  15. }
  16. case 'COLLAPSE_ALL_VENDOR_FRAMES': {
  17. const applicationFrameNumbers = addFrameNumbers(state.frames)
  18. .filter(frame => {
  19. if (frame.relative_file.startsWith('vendor/')) {
  20. return false;
  21. }
  22. if (frame.relative_file.startsWith('vendor\\')) {
  23. return false;
  24. }
  25. if (frame.relative_file !== 'unknown') {
  26. return false;
  27. }
  28. return true;
  29. })
  30. .map(frame => frame.frame_number);
  31. const expanded = uniq([...applicationFrameNumbers, state.frames.length]);
  32. return { ...state, expanded };
  33. }
  34. case 'SELECT_FRAME': {
  35. const selectableFrameNumbers = addFrameNumbers(state.frames)
  36. .filter(frame => frame.relative_file !== 'unknown')
  37. .map(frame => frame.frame_number);
  38. const selected = selectableFrameNumbers.includes(action.frame)
  39. ? action.frame
  40. : state.selected;
  41. const expanded = uniq([...state.expanded, selected]);
  42. return { ...state, expanded, selected };
  43. }
  44. case 'SELECT_NEXT_FRAME': {
  45. const selectableFrameNumbers = addFrameNumbers(state.frames)
  46. .filter(frame => frame.relative_file !== 'unknown')
  47. .map(frame => frame.frame_number);
  48. const selectedIndex = selectableFrameNumbers.indexOf(state.selected);
  49. const selected =
  50. selectedIndex === selectableFrameNumbers.length - 1
  51. ? selectableFrameNumbers[0]
  52. : selectableFrameNumbers[selectedIndex + 1];
  53. const expanded = uniq([...state.expanded, selected]);
  54. return { ...state, expanded, selected };
  55. }
  56. case 'SELECT_PREVIOUS_FRAME': {
  57. const selectableFrameNumbers = addFrameNumbers(state.frames)
  58. .filter(frame => frame.relative_file !== 'unknown')
  59. .map(frame => frame.frame_number);
  60. const selectedIndex = selectableFrameNumbers.indexOf(state.selected);
  61. const selected =
  62. selectedIndex === 0
  63. ? selectableFrameNumbers[selectableFrameNumbers.length - 1]
  64. : selectableFrameNumbers[selectedIndex - 1];
  65. const expanded = uniq([...state.expanded, selected]);
  66. return { ...state, expanded, selected };
  67. }
  68. default: {
  69. return state;
  70. }
  71. }
  72. }