1- import TodoCount from './TodoCount.js' ;
2- import TodoInput from './TodoInput.js' ;
3- import TodoList from './TodoList.js' ;
1+ import TodoFilter from './components/TodoFilter.js' ;
2+ import TodoInput from './components/TodoInput.js' ;
3+ import TodoList from './components/TodoList.js' ;
4+ import { FILTER_TYPES } from '../utils/const.js' ;
45
56export default function TodoApp ( $app ) {
67 this . state = {
@@ -16,31 +17,35 @@ export default function TodoApp($app) {
1617 state : '' ,
1718 } ,
1819 ] ,
20+ todoesFiltered : [ ] ,
21+ isFilter : false ,
22+ todoesCount : '0' ,
1923 } ;
2024
2125 this . setState = ( nextState ) => {
2226 this . state = nextState ;
23- todoList . setState ( this . state . todoes ) ;
24- todoCount . setState ( this . state . todoes ) ;
25- todoInput . setState ( this . state . todoes ) ;
27+ todoList . setState ( nextState ) ;
28+ todoInput . setState ( nextState ) ;
29+ todoFilter . setState ( nextState ) ;
2630 } ;
2731
2832 const todoInput = new TodoInput ( {
2933 $app,
30- initialState : this . state . todoes ,
34+ initialState : this . state ,
3135 onAdd : ( contents ) => addTodo ( contents ) ,
3236 } ) ;
3337
3438 const todoList = new TodoList ( {
3539 $app,
36- initialState : this . state . todoes ,
40+ initialState : this . state ,
3741 onToggle : ( idx ) => toggleTodo ( idx ) ,
3842 onDelete : ( idx ) => deleteTodo ( idx ) ,
3943 onEdit : ( idx , isEdit , newContent ) => editTodo ( idx , isEdit , newContent ) ,
4044 } ) ;
41- const todoCount = new TodoCount ( {
45+ const todoFilter = new TodoFilter ( {
4246 $app,
43- initialState : this . state . count ,
47+ initialState : this . state ,
48+ onFilter : ( filterType ) => filterTodo ( filterType ) ,
4449 } ) ;
4550
4651 const init = ( ) => {
@@ -50,27 +55,28 @@ export default function TodoApp($app) {
5055 } ;
5156 init ( ) ;
5257
53- const addTodo = ( contents ) => {
54- const todos = this . state . todoes ;
55- const nextIdx = Math . max ( 0 , ...todos . map ( ( todo ) => todo . idx ) ) + 1 ;
58+ const addTodo = ( addContent ) => {
59+ const { todoes } = this . state ;
60+ const nextIdx = Math . max ( 0 , ...todoes . map ( ( todo ) => todo . idx ) ) + 1 ;
5661 const newTodo = {
5762 idx : nextIdx ,
58- content : contents ,
63+ content : addContent ,
5964 state : '' ,
6065 edit : '' ,
6166 } ;
62- this . state . todoes . push ( newTodo ) ;
67+ todoes . push ( newTodo ) ;
6368
6469 this . setState ( {
6570 ...this . state ,
6671 } ) ;
6772 } ;
6873
6974 const toggleTodo = ( idx ) => {
70- const todos = this . state . todoes ;
71- todos . map ( ( todo ) => {
75+ const { todoes } = this . state ;
76+
77+ todoes . map ( ( todo ) => {
7278 if ( todo . idx === idx ) {
73- todo . state = todo . state === '' ? 'completed' : '' ;
79+ todo . state = todo . state === '' ? FILTER_TYPES . COMPLETE : '' ;
7480 }
7581 } ) ;
7682 this . setState ( {
@@ -79,19 +85,21 @@ export default function TodoApp($app) {
7985 } ;
8086
8187 const deleteTodo = ( idx ) => {
82- const todos = this . state . todoes ;
83- const newTodos = todos . filter ( ( todo ) => {
88+ const { todoes } = this . state ;
89+
90+ const resetTodoes = todoes . filter ( ( todo ) => {
8491 return todo . idx !== idx ;
8592 } ) ;
8693
8794 this . setState ( {
88- todoes : newTodos ,
95+ todoes : resetTodoes ,
8996 } ) ;
9097 } ;
9198
9299 const editTodo = ( idx , isEdit , newContent ) => {
93- const todos = this . state . todoes ;
94- todos . map ( ( todo ) => {
100+ const { todoes } = this . state ;
101+
102+ todoes . map ( ( todo ) => {
95103 if ( todo . idx === idx ) {
96104 todo . state = todo . state === '' ? 'editing' : '' ;
97105 if ( isEdit ) {
@@ -103,4 +111,37 @@ export default function TodoApp($app) {
103111 ...this . state ,
104112 } ) ;
105113 } ;
114+
115+ const filterTodo = ( filterType ) => {
116+ const { todoes } = this . state ;
117+
118+ if ( filterType === FILTER_TYPES . ALL ) {
119+ this . setState ( {
120+ ...this . state ,
121+ isFilter : false ,
122+ todoesCount : todoes . length ,
123+ } ) ;
124+ } else if ( filterType === FILTER_TYPES . COMPLETE ) {
125+ const completedTodoes = todoes . filter (
126+ ( todo ) => todo . state === FILTER_TYPES . COMPLETE
127+ ) ;
128+
129+ this . setState ( {
130+ ...this . state ,
131+ todoesFiltered : completedTodoes ,
132+ isFilter : true ,
133+ todoesCount : completedTodoes . length ,
134+ } ) ;
135+ } else if ( filterType === FILTER_TYPES . ACTIVE ) {
136+ const activeTodoes = todoes . filter (
137+ ( todo ) => todo . state !== FILTER_TYPES . COMPLETE
138+ ) ;
139+ this . setState ( {
140+ ...this . state ,
141+ todoesFiltered : activeTodoes ,
142+ isFilter : true ,
143+ todoesCount : activeTodoes . length ,
144+ } ) ;
145+ }
146+ } ;
106147}
0 commit comments