Todos.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import React, { Component, Fragment } from "react";
  2. import "./Todos.css";
  3. import PropTypes from "prop-types";
  4. import { connect } from "react-redux";
  5. import { addTodo, removeTodo } from "./store";
  6. class TodoList extends Component {
  7. state = {
  8. input: "",
  9. };
  10. handleclick = i => () =>
  11. this.props.removeTodo(i);
  12. handleChange = e =>
  13. this.setState({ input: e.currentTarget.value });
  14. handleSubmit = (e) => {
  15. e.preventDefault();
  16. this.props.addTodo({ text: this.state.input });
  17. this.setState({ input: "" });
  18. };
  19. render() {
  20. return (
  21. <form className="todos--container" data-testid="addTodoForm" onSubmit={this.handleSubmit}>
  22. <h1 className="todos--h1">Todos</h1>
  23. <input type="text" name="todo" data-testid="todo"
  24. onChange={this.handleChange}
  25. value={this.state.input} />
  26. <ul>
  27. {this.props.todos.map(({ text }, i) => (
  28. <li onClick={this.handleclick(i)} key={i}>
  29. {text}
  30. </li>
  31. ))}
  32. </ul>
  33. <button className="todo--button" type="submit" data-testid="submitButton">Add todo</button>
  34. </form>
  35. );
  36. }
  37. }
  38. TodoList.propTypes = {
  39. addTodo: PropTypes.func,
  40. removeTodo: PropTypes.func,
  41. todos: PropTypes.array,
  42. };
  43. const mapStateToProps = ({ currentList: { todos } }) => ({ todos });
  44. const bindActionsToDispatch = dispatch => ({
  45. addTodo: todo => dispatch(addTodo(todo)),
  46. removeTodo: id => dispatch(removeTodo(id)),
  47. });
  48. const TodoListContainer = connect(
  49. mapStateToProps,
  50. bindActionsToDispatch
  51. )(TodoList);
  52. export {
  53. TodoListContainer,
  54. TodoList
  55. };