diff options
Diffstat (limited to 'web/src/js/ducks/utils')
-rw-r--r-- | web/src/js/ducks/utils/list.js | 6 | ||||
-rw-r--r-- | web/src/js/ducks/utils/view.js | 58 |
2 files changed, 61 insertions, 3 deletions
diff --git a/web/src/js/ducks/utils/list.js b/web/src/js/ducks/utils/list.js index 37b2ae3a..b750982e 100644 --- a/web/src/js/ducks/utils/list.js +++ b/web/src/js/ducks/utils/list.js @@ -1,8 +1,8 @@ import {fetchApi} from "../../utils"; -const ADD = "ADD" -const REQUEST_LIST = "REQUEST_LIST" -const RECEIVE_LIST = "RECEIVE_LIST" +export const ADD = "ADD" +export const REQUEST_LIST = "REQUEST_LIST" +export const RECEIVE_LIST = "RECEIVE_LIST" const defaultState = { diff --git a/web/src/js/ducks/utils/view.js b/web/src/js/ducks/utils/view.js new file mode 100644 index 00000000..4b265f89 --- /dev/null +++ b/web/src/js/ducks/utils/view.js @@ -0,0 +1,58 @@ +import {ADD, REQUEST_LIST, RECEIVE_LIST} from "./list" + +const defaultFilterFn = x => true +const defaultSortFn = false + +const makeCompareFn = sortFn => { + let compareFn = (a, b) => { + let akey = sortFn(a), + bkey = sortFn(b); + if (akey < bkey) { + return -1; + } else if (akey > bkey) { + return 1; + } else { + return 0; + } + } + if (sortFn.reverse) + return (a, b) => compareFn(b, a) + return compareFn +} + +const sortedInsert = (list, sortFn, item) => { + let l = [...list, item] + let compareFn = makeCompareFn(sortFn) + + // only sort if sorting order is not correct yet + if (sortFn && compareFn(list[list.length - 1], item) > 0) { + // TODO: This is untested + console.debug("sorting view...") + l.sort(compareFn) + } + return l +} + +// for when the list changes +export function updateViewList(state, nextList, action, filterFn = defaultFilterFn, sortFn = defaultSortFn) { + switch (action.cmd) { + case REQUEST_LIST: + return state + case RECEIVE_LIST: + return updateViewFilter(nextList.list, filterFn, sortFn) + case ADD: + if (filterFn(action.item)) + return sortedInsert(state, sortFn, action.item) + return state + default: + console.error("Unknown list action: ", action); + return state + } +} + +export function updateViewFilter(list, filterFn = defaultFilterFn, sortFn = defaultSortFn) { + let filtered = list.filter(filterFn) + if (sortFn) + filtered.sort(makeCompareFn(sortFn)) + return filtered +}
\ No newline at end of file |