(state = initialState, action)
| 8 | }]; |
| 9 | |
| 10 | export default function todos(state = initialState, action) { |
| 11 | switch (action.type) { |
| 12 | case ADD_TODO: |
| 13 | return [{ |
| 14 | id: state.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) + 1, |
| 15 | completed: false, |
| 16 | modified: new Date(), |
| 17 | text: action.text |
| 18 | }, ...state]; |
| 19 | |
| 20 | case DELETE_TODO: |
| 21 | return state.filter(todo => |
| 22 | todo.id !== action.id |
| 23 | ); |
| 24 | |
| 25 | case EDIT_TODO: |
| 26 | return state.map(todo => |
| 27 | todo.id === action.id ? |
| 28 | Object.assign({}, todo, { text: action.text, modified: new Date() }) : |
| 29 | todo |
| 30 | ); |
| 31 | |
| 32 | case COMPLETE_TODO: |
| 33 | return state.map(todo => |
| 34 | todo.id === action.id ? |
| 35 | Object.assign({}, todo, { completed: !todo.completed, modified: new Date() }) : |
| 36 | todo |
| 37 | ); |
| 38 | |
| 39 | case COMPLETE_ALL: |
| 40 | const areAllMarked = state.every(todo => todo.completed); |
| 41 | return state.map(todo => Object.assign({}, todo, { |
| 42 | completed: !areAllMarked, modified: new Date() |
| 43 | })); |
| 44 | |
| 45 | case CLEAR_COMPLETED: |
| 46 | return state.filter(todo => todo.completed === false); |
| 47 | |
| 48 | default: |
| 49 | return state; |
| 50 | } |
| 51 | } |
no outgoing calls
no test coverage detected
searching dependent graphs…