-
Notifications
You must be signed in to change notification settings - Fork 123
/
Copy pathindex.tsx
126 lines (114 loc) · 2.97 KB
/
index.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import React, { useState } from 'react'
import { Store, Todo } from '../../index'
import { useStore } from 'muriatic'
import { Layout } from './style'
interface Props {
todo: Todo
}
interface State {
onEdit: boolean
}
const Item = ({ todo }: Props) => {
const [store, setStore] = useStore<Store>()
const init: State = { onEdit: false }
const [state, setState] = useState(init)
const setOnEditTrue = () => {
setState({ onEdit: true })
}
const setOnEditFalse = () => {
setState({ onEdit: false })
}
const submitEditText = (e: React.KeyboardEvent<HTMLInputElement>): void => {
if (e.key === 'Enter' || e.key === 'Escape') {
if (e.currentTarget.value.length > 0) {
setOnEditFalse()
}
}
}
const SwitchStyle = (t: Todo, onEdit: boolean): string => {
switch (true) {
case onEdit && t.completed:
return 'completed editing'
case onEdit && !t.completed:
return 'editing'
case !onEdit && t.completed:
return 'completed'
case !onEdit && !t.completed:
return ''
default:
return ''
}
}
const toggleCompleted = (clicked: Todo['id']): void => {
setStore({
todoList: store.todoList.map((t: Todo) => {
if (t.id === clicked) {
return { ...t, completed: !t.completed }
} else {
return t
}
})
})
}
const removeItem = (terminate: Todo['id']): void => {
setStore({
todoList: store.todoList.filter((t: Todo) => t.id !== terminate)
})
}
const handleTextInput = (
e: React.ChangeEvent<HTMLInputElement>,
onEdit: Todo['id']
): void => {
setStore({
todoList: store.todoList.map((t: Todo) => {
if (t.id === onEdit) {
return { ...t, bodyText: e.target.value }
} else {
return t
}
})
})
}
return (
<Layout
className={SwitchStyle(todo, state.onEdit)}
data-cy="todo-item"
data-testid="todo-item"
>
<div className="view">
<input
className="toggle"
type="checkbox"
checked={todo.completed}
onChange={() => toggleCompleted(todo.id)}
data-cy="todo-item-complete-check"
data-testid="todo-item-complete-check"
/>
<label
onDoubleClick={setOnEditTrue}
data-cy="todo-body-text"
data-testid="todo-body-text"
>
{todo.bodyText}
</label>
<button
className="destroy"
onClick={() => removeItem(todo.id)}
data-cy="delete-todo-btn"
data-testid="delete-todo-btn"
/>
</div>
<input
onBlur={setOnEditFalse}
className="edit"
autoFocus={state.onEdit ? true : false}
value={todo.bodyText}
onChange={e => handleTextInput(e, todo.id)}
onKeyPress={e => submitEditText(e)}
data-cy="todo-edit-input"
data-testid="todo-edit-input"
/>
</Layout>
)
}
export default Item