-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTodoList.jsx
137 lines (125 loc) · 4.73 KB
/
TodoList.jsx
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
127
128
129
130
131
132
133
134
135
136
137
// components/TodoList.jsx
import React, { useState } from 'react';
import TodoItem from './TodoItem.jsx';
import useTodos from '../hooks/useTodos.js';
import useHoverCalendarDate from '../hooks/useHoverCalendarDate.js';
import useSyncTodoWithCalendar from '../hooks/useSyncTodoWithCalendar.js';
/**
* Composant TodoList.
* Affiche la liste des tâches à faire avec des options pour ajouter, compléter et supprimer des tâches.
* Utilise le hook personnalisé `useTodos` pour gérer les tâches et les filtres.
*
* @returns {JSX.Element} Le composant TodoList.
*/
const TodoList = () => {
const { todos, addTodo, toggleTodo, deleteTodo, filter, handleFilterChange } = useTodos()
const { handleMouseEnter, handleMouseLeave } = useHoverCalendarDate()
const [hoverDate, setHoverDate] = useState(null)
// Utilisation du hook pour synchroniser la date survolée avec le calendrier
useSyncTodoWithCalendar(hoverDate)
/**
* Gestionnaire de soumission du formulaire pour ajouter une nouvelle tâche.
*
* @param {React.FormEvent} e - L'événement de soumission du formulaire.
*/
const handleSubmit = (e) => {
e.preventDefault();
const title = e.target.elements.title.value.trim()
if (title) {
addTodo(title)
e.target.reset()
}
}
/**
* Gestionnaire de survol des tâches.
* Met à jour l'état de la date survolée et appelle le gestionnaire de survol du calendrier.
*
* @param {string} date - La date à survoler.
*/
const handleTodoHover = (date) => {
setHoverDate(date)
handleMouseEnter(date)
}
/**
* Gestionnaire de la fin du survol des tâches.
* Réinitialise l'état de la date survolée et appelle le gestionnaire de fin de survol du calendrier.
*/
const handleTodoMouseLeave = () => {
setHoverDate(null)
handleMouseLeave()
}
/**
* Fonction pour formater la date en utilisant le format 'en-GB'.
*
* @param {string} isoString - La date au format ISO.
* @returns {string} La date formatée en chaîne de caractères.
*/
const formatHoverDate = (isoString) => {
const date = new Date(isoString)
// Récupère la date et l'heure séparément
const datePart = date.toLocaleDateString('en-US', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
})
const timePart = date.toLocaleTimeString('en-US', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
})
return `${datePart} ${timePart}`
}
return (
<div className="todo__container pt-5" id="todolist">
<form onSubmit={handleSubmit} className="d-flex pb-4 align-items-center">
<input
required
className="form-control reveal-3"
type="text"
placeholder="Create a note ..."
name="title"
/>
<button
className="btn btn-primary ms-2 btn-custom reveal-4"
type="submit"
>
Add a note
</button>
</form>
<div className="btn-group mb-4 gap-1 reveal-2" role="group">
<button
type="button"
className={`btn btn-outline-primary ${filter === 'all' ? 'active' : ''}`}
onClick={() => handleFilterChange('all')}>
All
</button>
<button
type="button"
className={`btn btn-outline-primary ${filter === 'todo' ? 'active' : ''}`}
onClick={() => handleFilterChange('todo')}>
To do
</button>
<button
type="button"
className={`btn btn-outline-primary ${filter === 'done' ? 'active' : ''}`}
onClick={() => handleFilterChange('done')}>
Completed
</button>
</div>
<ul className="list-group list-group-custom reveal-4">
{todos.map(todo => (
<TodoItem
key={todo.id}
todo={todo}
toggleTodo={toggleTodo}
deleteTodo={deleteTodo}
onHover={handleTodoHover}
onMouseLeave={handleTodoMouseLeave}
/>
))}
</ul>
{hoverDate && <div className="hover-info">Created task : {formatHoverDate(hoverDate)}</div>}
</div>
)
}
export default TodoList;