82 lines
3.0 KiB
TypeScript
82 lines
3.0 KiB
TypeScript
import uniq from 'lodash/uniq';
|
|
import { State, Action } from './types';
|
|
import { addFrameNumbers } from './helpers';
|
|
|
|
export default function stackReducer(state: State, action: Action): State {
|
|
switch (action.type) {
|
|
case 'EXPAND_FRAMES': {
|
|
const expanded = uniq([...state.expanded, ...action.frames]);
|
|
|
|
return { ...state, expanded };
|
|
}
|
|
case 'EXPAND_ALL_VENDOR_FRAMES': {
|
|
const knownFrameNumbers = addFrameNumbers(state.frames)
|
|
.filter(frame => frame.relative_file !== 'unknown')
|
|
.map(frame => frame.frame_number);
|
|
|
|
return { ...state, expanded: knownFrameNumbers };
|
|
}
|
|
case 'COLLAPSE_ALL_VENDOR_FRAMES': {
|
|
const applicationFrameNumbers = addFrameNumbers(state.frames)
|
|
.filter(
|
|
frame =>
|
|
!frame.relative_file.startsWith('vendor/') &&
|
|
frame.relative_file !== 'unknown',
|
|
)
|
|
.map(frame => frame.frame_number);
|
|
|
|
const expanded = uniq([...applicationFrameNumbers, state.frames.length]);
|
|
|
|
return { ...state, expanded };
|
|
}
|
|
case 'SELECT_FRAME': {
|
|
const selectableFrameNumbers = addFrameNumbers(state.frames)
|
|
.filter(frame => frame.relative_file !== 'unknown')
|
|
.map(frame => frame.frame_number);
|
|
|
|
const selected = selectableFrameNumbers.includes(action.frame)
|
|
? action.frame
|
|
: state.selected;
|
|
|
|
const expanded = uniq([...state.expanded, selected]);
|
|
|
|
return { ...state, expanded, selected };
|
|
}
|
|
case 'SELECT_NEXT_FRAME': {
|
|
const selectableFrameNumbers = addFrameNumbers(state.frames)
|
|
.filter(frame => frame.relative_file !== 'unknown')
|
|
.map(frame => frame.frame_number);
|
|
|
|
const selectedIndex = selectableFrameNumbers.indexOf(state.selected);
|
|
|
|
const selected =
|
|
selectedIndex === selectableFrameNumbers.length - 1
|
|
? selectableFrameNumbers[0]
|
|
: selectableFrameNumbers[selectedIndex + 1];
|
|
|
|
const expanded = uniq([...state.expanded, selected]);
|
|
|
|
return { ...state, expanded, selected };
|
|
}
|
|
case 'SELECT_PREVIOUS_FRAME': {
|
|
const selectableFrameNumbers = addFrameNumbers(state.frames)
|
|
.filter(frame => frame.relative_file !== 'unknown')
|
|
.map(frame => frame.frame_number);
|
|
|
|
const selectedIndex = selectableFrameNumbers.indexOf(state.selected);
|
|
|
|
const selected =
|
|
selectedIndex === 0
|
|
? selectableFrameNumbers[selectableFrameNumbers.length - 1]
|
|
: selectableFrameNumbers[selectedIndex - 1];
|
|
|
|
const expanded = uniq([...state.expanded, selected]);
|
|
|
|
return { ...state, expanded, selected };
|
|
}
|
|
default: {
|
|
return state;
|
|
}
|
|
}
|
|
}
|