Files
phptimerboard2/vendor/facade/ignition/resources/js/stack/reducer.ts
2019-09-29 19:47:00 -05:00

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