aboutsummaryrefslogtreecommitdiffstats
path: root/web/src/js/ducks/views/main.js
diff options
context:
space:
mode:
authorJason <jason.daurus@gmail.com>2016-06-23 23:20:41 +0800
committerJason <jason.daurus@gmail.com>2016-06-23 23:20:41 +0800
commit5adb7a54fd689f69d5734d64fea0d3de43f4ce6d (patch)
tree4c733db43737e1b6d02fe81a14e1a1ce08ecf06b /web/src/js/ducks/views/main.js
parent397554b7c7ceddb54755605dc5df29731bb37214 (diff)
downloadmitmproxy-5adb7a54fd689f69d5734d64fea0d3de43f4ce6d.tar.gz
mitmproxy-5adb7a54fd689f69d5734d64fea0d3de43f4ce6d.tar.bz2
mitmproxy-5adb7a54fd689f69d5734d64fea0d3de43f4ce6d.zip
[web] separate views and list
Diffstat (limited to 'web/src/js/ducks/views/main.js')
-rwxr-xr-xweb/src/js/ducks/views/main.js166
1 files changed, 166 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..a9700584
--- /dev/null
+++ b/web/src/js/ducks/views/main.js
@@ -0,0 +1,166 @@
+import reduceView, * as viewActions from '../utils/list'
+import * as viewsActions from '../views'
+
+export const UPDATE_FILTER = 'MAIN_VIEW_UPDATE_FILTER'
+export const UPDATE_SORTER = 'MAIN_VIEW_UPDATE_SORTER'
+export const UPDATE_HIGHLIGHT = 'MAIN_VIEW_UPDATE_HIGHLIGHT'
+export const SELECT = 'MAIN_VIEW_SELECT'
+
+const defaultState = {
+ filter: null,
+ sorter: null,
+ highlight: null,
+ selected: [],
+ view: null,
+}
+
+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) {
+ return filter ? Filt.parse(filter) : () => true
+}
+
+/**
+ * @private
+ */
+function makeSorter(column, desc) {
+ const sortKeyFun = sortKeyFuns[column]
+ 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
+ }
+}