198 lines
5.9 KiB
JavaScript
198 lines
5.9 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
|