Files

157 lines
3.8 KiB
JavaScript
Raw Permalink Normal View History

2022-02-19 21:34:20 +04:00
import {useCallback, useEffect, useState, forwardRef} from 'react'
2021-06-26 12:27:06 +02:00
import PropTypes from 'prop-types'
import axios from 'axios'
import {
TextField,
Container,
Button,
Snackbar,
LinearProgress,
Typography
2022-01-19 07:06:26 +04:00
} from '@mui/material'
import MuiAlert from '@mui/material/Alert'
2021-06-26 12:27:06 +02:00
2022-05-20 02:19:10 +04:00
const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:1337/api'
2021-06-26 12:27:06 +02:00
2022-02-19 21:34:20 +04:00
const Alert = forwardRef(function Alert(props, ref) {
return <MuiAlert ref={ref} elevation={6} variant='filled' {...props} />
})
2022-05-20 02:19:10 +04:00
function EkriKomante({session, paroleId, meteEsKomanteOuve}) {
2021-06-26 12:27:06 +02:00
const {jwt, user} = session
const [komante, meteKomante] = useState({kontni: ''})
const [ere, meteEre] = useState('')
const [sikse, meteSikse] = useState('')
const [chaje, meteChaje] = useState(false)
const [esOuve, meteEsOuve] = useState(false)
2022-05-20 02:19:10 +04:00
const handleClick = async () => {
2021-06-26 12:27:06 +02:00
meteChaje(true)
const {kontni} = komante
if (kontni === '') {
2022-05-20 02:19:10 +04:00
meteEre({error: {message: 'Champ obligatoire'}})
2021-06-26 12:27:06 +02:00
meteChaje(false)
return
}
const headers = {
'content-type': 'application/json',
Authorization: `Bearer ${jwt}`
}
2022-05-20 02:19:10 +04:00
try {
await axios.post(`${API_URL}/commentaires`, {
data: {
contenu: kontni,
parole: paroleId,
user: {
id: user.id,
username: user.username,
email: user.email
},
datePublication: new Date()
}
}, {
headers
2021-06-26 12:27:06 +02:00
})
2022-05-20 02:19:10 +04:00
meteSikse('Commentaire envoyé avec succès. Il apparaîtra sur le site après validation.')
meteChaje(false)
} catch (error) {
meteEre(error?.response?.data)
meteChaje(false)
}
2021-06-26 12:27:06 +02:00
}
const handleUpdate = useCallback(update => {
meteKomante({...komante, ...update})
}, [komante])
const handleClose = (event, reason) => {
if (reason === 'clickaway') {
return
}
meteEsOuve(false)
meteSikse('')
meteEre('')
meteEsKomanteOuve(false)
}
const handleReset = () => {
meteKomante({kontni: ''})
}
useEffect(() => {
if (sikse) {
meteEsOuve(true)
handleReset()
}
}, [sikse])
useEffect(() => {
if (ere) {
meteEsOuve(true)
}
}, [ere])
return (
<Container maxWidth='sm'>
<form noValidate autoComplete='off'>
<TextField
fullWidth
multiline
required
2022-05-20 02:19:10 +04:00
helperText='*Obligatoire. 500 caractères maximum'
2021-06-26 12:27:06 +02:00
style={{marginTop: '1em'}}
id='komante'
2022-05-20 02:19:10 +04:00
label='Commentaire'
2021-06-26 12:27:06 +02:00
value={komante.kontni}
rows={8}
variant='outlined'
onChange={event => handleUpdate({kontni: event.target.value})}
/>
</form>
<div>
<Button
fullWidth
disabled={chaje || komante.komante === ''}
style={{marginBlock: 20}}
variant='contained'
color='primary'
onClick={handleClick}
>
<Typography style={{fontWeight: 'bold'}}>
Valider
</Typography>
</Button>
{chaje && <LinearProgress size={24} style={{width: '100%', marginBlock: '1em'}} />}
</div>
{sikse && (
2022-05-20 02:19:10 +04:00
<Snackbar open={esOuve} autoHideDuration={10_000} onClose={handleClose}>
2021-06-26 12:27:06 +02:00
<Alert severity='success' onClose={handleClose}>
<strong>{sikse}</strong>
</Alert>
</Snackbar>
)}
{ere && (
2022-05-20 02:19:10 +04:00
<Snackbar open={esOuve} autoHideDuration={10_000} onClose={handleClose}>
2021-06-26 12:27:06 +02:00
<Alert severity='error' onClose={handleClose}>
2022-05-20 02:19:10 +04:00
<strong>Une erreur sest produite</strong> : <i>{ere?.error?.message}</i>
2021-06-26 12:27:06 +02:00
</Alert>
</Snackbar>
)}
</Container>
)
}
EkriKomante.propTypes = {
session: PropTypes.object.isRequired,
2022-05-20 02:19:10 +04:00
paroleId: PropTypes.number.isRequired,
2021-06-26 12:27:06 +02:00
meteEsKomanteOuve: PropTypes.func.isRequired
}
export default EkriKomante