parent
4cb17031d1
commit
45368384d1
13 changed files with 204 additions and 259 deletions
@ -1,22 +0,0 @@ |
|||||||
import actions from 'actions'; |
|
||||||
|
|
||||||
const setItems = (groups) => { |
|
||||||
return { |
|
||||||
type: actions.COMPLETION_SET_ITEMS, |
|
||||||
groups, |
|
||||||
}; |
|
||||||
}; |
|
||||||
|
|
||||||
const selectNext = () => { |
|
||||||
return { |
|
||||||
type: actions.COMPLETION_SELECT_NEXT |
|
||||||
}; |
|
||||||
}; |
|
||||||
|
|
||||||
const selectPrev = () => { |
|
||||||
return { |
|
||||||
type: actions.COMPLETION_SELECT_PREV |
|
||||||
}; |
|
||||||
}; |
|
||||||
|
|
||||||
export { setItems, selectNext, selectPrev }; |
|
@ -1,68 +0,0 @@ |
|||||||
import actions from 'actions'; |
|
||||||
|
|
||||||
const defaultState = { |
|
||||||
groupSelection: -1, |
|
||||||
itemSelection: -1, |
|
||||||
groups: [], |
|
||||||
}; |
|
||||||
|
|
||||||
const nextSelection = (state) => { |
|
||||||
if (state.groupSelection < 0) { |
|
||||||
return [0, 0]; |
|
||||||
} |
|
||||||
|
|
||||||
let group = state.groups[state.groupSelection]; |
|
||||||
if (state.groupSelection + 1 >= state.groups.length && |
|
||||||
state.itemSelection + 1 >= group.items.length) { |
|
||||||
return [-1, -1]; |
|
||||||
} |
|
||||||
if (state.itemSelection + 1 >= group.items.length) { |
|
||||||
return [state.groupSelection + 1, 0]; |
|
||||||
} |
|
||||||
return [state.groupSelection, state.itemSelection + 1]; |
|
||||||
}; |
|
||||||
|
|
||||||
const prevSelection = (state) => { |
|
||||||
if (state.groupSelection < 0) { |
|
||||||
return [ |
|
||||||
state.groups.length - 1, |
|
||||||
state.groups[state.groups.length - 1].items.length - 1 |
|
||||||
]; |
|
||||||
} |
|
||||||
if (state.groupSelection === 0 && state.itemSelection === 0) { |
|
||||||
return [-1, -1]; |
|
||||||
} else if (state.itemSelection === 0) { |
|
||||||
return [ |
|
||||||
state.groupSelection - 1, |
|
||||||
state.groups[state.groupSelection - 1].items.length - 1 |
|
||||||
]; |
|
||||||
} |
|
||||||
return [state.groupSelection, state.itemSelection - 1]; |
|
||||||
}; |
|
||||||
|
|
||||||
export default function reducer(state = defaultState, action = {}) { |
|
||||||
switch (action.type) { |
|
||||||
case actions.COMPLETION_SET_ITEMS: |
|
||||||
return Object.assign({}, state, { |
|
||||||
groups: action.groups, |
|
||||||
groupSelection: -1, |
|
||||||
itemSelection: -1, |
|
||||||
}); |
|
||||||
case actions.COMPLETION_SELECT_NEXT: { |
|
||||||
let next = nextSelection(state); |
|
||||||
return Object.assign({}, state, { |
|
||||||
groupSelection: next[0], |
|
||||||
itemSelection: next[1], |
|
||||||
}); |
|
||||||
} |
|
||||||
case actions.COMPLETION_SELECT_PREV: { |
|
||||||
let next = prevSelection(state); |
|
||||||
return Object.assign({}, state, { |
|
||||||
groupSelection: next[0], |
|
||||||
itemSelection: next[1], |
|
||||||
}); |
|
||||||
} |
|
||||||
default: |
|
||||||
return state; |
|
||||||
} |
|
||||||
} |
|
@ -1,27 +0,0 @@ |
|||||||
import { expect } from "chai"; |
|
||||||
import actions from 'actions'; |
|
||||||
import * as completionActions from 'actions/completion'; |
|
||||||
|
|
||||||
describe("completion actions", () => { |
|
||||||
describe('setItems', () => { |
|
||||||
it('create COMPLETION_SET_ITEMS action', () => { |
|
||||||
let action = completionActions.setItems([1, 2, 3]); |
|
||||||
expect(action.type).to.equal(actions.COMPLETION_SET_ITEMS); |
|
||||||
expect(action.groups).to.deep.equal([1, 2, 3]); |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
||||||
describe('selectNext', () => { |
|
||||||
it('create COMPLETION_SELECT_NEXT action', () => { |
|
||||||
let action = completionActions.selectNext(); |
|
||||||
expect(action.type).to.equal(actions.COMPLETION_SELECT_NEXT); |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
||||||
describe('selectPrev', () => { |
|
||||||
it('create COMPLETION_SELECT_PREV action', () => { |
|
||||||
let action = completionActions.selectPrev(); |
|
||||||
expect(action.type).to.equal(actions.COMPLETION_SELECT_PREV); |
|
||||||
}); |
|
||||||
}); |
|
||||||
}); |
|
@ -1,90 +0,0 @@ |
|||||||
import { expect } from "chai"; |
|
||||||
import actions from 'actions'; |
|
||||||
import completionReducer from 'reducers/completion'; |
|
||||||
|
|
||||||
describe("completion reducer", () => { |
|
||||||
it ('return the initial state', () => { |
|
||||||
let state = completionReducer(undefined, {}); |
|
||||||
expect(state).to.have.property('groupSelection', -1); |
|
||||||
expect(state).to.have.property('itemSelection', -1); |
|
||||||
expect(state).to.have.deep.property('groups', []); |
|
||||||
}); |
|
||||||
|
|
||||||
it ('return next state for COMPLETION_SET_ITEMS', () => { |
|
||||||
let state = { |
|
||||||
groupSelection: 0, |
|
||||||
itemSelection: 0, |
|
||||||
groups: [], |
|
||||||
} |
|
||||||
let action = { |
|
||||||
type: actions.COMPLETION_SET_ITEMS, |
|
||||||
groups: [{ |
|
||||||
name: 'Apple', |
|
||||||
items: [1, 2, 3] |
|
||||||
}, { |
|
||||||
name: 'Banana', |
|
||||||
items: [4, 5, 6] |
|
||||||
}] |
|
||||||
} |
|
||||||
state = completionReducer(state, action); |
|
||||||
expect(state).to.have.property('groups', action.groups); |
|
||||||
expect(state).to.have.property('groupSelection', -1); |
|
||||||
expect(state).to.have.property('itemSelection', -1); |
|
||||||
}); |
|
||||||
|
|
||||||
it ('return next state for COMPLETION_SELECT_NEXT', () => { |
|
||||||
let action = { type: actions.COMPLETION_SELECT_NEXT }; |
|
||||||
let state = { |
|
||||||
groupSelection: -1, |
|
||||||
itemSelection: -1, |
|
||||||
groups: [{ |
|
||||||
name: 'Apple', |
|
||||||
items: [1, 2] |
|
||||||
}, { |
|
||||||
name: 'Banana', |
|
||||||
items: [3] |
|
||||||
}] |
|
||||||
}; |
|
||||||
|
|
||||||
state = completionReducer(state, action); |
|
||||||
expect(state).to.have.property('groupSelection', 0); |
|
||||||
expect(state).to.have.property('itemSelection', 0); |
|
||||||
|
|
||||||
state = completionReducer(state, action); |
|
||||||
expect(state).to.have.property('groupSelection', 0); |
|
||||||
expect(state).to.have.property('itemSelection', 1); |
|
||||||
|
|
||||||
state = completionReducer(state, action); |
|
||||||
state = completionReducer(state, action); |
|
||||||
expect(state).to.have.property('groupSelection', -1); |
|
||||||
expect(state).to.have.property('itemSelection', -1); |
|
||||||
}); |
|
||||||
|
|
||||||
it ('return next state for COMPLETION_SELECT_PREV', () => { |
|
||||||
let action = { type: actions.COMPLETION_SELECT_PREV }; |
|
||||||
let state = { |
|
||||||
groupSelection: -1, |
|
||||||
itemSelection: -1, |
|
||||||
groups: [{ |
|
||||||
name: 'Apple', |
|
||||||
items: [1, 2] |
|
||||||
}, { |
|
||||||
name: 'Banana', |
|
||||||
items: [3] |
|
||||||
}] |
|
||||||
}; |
|
||||||
|
|
||||||
state = completionReducer(state, action); |
|
||||||
expect(state).to.have.property('groupSelection', 1); |
|
||||||
expect(state).to.have.property('itemSelection', 0); |
|
||||||
|
|
||||||
state = completionReducer(state, action); |
|
||||||
expect(state).to.have.property('groupSelection', 0); |
|
||||||
expect(state).to.have.property('itemSelection', 1); |
|
||||||
|
|
||||||
state = completionReducer(state, action); |
|
||||||
state = completionReducer(state, action); |
|
||||||
expect(state).to.have.property('groupSelection', -1); |
|
||||||
expect(state).to.have.property('itemSelection', -1); |
|
||||||
}); |
|
||||||
}); |
|
Reference in new issue