Advertisement
danilosilvadev

Untitled

Apr 7th, 2019
469
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, {
  2.   Component,
  3.   FormEvent,
  4.   ChangeEvent,
  5.   KeyboardEvent,
  6.   MouseEvent,
  7. } from 'react'
  8. import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
  9. import { List, Form } from './components'
  10. import _ from 'lodash'
  11. import './App.css'
  12. import 'bulma/css/bulma.css'
  13.  
  14. type todo = { todo: string; isChecked: boolean; editMode: boolean }
  15. type keyBoard = (e: KeyboardEvent<HTMLInputElement>) => void
  16. type onChange = (e: ChangeEvent<HTMLInputElement>) => void
  17. type onChangeAndIndex = (
  18.   e: ChangeEvent<HTMLInputElement>,
  19.   index: number
  20. ) => void
  21. type formAndIdex = (
  22.   e: FormEvent<HTMLFormElement> | MouseEvent<HTMLButtonElement>,
  23.   index: number
  24. ) => void
  25. type onClickAndIndex = (e: MouseEvent<HTMLButtonElement>, index: number) => void
  26. type onClick = (e: FormEvent<HTMLFormElement>) => void
  27. type checkboxClick = (e: MouseEvent<HTMLInputElement>, index: number) => void
  28. export interface State {
  29.   activeTodos: todo[]
  30.   todoObject: todo
  31.   completedTodos: todo[]
  32.   tempTodo: todo
  33. }
  34.  
  35. export interface Actions {
  36.   add: keyBoard
  37.   change: onChange
  38.   edit: onChangeAndIndex
  39.   update: formAndIdex
  40.   cancel: onClickAndIndex
  41.   toggleEditMode: onClickAndIndex
  42.   toggleDone: checkboxClick
  43.   delete: onClick
  44. }
  45.  
  46. export default class extends Component<{}, State> {
  47.   state = {
  48.     activeTodos: [{ todo: 'myTodo', isChecked: true, editMode: false }],
  49.     todoObject: { todo: '', isChecked: false, editMode: false },
  50.     completedTodos: [],
  51.     tempTodo: { todo: '', isChecked: false, editMode: false },
  52.   }
  53.  
  54.   actions: Actions = {
  55.     add: this.handleAdd = this.handleAdd.bind(this),
  56.     change: this.handleChange = this.handleChange.bind(this),
  57.     edit: this.handleEdit = this.handleEdit.bind(this),
  58.     update: this.handleUpdate = this.handleUpdate.bind(this),
  59.     cancel: this.handleCancel = this.handleCancel.bind(this),
  60.     delete: this.handleDelete = this.handleDelete.bind(this),
  61.     toggleEditMode: this.handleToggleEditMode = this.handleToggleEditMode.bind(
  62.       this
  63.     ),
  64.     toggleDone: this.handleToggleDone = this.handleToggleDone.bind(this),
  65.   }
  66.  
  67.   private handleAdd(e: KeyboardEvent<HTMLInputElement>) {
  68.     if (e.key === 'Enter') {
  69.       this.setState((prevState: State) => ({
  70.         activeTodos: [...prevState.activeTodos, prevState.todoObject],
  71.         todoObject: { todo: '', isChecked: false, editMode: false },
  72.       }))
  73.     }
  74.   }
  75.  
  76.   private handleChange(e: ChangeEvent<HTMLInputElement>) {
  77.     const todoText = e.currentTarget.value
  78.     this.setState((prevState: State) => ({
  79.       todoObject: {
  80.         todo: todoText,
  81.         isChecked: prevState.todoObject.isChecked,
  82.         editMode: false,
  83.       },
  84.     }))
  85.   }
  86.  
  87.   private handleEdit(e: ChangeEvent<HTMLInputElement>, index: number) {
  88.     let list: todo[] = []
  89.     list = [...this.state.activeTodos]
  90.     const todoText = e.currentTarget.value
  91.     list[index] = {
  92.       todo: todoText,
  93.       isChecked: list[index].isChecked,
  94.       editMode: true,
  95.     }
  96.     this.setState({ activeTodos: list })
  97.   }
  98.  
  99.   private handleUpdate(
  100.     e: FormEvent<HTMLFormElement> | MouseEvent<HTMLButtonElement>,
  101.     index: number
  102.   ) {
  103.     e.preventDefault()
  104.     const list = this.state.activeTodos
  105.     list[index] = {
  106.       todo: list[index].todo,
  107.       isChecked: list[index].isChecked,
  108.       editMode: false,
  109.     }
  110.     if (list[index].todo) this.setState({ activeTodos: list })
  111.   }
  112.  
  113.   private handleCancel(
  114.     e: FormEvent<HTMLFormElement> | MouseEvent<HTMLButtonElement>,
  115.     index: number
  116.   ) {
  117.     const list = this.state.activeTodos
  118.     list[index] = this.state.tempTodo
  119.     list[index].editMode = false
  120.     this.setState({ activeTodos: list })
  121.   }
  122.  
  123.   private handleToggleEditMode(e: MouseEvent<HTMLSpanElement>, index: number) {
  124.     let list: todo[] = []
  125.     list = [...this.state.activeTodos]
  126.     list[index] = {
  127.       todo: list[index].todo,
  128.       isChecked: list[index].isChecked,
  129.       editMode: true,
  130.     }
  131.     this.setState((prevState: State) => {
  132.       let tempList = []
  133.       tempList = [...prevState.activeTodos]
  134.       return {
  135.         tempTodo: tempList[index],
  136.         activeTodos: list,
  137.       }
  138.     })
  139.   }
  140.  
  141.   private handleToggleDone(e: MouseEvent<HTMLSpanElement>, index: number) {
  142.     let list: todo[] = []
  143.     list = [...this.state.activeTodos]
  144.     _.remove(list, (item: todo) => {
  145.       return item
  146.     })
  147.   }
  148.  
  149.   private handleDelete() {}
  150.  
  151.   render() {
  152.     return (
  153.       <Router>
  154.         <div>
  155.           <nav>
  156.             <ul className="tabs is-small">
  157.               <li className="is-active">
  158.                 <Link to="/">Home</Link>
  159.               </li>
  160.               <li>
  161.                 <Link to="/about/">About</Link>
  162.               </li>
  163.               <li>
  164.                 <Link to="/users/">Users</Link>
  165.               </li>
  166.             </ul>
  167.           </nav>
  168.  
  169.           <Route
  170.             path="/"
  171.             exact
  172.             render={() => (
  173.               <div className="columns is-centered">
  174.                 <div className="column is-6-desktop is-6-mobile">
  175.                   <Form state={this.state} actions={this.actions} />
  176.                   <List state={this.state} actions={this.actions} />
  177.                 </div>
  178.               </div>
  179.             )}
  180.           />
  181.           <Route path="/about/" component={() => <div />} />
  182.           <Route path="/users/" component={() => <div />} />
  183.         </div>
  184.       </Router>
  185.     )
  186.   }
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement