forked from facebookarchive/flux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTodoStore.js
69 lines (57 loc) · 1.78 KB
/
TodoStore.js
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
59
60
61
62
63
64
65
66
67
68
69
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict';
import Counter from './Counter';
import Immutable from 'immutable';
import {ReduceStore} from 'flux/utils';
import Todo from './Todo';
import TodoActionTypes from './TodoActionTypes';
import TodoDispatcher from './TodoDispatcher';
class TodoStore extends ReduceStore {
constructor() {
super(TodoDispatcher);
}
getInitialState() {
return Immutable.OrderedMap();
}
reduce(state, action) {
switch (action.type) {
case TodoActionTypes.ADD_TODO:
// Don't add todos with no text.
if (!action.text) {
return state;
}
const id = Counter.increment();
return state.set(
id,
new Todo({
id,
text: action.text,
complete: false,
}),
);
case TodoActionTypes.DELETE_COMPLETED_TODOS:
return state.filter((todo) => !todo.complete);
case TodoActionTypes.DELETE_TODO:
return state.delete(action.id);
case TodoActionTypes.EDIT_TODO:
return state.setIn([action.id, 'text'], action.text);
case TodoActionTypes.TOGGLE_ALL_TODOS:
const areAllComplete = state.every((todo) => todo.complete);
return state.map((todo) => todo.set('complete', !areAllComplete));
case TodoActionTypes.TOGGLE_TODO:
return state.update(action.id, (todo) =>
todo.set('complete', !todo.complete),
);
default:
return state;
}
}
}
export default new TodoStore();