Advertisement
danilosilvadev

Untitled

Apr 8th, 2019
440
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.   KeyboardEventHandler,
  8.   ChangeEventHandler
  9. } from 'react'
  10. import _ from 'lodash'
  11. import { TodoForm, TodoList } from './components'
  12. import './App.css'
  13. import 'bulma/css/bulma.css'
  14.  
  15. type todo = { todo: string; isChecked: boolean; editMode: boolean }
  16. type onChangeAndIndex = (
  17.   e: ChangeEvent<HTMLInputElement>,
  18.   index: number
  19. ) => void
  20. type formAndIdex = (
  21.   e: FormEvent<HTMLFormElement> | MouseEvent<HTMLButtonElement>,
  22.   index: number
  23. ) => void
  24. type onClickAndIndex = (e: MouseEvent<HTMLButtonElement>, index: number) => void
  25. export interface State {
  26.   activeTodos: todo[]
  27.   todoObject: todo
  28.   tempTodo: todo
  29. }
  30.  
  31. export interface Actions {
  32.   add: KeyboardEventHandler
  33.   change: ChangeEventHandler
  34.   edit: onChangeAndIndex
  35.   update: formAndIdex
  36.   cancel: onClickAndIndex
  37.   toggleEditMode: onClickAndIndex
  38.   toggleDone: onChangeAndIndex
  39.   remove: onClickAndIndex
  40. }
  41.  
  42. export default class extends Component<{}, State> {
  43.   private todoDefault = { todo: '', isChecked: false, editMode: false };
  44.  
  45.   state = {
  46.     activeTodos: [this.todoDefault],
  47.     completedTodos: [this.todoDefault],
  48.     todoObject: this.todoDefault,
  49.     tempTodo: this.todoDefault
  50.   }
  51.  
  52.   private handleAdd = (e: KeyboardEvent<HTMLInputElement>) => {
  53.     if (e.key === 'Enter') {
  54.       this.setState((prevState: State) => ({
  55.         activeTodos: [...prevState.activeTodos, prevState.todoObject],
  56.         todoObject: { todo: '', isChecked: false, editMode: false }
  57.       }))
  58.     }
  59.   }
  60.  
  61.   private handleChange = (e: ChangeEvent<HTMLInputElement>) => {
  62.     const todoText = e.currentTarget.value
  63.     this.setState((prevState: State) => ({
  64.       todoObject: {
  65.         todo: todoText,
  66.         isChecked: prevState.todoObject.isChecked,
  67.         editMode: false
  68.       }
  69.     }))
  70.   }
  71.  
  72.   private handleEdit = (e: ChangeEvent<HTMLInputElement>, index: number) => {
  73.     let list = [...this.state.activeTodos]
  74.     const todoText = e.currentTarget.value
  75.     list[index] = {
  76.       todo: todoText,
  77.       isChecked: list[index].isChecked,
  78.       editMode: true
  79.     }
  80.     this.setState({ activeTodos: list })
  81.   }
  82.  
  83.   private handleUpdate = (
  84.     e: FormEvent<HTMLFormElement> | MouseEvent<HTMLButtonElement>,
  85.     index: number
  86.   ) => {
  87.     e.preventDefault()
  88.     const list = [...this.state.activeTodos]
  89.     if (list.length > 0) {
  90.       list[index] = {
  91.         todo: list[index].todo,
  92.         isChecked: list[index].isChecked,
  93.         editMode: false
  94.       }
  95.       if (list[index].todo) this.setState({ activeTodos: list })
  96.     }
  97.   }
  98.  
  99.   private handleCancel = (
  100.     e: FormEvent<HTMLFormElement> | MouseEvent<HTMLButtonElement>,
  101.     index: number
  102.   ) => {
  103.     const list = [...this.state.activeTodos]
  104.     if (list.length > 0) {
  105.       list[index] = this.state.tempTodo
  106.       list[index].editMode = false
  107.       this.setState({ activeTodos: list })
  108.     }
  109.   }
  110.  
  111.   private handleToggleEditMode = (
  112.     e: MouseEvent<HTMLSpanElement>,
  113.     index: number
  114.   ) => {
  115.     let list = [...this.state.activeTodos]
  116.     list[index] = {
  117.       todo: list[index].todo,
  118.       isChecked: list[index].isChecked,
  119.       editMode: true
  120.     }
  121.     this.setState((prevState: State) => {
  122.       let tempList = []
  123.       tempList = [...prevState.activeTodos]
  124.       return {
  125.         tempTodo: tempList[index],
  126.         activeTodos: list
  127.       }
  128.     })
  129.   }
  130.  
  131.   private handleToggleDone = (
  132.     e: ChangeEvent<HTMLInputElement>,
  133.     index: number
  134.   ) => {
  135.     let list = [...this.state.activeTodos]
  136.     list[index].isChecked = this.state.activeTodos[index] && !this.state.activeTodos[index].isChecked
  137.     this.setState({
  138.       activeTodos: list
  139.     })
  140.   }
  141.  
  142.   private handleRemove = (
  143.     e: MouseEvent<HTMLButtonElement>,
  144.     index: number
  145.   ) => {
  146.     let list = [...this.state.activeTodos]
  147.     const newList = _.remove(list, (item: todo, i: number) => {
  148.       return i !== index
  149.     })
  150.     this.setState({
  151.       activeTodos: newList
  152.     })
  153.   }
  154.  
  155.   actions: Actions = {
  156.     add: this.handleAdd,
  157.     change: this.handleChange,
  158.     edit: this.handleEdit,
  159.     update: this.handleUpdate,
  160.     cancel: this.handleCancel,
  161.     remove: this.handleRemove,
  162.     toggleEditMode: this.handleToggleEditMode,
  163.     toggleDone: this.handleToggleDone
  164.   }
  165.  
  166.   render () {
  167.     return (
  168.       <div className="columns is-centered section">
  169.         <div className="column is-10-mobile is-8-tablet is-6-desktop">
  170.           <h1>TODO</h1>
  171.           <TodoForm state={this.state} actions={this.actions} />
  172.           <TodoList state={this.state} actions={this.actions} />
  173.         </div>
  174.       </div>
  175.     )
  176.   }
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement