aboutsummaryrefslogtreecommitdiffstats
path: root/web/src/js/ducks/utils/view.js
blob: 4b265f89cef7b6fe857405d3ca0fba13bed10db4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
}