Rev 3416 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useDispatch } from 'react-redux'
import { Button, Grid } from '@mui/material'
import { axios, parse } from '@utils'
import { useFetch } from '@hooks'
import { addNotification } from '@store/notification/notification.actions'
import Spinner from '@components/UI/Spinner'
import JobCard from '@components/job/job-card'
import JobAttr from '@components/job/job-attr'
import CompanyInfo from '@components/job/company-info'
import ApplyModal from '@components/job/apply-modal'
const JobViewPage = () => {
const [showApplyModal, setShowApplyModal] = useState(false)
const [loading, setLoading] = useState(false)
const { uuid } = useParams()
const dispatch = useDispatch()
const { data: job, isLoading, mutate } = useFetch(`/job/view/${uuid}`)
const isJobApplied = job?.job_apply_operation === 'remove-apply'
const toggleApplyModal = () => setShowApplyModal(!showApplyModal)
const toggleApplication = () => {
mutate({
...job,
job_apply_operation: isJobApplied ? 'apply' : 'remove-apply'
})
}
const removeApply = async () => {
setLoading(true)
try {
const response = await axios.post(`/job/remove-apply-job/${job.job_uuid}`)
const { data, success } = response.data
if (!success) throw new Error('Error al eliminar la aplicación')
dispatch(addNotification({ style: 'success', msg: data }))
toggleApplication()
} catch (error) {
dispatch(addNotification({ style: 'danger', msg: error.message }))
} finally {
setLoading(false)
}
}
const apply = async (jobApply) => {
setLoading(true)
try {
const url = `/job/apply-job/${job.job_uuid}`
const formData = new FormData()
Object.entries(jobApply).map(([key, value]) =>
formData.append(key, value)
)
const response = await axios.post(url, formData)
const { data, success } = response.data
if (!success) throw new Error('Error al aplicar al trabajo')
dispatch(addNotification({ style: 'success', msg: data }))
toggleApplication()
toggleApplyModal()
} catch (error) {
dispatch(addNotification({ styled: 'danger', msg: error.message }))
} finally {
setLoading(false)
}
}
if (isLoading) {
return <Spinner />
}
return (
<>
<Grid container spacing={1}>
<Grid item xs md={8} display='flex' direction='column' gap={0.5}>
<JobCard job={job} />
<JobAttr title='Visión general' info={parse(job?.job_description)} />
<JobAttr
title='Último día de aplicación'
info={job?.last_date_of_application}
/>
<JobAttr title='Tipo de empleo' info={job?.employment_type} />
<JobAttr title='Ubicación' info={job?.location} />
<JobAttr title='Experiencia' info={job?.experience} />
<JobAttr title='Salario' info={job?.salary} />
<JobAttr title='Categoría' info={job?.job_category} />
<JobAttr title='Habilidades' info={job?.job_skills} />
<JobAttr title='Idiomas' info={job?.job_languages} />
<JobAttr title='Grados' info={job?.job_degrees} />
</Grid>
<Grid item xs md={4} display='flex' direction='column' gap={0.5}>
<Button
variant={isJobApplied ? 'secondary' : 'primary'}
onClick={isJobApplied ? removeApply : toggleApplyModal}
disabled={loading}
>
{isJobApplied ? 'Quitar aplicación' : 'Aplicar'}
</Button>
<CompanyInfo company={job} />
</Grid>
</Grid>
<ApplyModal
show={showApplyModal}
profiles={job?.user_profiles}
onConfirm={apply}
onClose={toggleApplyModal}
/>
</>
)
}
export default JobViewPage