mirror of
				https://github.com/reduxjs/redux-devtools.git
				synced 2025-10-31 07:57:39 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import React, { Component, PropTypes } from 'react';
 | |
| import TodoItem from './TodoItem';
 | |
| import Footer from './Footer';
 | |
| import { SHOW_ALL, SHOW_MARKED, SHOW_UNMARKED } from '../constants/TodoFilters';
 | |
| 
 | |
| const TODO_FILTERS = {
 | |
|   [SHOW_ALL]: () => true,
 | |
|   [SHOW_UNMARKED]: todo => !todo.marked,
 | |
|   [SHOW_MARKED]: todo => todo.marked
 | |
| };
 | |
| 
 | |
| export default class MainSection extends Component {
 | |
|   static propTypes = {
 | |
|     todos: PropTypes.array.isRequired,
 | |
|     actions: PropTypes.object.isRequired
 | |
|   };
 | |
| 
 | |
|   constructor(props, context) {
 | |
|     super(props, context);
 | |
|     this.state = { filter: SHOW_ALL };
 | |
|   }
 | |
| 
 | |
|   handleClearMarked() {
 | |
|     const atLeastOneMarked = this.props.todos.some(todo => todo.marked);
 | |
|     if (atLeastOneMarked) {
 | |
|       this.props.actions.clearMarked();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   handleShow(filter) {
 | |
|     this.setState({ filter });
 | |
|   }
 | |
| 
 | |
|   render() {
 | |
|     const { todos, actions } = this.props;
 | |
|     const { filter } = this.state;
 | |
| 
 | |
|     const filteredTodos = todos.filter(TODO_FILTERS[filter]);
 | |
|     const markedCount = todos.reduce((count, todo) =>
 | |
|       todo.marked ? count + 1 : count,
 | |
|       0
 | |
|     );
 | |
| 
 | |
|     return (
 | |
|       <section className='main'>
 | |
|         {this.renderToggleAll(markedCount)}
 | |
|         <ul className='todo-list'>
 | |
|           {filteredTodos.map(todo =>
 | |
|             <TodoItem key={todo.id} todo={todo} {...actions} />
 | |
|           )}
 | |
|         </ul>
 | |
|         {this.renderFooter(markedCount)}
 | |
|       </section>
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   renderToggleAll(markedCount) {
 | |
|     const { todos, actions } = this.props;
 | |
|     if (todos.length > 0) {
 | |
|       return (
 | |
|         <input className='toggle-all'
 | |
|                type='checkbox'
 | |
|                checked={markedCount === todos.length}
 | |
|                onChange={actions.markAll} />
 | |
|       );
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   renderFooter(markedCount) {
 | |
|     const { todos } = this.props;
 | |
|     const { filter } = this.state;
 | |
|     const unmarkedCount = todos.length - markedCount;
 | |
| 
 | |
|     if (todos.length) {
 | |
|       return (
 | |
|         <Footer markedCount={markedCount}
 | |
|                 unmarkedCount={unmarkedCount}
 | |
|                 filter={filter}
 | |
|                 onClearMarked={::this.handleClearMarked}
 | |
|                 onShow={::this.handleShow} />
 | |
|       );
 | |
|     }
 | |
|   }
 | |
| }
 |