aboutsummaryrefslogtreecommitdiffstats
path: root/web/src/js/ducks/utils/view.js
diff options
context:
space:
mode:
Diffstat (limited to 'web/src/js/ducks/utils/view.js')
-rwxr-xr-xweb/src/js/ducks/utils/view.js54
1 files changed, 42 insertions, 12 deletions
diff --git a/web/src/js/ducks/utils/view.js b/web/src/js/ducks/utils/view.js
index c00f00bd..6bf0a63e 100755
--- a/web/src/js/ducks/utils/view.js
+++ b/web/src/js/ducks/utils/view.js
@@ -54,21 +54,29 @@ export default function reduce(state = defaultState, action) {
}
case UPDATE:
- if (state.indexOf[action.item.id] == null) {
- return
+ let hasOldItem = state.indexOf[action.item.id] !== null && state.indexOf[action.item.id] !== undefined
+ let hasNewItem = action.filter(action.item)
+ if (!hasNewItem && !hasOldItem) {
+ return state
}
- const nextState = {
- ...state,
- ...sortedRemove(state, action.item.id),
+ if (hasNewItem && !hasOldItem) {
+ return {
+ ...state,
+ ...sortedInsert(state, action.item, action.sort)
+ }
}
- if (!action.filter(action.item)) {
- return nextState
+ if (!hasNewItem && hasOldItem) {
+ return {
+ ...state,
+ ...sortedRemove(state, action.item.id)
+ }
}
- return {
- ...nextState,
- ...sortedInsert(nextState, action.item, action.sort)
+ if (hasNewItem && hasOldItem) {
+ return {
+ ...state,
+ ...sortedUpdate(state, action.item, action.sort),
+ }
}
-
case RECEIVE:
{
const data = action.list.filter(action.filter).sort(action.sort)
@@ -110,7 +118,7 @@ export function receive(list, filter = defaultFilter, sort = defaultSort) {
function sortedInsert(state, item, sort) {
const index = sortedIndex(state.data, item, sort)
- const data = [...state.data]
+ const data = [ ...state.data ]
const indexOf = { ...state.indexOf }
data.splice(index, 0, item)
@@ -134,6 +142,28 @@ function sortedRemove(state, id) {
return { data, indexOf }
}
+function sortedUpdate(state, item, sort) {
+ let data = [ ...state.data ]
+ let indexOf = { ...state.indexOf }
+ let index = indexOf[item.id]
+ data[index] = item
+ while (index + 1 < data.length && sort(data[index], data[index + 1]) > 0) {
+ data[index] = data[index + 1]
+ data[index + 1] = item
+ indexOf[item.id] = index + 1
+ indexOf[data[index].id] = index
+ ++index
+ }
+ while (index > 0 && sort(data[index], data[index - 1]) < 0) {
+ data[index] = data[index - 1]
+ data[index - 1] = item
+ indexOf[item.id] = index - 1
+ indexOf[data[index].id] = index
+ --index
+ }
+ return { data, indexOf }
+}
+
function sortedIndex(list, item, sort) {
let low = 0
let high = list.length