2020-08-03 12:04:07 +02:00
|
|
|
import { useState, useEffect } from 'react'
|
|
|
|
import htmlParser from 'html-react-parser'
|
2020-08-03 12:11:08 +02:00
|
|
|
import Loader from '../Loader'
|
2020-08-03 12:04:07 +02:00
|
|
|
import useAPI from '../../hooks/useAPI'
|
|
|
|
import api from '../../utils/api'
|
|
|
|
import '../../public/css/pages/admin.css'
|
2020-04-15 22:50:40 +02:00
|
|
|
|
|
|
|
const AddEditFunction = (props) => {
|
2020-08-03 12:04:07 +02:00
|
|
|
const [, categories] = useAPI('/categories')
|
|
|
|
const [inputState, setInputState] = useState(props.defaultInputState)
|
|
|
|
const [message, setMessage] = useState('')
|
|
|
|
const [isLoading, setIsLoading] = useState(false)
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (categories.length > 0 && !props.isEditing) {
|
|
|
|
handleChange({
|
|
|
|
target: {
|
|
|
|
name: 'categorieId',
|
|
|
|
value: categories[0].id
|
2020-04-15 22:50:40 +02:00
|
|
|
}
|
2020-08-03 12:04:07 +02:00
|
|
|
})
|
2020-04-15 22:50:40 +02:00
|
|
|
}
|
2020-08-03 12:04:07 +02:00
|
|
|
}, [categories])
|
|
|
|
|
|
|
|
const apiCallFunction = (formData) => {
|
|
|
|
if (props.isEditing) return api.put(`/admin/functions/${inputState.id}`, formData, { headers: { Authorization: props.user.token } })
|
|
|
|
return api.post('/admin/functions', formData, { headers: { Authorization: props.user.token } })
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleChange = (event, isTypeCheck = false) => {
|
|
|
|
const inputStateNew = { ...inputState }
|
|
|
|
inputStateNew[event.target.name] = (event.target.files != null) ? event.target.files[0] : (isTypeCheck) ? event.target.checked : event.target.value
|
|
|
|
setInputState(inputStateNew)
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleSubmit = (event) => {
|
|
|
|
event.preventDefault()
|
|
|
|
setIsLoading(true)
|
|
|
|
const formData = new window.FormData()
|
|
|
|
formData.append('type', inputState.type)
|
|
|
|
formData.append('categorieId', inputState.categorieId)
|
|
|
|
formData.append('title', inputState.title)
|
|
|
|
formData.append('slug', inputState.slug)
|
|
|
|
formData.append('description', inputState.description)
|
|
|
|
formData.append('image', inputState.image)
|
|
|
|
|
|
|
|
if (props.isEditing) {
|
|
|
|
formData.append('isOnline', inputState.isOnline)
|
2020-04-15 22:50:40 +02:00
|
|
|
}
|
|
|
|
|
2020-08-03 12:04:07 +02:00
|
|
|
apiCallFunction(formData)
|
|
|
|
.then(() => {
|
|
|
|
setIsLoading(false)
|
|
|
|
window.location.reload(true)
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
setMessage(`<p class="form-error"><b>Erreur:</b> ${error.response.data.message}</p>`)
|
|
|
|
setIsLoading(false)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<form onSubmit={handleSubmit}>
|
|
|
|
<div className='form-group'>
|
|
|
|
<label className='form-label' htmlFor='title'>Titre :</label>
|
|
|
|
<input value={inputState.title} onChange={handleChange} type='text' name='title' id='title' className='form-control' placeholder='(e.g : Nombre aléatoire)' />
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className='form-group'>
|
|
|
|
<label className='form-label' htmlFor='slug'>Slug :</label>
|
|
|
|
<input value={inputState.slug} onChange={handleChange} type='text' name='slug' id='slug' className='form-control' placeholder='(e.g : randomNumber)' />
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className='form-group'>
|
|
|
|
<label className='form-label' htmlFor='description'>Description :</label>
|
|
|
|
<textarea style={{ height: 'auto' }} value={inputState.description} onChange={handleChange} name='description' id='description' className='form-control' rows='5' />
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className='form-group'>
|
|
|
|
<label className='form-label' htmlFor='type'>Type :</label>
|
|
|
|
<select onChange={handleChange} name='type' id='type' className='form-control' {...(props.isEditing) && { value: inputState.type }}>
|
|
|
|
<option value='form'>Formulaire</option>
|
|
|
|
<option value='article'>Article</option>
|
|
|
|
<option value='page'>Page</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className='form-group'>
|
|
|
|
<label className='form-label' htmlFor='categorieId'>Catégorie :</label>
|
|
|
|
<select onChange={handleChange} name='categorieId' id='categorieId' className='form-control' {...(props.isEditing) && { value: inputState.categorieId }}>
|
|
|
|
{categories.map((category) => (
|
|
|
|
<option key={category.id} value={category.id} className='Admin__Modal-select-option' style={{ backgroundColor: category.color }}>{category.name}</option>
|
|
|
|
))}
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className='form-group'>
|
|
|
|
<label className='form-label' htmlFor='image'>Image <em>(150x150 recommandé)</em> :</label>
|
|
|
|
<br />
|
|
|
|
<input onChange={handleChange} accept='image/jpeg,image/jpg,image/png' type='file' name='image' id='image' />
|
|
|
|
</div>
|
|
|
|
|
|
|
|
{(props.isEditing) &&
|
|
|
|
<div className='form-group custom-control custom-switch'>
|
|
|
|
<input onChange={(event) => handleChange(event, true)} type='checkbox' name='isOnline' checked={inputState.isOnline} className='custom-control-input' id='isOnline' />
|
|
|
|
<label className='custom-control-label' htmlFor='isOnline'>isOnline</label>
|
|
|
|
</div>}
|
|
|
|
|
|
|
|
<div className='form-group text-center'>
|
|
|
|
<button type='submit' className='btn btn-dark'>Envoyer</button>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
|
|
|
|
<div className='form-result text-center'>
|
|
|
|
{
|
|
|
|
(isLoading)
|
|
|
|
? <Loader />
|
|
|
|
: htmlParser(message)
|
2020-04-15 22:50:40 +02:00
|
|
|
}
|
2020-08-03 12:04:07 +02:00
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
)
|
2020-04-15 22:50:40 +02:00
|
|
|
}
|
|
|
|
|
2020-08-03 12:04:07 +02:00
|
|
|
export default AddEditFunction
|