Skip to content

Instantly share code, notes, and snippets.

Created June 27, 2017 13:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/2023899883be3ce56e6d7264ad3ba8fc to your computer and use it in GitHub Desktop.
Save anonymous/2023899883be3ce56e6d7264ad3ba8fc to your computer and use it in GitHub Desktop.
import React, {Component} from 'react';
import ReactDOM from 'react-dom';
import { connect } from 'react-redux';
import { Button, FormControl } from 'react-bootstrap';
import PropTypes from 'prop-types';
import {addTodo, toggleTodo, removeTodo, setVisibilityFilter} from '../actions/todos';
import Link from './Link';
import Todo from './Todo';
const getVisibleTodos = (todos, filter) => {
switch (filter){
case 'SHOW_ALL':
return todos;
case 'SHOW_COMPLETED':
return todos.filter(t => t.completed);
case 'SHOW_ACTIVE':
return todos.filter(t => !t.completed);
default:
return todos;
}
}
class TodoListComponent extends Component{
static propTypes = {
todos: PropTypes.array.isRequired,
addTodo: PropTypes.func.isRequired,
removeTodo: PropTypes.func.isRequired,
toggleTodo: PropTypes.func.isRequired,
setVisibilityFilter: PropTypes.func.isRequired,
visibilityFilter: PropTypes.string.isRequired
}
constructor(props, context){
super(props, context);
this.state = {
todo: ''
}
this.handleChange = this.handleChange.bind(this);
this.handleAddTodo = this.handleAddTodo.bind(this);
}
handleChange(e){
this.setState({todo: e.target.value});
}
handleAddTodo(){
this.props.addTodo(this.state.todo);
this.setState({todo: ''});
ReactDOM.findDOMNode(this.refs.todo).focus();
}
render(){
const wellStyle = {maxWidth: 500, margin: '0 auto 10px'};
const {todos, toggleTodo, removeTodo, visibilityFilter, setVisibilityFilter} = this.props;
return(
<div>
<h2 className="text-center text-muted">
TODO APP
</h2>
<br/>
<FormControl
type="text"
value={this.state.todo}
onChange={this.handleChange}
autoFocus
ref="todo"
/>
<br />
<Button
bsStyle="primary"
bsSize="large"
block
onclick={this.handleAddTodo}
>
Submit
</Button>
<br />
<div className="well" style={wellStyle}>
<Link
onClick={() => setVisibilityFilter('SHOW_ALL')}
active={'SHOW_ALL' === visibilityFilter}>
<span>ALL</span>
</Link>
<Link
onClick={() => setVisibilityFilter('SHOW_COMPLETED')}
active={'SHOW_COMPLETED' === visibilityFilter}>
<span>COMPLETED</span>
</Link>
<Link
onClick={() => setVisibilityFilter('SHOW_ACTIVE')}
active={'SHOW_ACTIVE' === visibilityFilter}>
<span>ACTIVE</span>
</Link>
</div>
<ul>
{getVisibleTodos(this.props.todos, this.props.visibilityFilter).map( todo =>
<Todo
key={todo.id}
onClick="{() => toggleTodo(todo.id)}"
onDelete="{() => removeTodo(todo.id)}"
todo="{todo}"
/>
)}
</ul>
</div>
)
}
}
const mapStateToProps = (state) => ({
todos: getVisibleTodos(state.todos, state.visibilityFilter),
visibilityFilter: state.visibilityFilter
})
const mapDispatchToProps = (dispatch) => {
return {
addTodo: (todo) => {
dispatch(addTodo(todo));
},
toggleTodo: (id) => {
dispatch(toggleTodo(id));
},
removeTodo: (id) => {
dispatch(removeTodo(id));
},
setVisibilityFilter: (filter) => {
dispatch(setVisibilityFilter(filter));
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(TodoListComponent);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment