148 lines
5.1 KiB
JavaScript
148 lines
5.1 KiB
JavaScript
import { useState, useEffect, useContext } from 'react'
|
|
import Link from 'next/link'
|
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
|
import { faTrash, faCheck, faTimes } from '@fortawesome/free-solid-svg-icons'
|
|
import { UserContext } from '../../contexts/UserContext'
|
|
import redirect from '../../utils/redirect'
|
|
import FunctionPage from '../../components/FunctionPage/FunctionPage'
|
|
import FunctionTabs from '../../components/FunctionPage/FunctionTabs'
|
|
import FunctionArticle from '../../components/FunctionPage/FunctionArticle'
|
|
import FunctionComments from '../../components/FunctionPage/FunctionComments/FunctionComments'
|
|
import api from '../../utils/api'
|
|
import '../../public/css/pages/FunctionComponent.css'
|
|
import '../../public/css/pages/functions/toDoList.css'
|
|
|
|
const ManageToDo = () => {
|
|
const { isAuth, user } = useContext(UserContext)
|
|
const [inputState, setInputState] = useState({ task: '' })
|
|
const [tasks, setTasks] = useState([])
|
|
|
|
useEffect(() => {
|
|
const getTasks = async () => {
|
|
const { data } = await api.get('/tasks', { headers: { Authorization: user.token } })
|
|
setTasks(data)
|
|
}
|
|
if (isAuth && user.token != null) {
|
|
getTasks()
|
|
}
|
|
}, [isAuth])
|
|
|
|
const handleChange = (event) => {
|
|
const inputStateNew = { ...inputState }
|
|
inputStateNew[event.target.name] = event.target.value
|
|
setInputState(inputStateNew)
|
|
}
|
|
|
|
const handleSubmit = async (event) => {
|
|
event.preventDefault()
|
|
try {
|
|
const { data } = await api.post('/tasks', inputState, { headers: { Authorization: user.token } })
|
|
const newTasks = [...tasks]
|
|
newTasks.push(data)
|
|
setTasks(newTasks)
|
|
setInputState({ task: '' })
|
|
} catch {}
|
|
}
|
|
|
|
const handleRemoveTask = async (id, index) => {
|
|
const newTasks = [...tasks]
|
|
try {
|
|
await api.delete(`/tasks/${id}`, { headers: { Authorization: user.token } })
|
|
newTasks.splice(index, 1)
|
|
setTasks(newTasks)
|
|
} catch {}
|
|
}
|
|
|
|
const handleEditTask = async (id, index, isCompleted) => {
|
|
try {
|
|
await api.put(`/tasks/${id}`, { isCompleted: !isCompleted }, { headers: { Authorization: user.token } })
|
|
const newTasks = [...tasks]
|
|
const taskObject = newTasks[index]
|
|
taskObject.isCompleted = !isCompleted
|
|
setTasks(newTasks)
|
|
} catch {}
|
|
}
|
|
|
|
if (!isAuth) {
|
|
return (
|
|
<p className='text-center'>
|
|
Vous devez être <Link href='/users/login'><a>connecté</a></Link> pour gérer des "tâches à faire".
|
|
</p>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<div className='container-fluid'>
|
|
<div className='row justify-content-center'>
|
|
<div className='col-24'>
|
|
<form onSubmit={handleSubmit}>
|
|
<div className='text-center'>
|
|
<label htmlFor='task' className='form-label'>Ajouter une tâche à faire :</label>
|
|
<input value={inputState.task} onChange={handleChange} name='task' id='task' type='text' className='form-control' placeholder='(e.g : Apprendre à coder)' />
|
|
</div>
|
|
|
|
<div className='form-group text-center'>
|
|
<button type='submit' className='btn btn-dark'>Envoyer</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
{(tasks.length > 0) &&
|
|
<div className='row justify-content-center'>
|
|
<div className='col-24 ManageToDo__container'>
|
|
<ul className='ManageToDo__list'>
|
|
{tasks.map((task, index) => {
|
|
return (
|
|
<li key={task.id} className={`ManageToDo__list-item ${(task.isCompleted) ? 'isCompleted' : ''}`}>
|
|
<span className='ManageToDo__list-item-span'>{task.task}</span>
|
|
<div>
|
|
<button className='ManageToDo__task-btn' title='Supprimer de la liste' onClick={() => handleRemoveTask(task.id, index)}>
|
|
<FontAwesomeIcon icon={faTrash} />
|
|
</button>
|
|
<button className='ManageToDo__task-btn' onClick={() => handleEditTask(task.id, index, task.isCompleted)}>
|
|
<FontAwesomeIcon {...(task.isCompleted) ? { icon: faTimes } : { icon: faCheck }} />
|
|
</button>
|
|
</div>
|
|
</li>
|
|
)
|
|
})}
|
|
</ul>
|
|
</div>
|
|
</div>}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const FunctionTabManager = (props) => {
|
|
return (
|
|
<FunctionTabs setSlideIndex={props.setSlideIndex} slideIndex={props.slideIndex}>
|
|
<div className='FunctionComponent__slide'>
|
|
<ManageToDo />
|
|
</div>
|
|
<div className='FunctionComponent__slide'>
|
|
<FunctionArticle article={props.article} />
|
|
</div>
|
|
<div className='FunctionComponent__slide'>
|
|
<FunctionComments functionId={props.id} />
|
|
</div>
|
|
</FunctionTabs>
|
|
)
|
|
}
|
|
|
|
const toDoList = (props) => (
|
|
<FunctionPage
|
|
FunctionTabManager={FunctionTabManager}
|
|
{...props}
|
|
tabNames={['⚙️ Utilisation', '📝 Article', '📬 Commentaires']}
|
|
/>
|
|
)
|
|
|
|
export async function getServerSideProps (context) {
|
|
return api.get('/functions/toDoList')
|
|
.then((response) => ({ props: response.data }))
|
|
.catch(() => redirect(context, '/404'))
|
|
}
|
|
|
|
export default toDoList
|