Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3087 | Rev 3089 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3082 stevensc 1
import React, { useState } from 'react'
5 stevensc 2
import { useParams } from 'react-router-dom'
3
import { useDispatch } from 'react-redux'
3087 stevensc 4
import { Button, Grid } from '@mui/material'
5 stevensc 5
 
3083 stevensc 6
import { axios, parse } from '@utils'
3082 stevensc 7
import { useFetch } from '@hooks'
8
import { addNotification } from '@store/notification/notification.actions'
3083 stevensc 9
 
10
import Spinner from '@components/UI/Spinner'
11
import JobCard from '@components/job/job-card'
12
import JobAttr from '@components/job/job-attr'
3087 stevensc 13
import CompanyInfo from '@components/job/company-info'
3088 stevensc 14
import ApplyModal from '@components/job/apply-modal'
5 stevensc 15
 
16
const JobViewPage = () => {
17
  const [showApplyModal, setShowApplyModal] = useState(false)
18
  const [loading, setLoading] = useState(false)
19
  const { uuid } = useParams()
20
  const dispatch = useDispatch()
21
 
3083 stevensc 22
  const { data: job, isLoading, mutate } = useFetch(`/job/view/${uuid}`)
3082 stevensc 23
  const isJobApplied = job?.job_apply_operation === 'remove-apply'
24
 
3083 stevensc 25
  const toggleApplyModal = () => setShowApplyModal(!showApplyModal)
5 stevensc 26
 
3085 stevensc 27
  const toggleApplication = () => {
28
    mutate({
29
      ...job,
30
      job_apply_operation: isJobApplied ? 'apply' : 'remove-apply'
31
    })
5 stevensc 32
  }
33
 
34
  const removeApply = async () => {
35
    setLoading(true)
3082 stevensc 36
    try {
3087 stevensc 37
      const response = await axios.post(`/job/remove-apply-job/${job.job_uuid}`)
3082 stevensc 38
      const { data, success } = response.data
39
      if (!success) throw new Error('Error al eliminar la aplicación')
40
      dispatch(addNotification({ styled: 'success', msg: data }))
3085 stevensc 41
      toggleApplication()
3082 stevensc 42
    } catch (error) {
43
      dispatch(addNotification({ styled: 'danger', msg: error.message }))
44
    } finally {
45
      setLoading(false)
46
    }
47
  }
5 stevensc 48
 
3085 stevensc 49
  const apply = async (jobApply) => {
50
    setLoading(true)
51
 
52
    try {
53
      const url = `/job/apply-job/${job.job_uuid}`
54
      const formData = new FormData()
55
      Object.entries(jobApply).map(([key, value]) =>
56
        formData.append(key, value)
57
      )
58
 
59
      const response = await axios.post(url, formData)
60
      const { data, success } = response.data
61
 
62
      if (!success) throw new Error('Error al aplicar al trabajo')
63
 
64
      dispatch(addNotification({ style: 'success', msg: data }))
65
      toggleApplication()
3088 stevensc 66
      toggleApplyModal()
3085 stevensc 67
    } catch (error) {
68
      dispatch(addNotification({ styled: 'danger', msg: error.message }))
69
    } finally {
70
      setLoading(false)
71
    }
72
  }
73
 
3082 stevensc 74
  if (isLoading) {
75
    return <Spinner />
5 stevensc 76
  }
77
 
78
  return (
79
    <>
3086 stevensc 80
      <Grid container spacing={1}>
3087 stevensc 81
        <Grid item xs md={8} display='flex' direction='column' gap={0.5}>
3083 stevensc 82
          <JobCard job={job} />
83
 
3082 stevensc 84
          <JobAttr title='Visión general' info={parse(job?.job_description)} />
2806 stevensc 85
          <JobAttr
86
            title='Último día de aplicación'
87
            info={job?.last_date_of_application}
88
          />
89
          <JobAttr title='Tipo de empleo' info={job?.employment_type} />
90
          <JobAttr title='Ubicación' info={job?.location} />
91
          <JobAttr title='Experiencia' info={job?.experience} />
92
          <JobAttr title='Salario' info={job?.salary} />
93
          <JobAttr title='Categoría' info={job?.job_category} />
94
          <JobAttr title='Habilidades' info={job?.job_skills} />
95
          <JobAttr title='Idiomas' info={job?.job_languages} />
96
          <JobAttr title='Grados' info={job?.job_degrees} />
3082 stevensc 97
        </Grid>
2806 stevensc 98
 
3087 stevensc 99
        <Grid item xs md={4} display='flex' direction='column' gap={0.5}>
3086 stevensc 100
          <Button
101
            variant={isJobApplied ? 'secondary' : 'primary'}
3083 stevensc 102
            onClick={isJobApplied ? removeApply : toggleApplyModal}
2806 stevensc 103
            disabled={loading}
104
          >
3086 stevensc 105
            {isJobApplied ? 'Quitar aplicación' : 'Aplicar'}
106
          </Button>
3085 stevensc 107
 
3086 stevensc 108
          <CompanyInfo company={job} />
3082 stevensc 109
        </Grid>
2806 stevensc 110
      </Grid>
111
 
5 stevensc 112
      <ApplyModal
113
        show={showApplyModal}
3085 stevensc 114
        profiles={job?.user_profiles}
115
        onConfirm={apply}
116
        onClose={toggleApplyModal}
5 stevensc 117
      />
118
    </>
119
  )
120
}
121
 
122
export default JobViewPage