diff options
Diffstat (limited to 'web/src/js/ducks/views/main.js')
-rwxr-xr-x | web/src/js/ducks/views/main.js | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/web/src/js/ducks/views/main.js b/web/src/js/ducks/views/main.js new file mode 100755 index 00000000..74dc2606 --- /dev/null +++ b/web/src/js/ducks/views/main.js @@ -0,0 +1,199 @@ +import { RequestUtils } from '../../flow/utils' +import reduceView, * as viewActions from '../utils/view' +import * as viewsActions from '../views' + +export const UPDATE_FILTER = 'FLOW_VIEWS_MAIN_UPDATE_FILTER' +export const UPDATE_SORTER = 'FLOW_VIEWS_MAIN_UPDATE_SORTER' +export const UPDATE_HIGHLIGHT = 'FLOW_VIEWS_MAIN_UPDATE_HIGHLIGHT' +export const SELECT = 'FLOW_VIEWS_MAIN_SELECT' + +const sortKeyFuns = { + + TLSColumn: flow => flow.request.scheme, + + PathColumn: flow => RequestUtils.pretty_url(flow.request), + + MethodColumn: flow => flow.request.method, + + StatusColumn: flow => flow.response && flow.response.status_code, + + TimeColumn: flow => flow.response && flow.response.timestamp_end - flow.request.timestamp_start, + + SizeColumn: flow => { + let total = flow.request.contentLength + if (flow.response) { + total += flow.response.contentLength || 0 + } + return total + }, +} + +const defaultState = { + highlight: null, + selected: [], + filter: null, + sorter: { column: null, desc: false }, + view: undefined, +} + +export default function reduce(state = defaultState, action) { + switch (action.type) { + + case UPDATE_HIGHLIGHT: + return { + ...state, + highlight: action.highlight, + } + + case SELECT: + return { + ...state, + selected: [action.id] + } + + case UPDATE_FILTER: + return { + ...state, + filter: action.filter, + view: reduceView( + state.view, + viewActions.updateFilter( + action.list, + makeFilter(action.filter), + makeSorter(state.sorter) + ) + ), + } + + case UPDATE_SORTER: + const sorter = { column: action.column, desc: action.desc } + return { + ...state, + sorter, + view: reduceView( + state.view, + viewActions.updateSorter( + makeSorter(sorter) + ) + ), + } + + case viewsActions.ADD: + return { + ...state, + view: reduceView( + state.view, + viewActions.add( + action.item, + makeFilter(state.filter), + makeSorter(state.sorter) + ) + ), + } + + case viewsActions.UPDATE: + return { + ...state, + view: reduceView( + state.view, + viewActions.update( + action.id, + action.item, + makeFilter(state.filter), + makeSorter(state.sorter) + ) + ), + } + + case viewsActions.REMOVE: + return { + ...state, + view: reduceView( + state.view, + viewActions.remove( + action.id + ) + ), + } + + case viewsActions.RECEIVE: + return { + ...state, + view: reduceView( + state.view, + viewActions.receive( + action.list, + makeFilter(state.filter), + makeSorter(state.sorter) + ) + ), + } + + default: + return { + ...state, + view: reduceView(state.view, action) + } + } +} + +/** + * @public + */ +export function updateFilter(filter) { + return (dispatch, getState) => { + return { type: UPDATE_FILTER, filter, list: getState().flows.list } + } +} + +/** + * @public + */ +export function updateHighlight(highlight) { + return { type: UPDATE_HIGHLIGHT, highlight } +} + +/** + * @public + */ +export function updateSorter(column, desc) { + return { type: UPDATE_SORTER, column, desc } +} + +/** + * @public + */ +export function select(id) { + return { type: SELECT, currentSelection: getState().flows.views.main.selected[0], id } +} + +/** + * @private + */ +function makeFilter(filter) { + if (!filter) { + return + } + return Filt.parse(filter) +} + +/** + * @private + */ +function makeSorter({ column, desc }) { + const sortKeyFun = sortKeyFuns[column] + if (!sortKeyFun) { + return + } + return (a, b) => { + const ka = sortKeyFun(a) + const kb = sortKeyFun(b) + if (ka > kb) { + return desc ? -1 : 1 + } + if (ka < kb) { + return desc ? 1 : -1 + } + return 0 + } +} |