Advertisement
danilosilvadev

Untitled

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