This repository has been archived on 2024-10-29. You can view files and clone it, but cannot push or open issues or pull requests.
FunctionProject/website/components/FunctionAdmin/AddEditFunction.jsx

209 lines
5.9 KiB
React
Raw Normal View History

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-08-03 14:14:45 +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-08-03 12:04:07 +02:00
})
}
2020-08-03 12:04:07 +02:00
}, [categories])
2020-08-03 14:14:45 +02:00
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 }
})
2020-08-03 12:04:07 +02:00
}
const handleChange = (event, isTypeCheck = false) => {
const inputStateNew = { ...inputState }
2020-08-03 14:14:45 +02:00
inputStateNew[event.target.name] =
event.target.files != null
? event.target.files[0]
: isTypeCheck
? event.target.checked
: event.target.value
2020-08-03 12:04:07 +02:00
setInputState(inputStateNew)
}
2020-08-03 14:14:45 +02:00
const handleSubmit = event => {
2020-08-03 12:04:07 +02:00
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-08-03 12:04:07 +02:00
apiCallFunction(formData)
.then(() => {
setIsLoading(false)
window.location.reload(true)
})
2020-08-03 14:14:45 +02:00
.catch(error => {
setMessage(
`<p class="form-error"><b>Erreur:</b> ${error.response.data.message}</p>`
)
2020-08-03 12:04:07 +02:00
setIsLoading(false)
})
}
return (
<>
<form onSubmit={handleSubmit}>
<div className='form-group'>
2020-08-03 14:14:45 +02:00
<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)'
/>
2020-08-03 12:04:07 +02:00
</div>
<div className='form-group'>
2020-08-03 14:14:45 +02:00
<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)'
/>
2020-08-03 12:04:07 +02:00
</div>
<div className='form-group'>
2020-08-03 14:14:45 +02:00
<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'
/>
2020-08-03 12:04:07 +02:00
</div>
<div className='form-group'>
2020-08-03 14:14:45 +02:00
<label className='form-label' htmlFor='type'>
Type :
</label>
<select
onChange={handleChange}
name='type'
id='type'
className='form-control'
{...(props.isEditing && { value: inputState.type })}
>
2020-08-03 12:04:07 +02:00
<option value='form'>Formulaire</option>
<option value='article'>Article</option>
<option value='page'>Page</option>
</select>
</div>
<div className='form-group'>
2020-08-03 14:14:45 +02:00
<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>
2020-08-03 12:04:07 +02:00
))}
</select>
</div>
<div className='form-group'>
2020-08-03 14:14:45 +02:00
<label className='form-label' htmlFor='image'>
Image <em>(150x150 recommandé)</em> :
</label>
2020-08-03 12:04:07 +02:00
<br />
2020-08-03 14:14:45 +02:00
<input
onChange={handleChange}
accept='image/jpeg,image/jpg,image/png'
type='file'
name='image'
id='image'
/>
2020-08-03 12:04:07 +02:00
</div>
2020-08-03 14:14:45 +02:00
{props.isEditing && (
2020-08-03 12:04:07 +02:00
<div className='form-group custom-control custom-switch'>
2020-08-03 14:14:45 +02:00
<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>
)}
2020-08-03 12:04:07 +02:00
<div className='form-group text-center'>
2020-08-03 14:14:45 +02:00
<button type='submit' className='btn btn-dark'>
Envoyer
</button>
2020-08-03 12:04:07 +02:00
</div>
</form>
<div className='form-result text-center'>
2020-08-03 14:14:45 +02:00
{isLoading ? <Loader /> : htmlParser(message)}
2020-08-03 12:04:07 +02:00
</div>
</>
)
}
2020-08-03 12:04:07 +02:00
export default AddEditFunction