Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
5 stevensc 1
import React, { useEffect, useState } from 'react'
2
import { axios } from '../../utils'
3
import { useParams } from 'react-router-dom'
4
import { useDispatch } from 'react-redux'
5
import { getBackendVars } from '../../services/backendVars'
6
import { addNotification } from '../../redux/notification/notification.actions'
7
import { Container, Grid, Tab, Tabs } from '@mui/material'
8
import parse from 'html-react-parser'
9
import styled from 'styled-components'
10
 
11
import Description from '../../components/job/Description'
12
import JobAttr from '../../components/job/JobAttr'
13
import ClientInfo from '../../components/job/ClientInfo'
14
import ApplyModal from '../../components/job/ApplyModal'
15
 
16
const Col = styled(Grid)`
17
  display: flex;
18
  flex-direction: column !important;
19
  gap: 0.5rem;
20
`
21
 
22
const JobViewPage = () => {
23
  const [job, setJob] = useState({})
24
  const [isJobApplied, setIsJobApplied] = useState(false)
25
  const [showApplyModal, setShowApplyModal] = useState(false)
26
  const [loading, setLoading] = useState(false)
27
  const { uuid } = useParams()
28
  const dispatch = useDispatch()
29
 
30
  const handleShowApplyModal = () => {
31
    setShowApplyModal(!showApplyModal)
32
  }
33
 
34
  const handleApply = () => {
35
    setIsJobApplied(!isJobApplied)
36
  }
37
 
38
  const getJob = () => {
39
    getBackendVars(`/job/view/${uuid}`)
40
      .then((response) => {
41
        setJob(response)
42
      })
43
      .catch((error) => {
2194 stevensc 44
        dispatch(addNotification({ style: 'danger', msg: error.message }))
5 stevensc 45
      })
46
  }
47
 
48
  const removeApply = async () => {
49
    setLoading(true)
50
    axios
51
      .post(`/job/remove-apply-job/${job}`)
52
      .then(({ data: response }) => {
53
        const { data, success } = response
54
 
55
        if (!success) {
56
          const errorMessage =
57
            typeof data === 'string'
58
              ? data
59
              : 'Ha ocurrido un error, por favor intente más tarde'
60
 
61
          dispatch(addNotification({ styled: 'danger', msg: errorMessage }))
62
        }
63
 
64
        handleApply()
65
      })
66
      .finally(() => setLoading(false))
67
  }
68
 
69
  useEffect(() => {
70
    getJob()
71
  }, [])
72
 
73
  useEffect(() => {
74
    setIsJobApplied(job?.job_apply_operation === 'remove-apply')
75
  }, [job])
76
 
77
  return (
78
    <>
2194 stevensc 79
      <Container as='main' className='px-0'>
5 stevensc 80
        <Tabs>
2194 stevensc 81
          <Tab label='Avance' value='user' disableRipple />
82
          <Tab label='Información' value='group' disableRipple />
5 stevensc 83
        </Tabs>
84
        <Grid container spacing={2}>
85
          <Col item xs={12} md={8} spacing={3}>
86
            <Description
87
              jobId={job?.job_uuid}
88
              companyId={job?.company_uuid}
89
              companyImage={job?.company_image}
90
              jobTitle={job?.job_title}
91
              companyName={job?.company_name}
92
              timeElapsed={job?.timeElapsed}
93
              location={job?.location}
94
              jobSaved={job?.job_save_operation}
95
              lastDateOfApplication={job?.last_date_of_application}
96
              employmentType={job?.employment_type}
97
              jobCategory={job?.job_category}
98
              jobDescription={job?.job_description}
99
              jobSkills={job?.job_skills}
100
              totalApplications={job?.total_applications}
101
              jobVisits={job?.job_visits}
102
            />
103
            <JobAttr
2194 stevensc 104
              title='Visión general'
5 stevensc 105
              info={job?.job_description && parse(job?.job_description)}
106
            />
107
            <JobAttr
2194 stevensc 108
              title='Último día de aplicación'
5 stevensc 109
              info={job?.last_date_of_application}
110
            />
2194 stevensc 111
            <JobAttr title='Tipo de empleo' info={job?.employment_type} />
112
            <JobAttr title='Ubicación' info={job?.location} />
113
            <JobAttr title='Experiencia' info={job?.experience} />
114
            <JobAttr title='Salario' info={job?.salary} />
115
            <JobAttr title='Categoría' info={job?.job_category} />
116
            <JobAttr title='Habilidades' info={job?.job_skills} />
117
            <JobAttr title='Idiomas' info={job?.job_languages} />
118
            <JobAttr title='Grados' info={job?.job_degrees} />
5 stevensc 119
          </Col>
120
 
121
          <Col item xs={12} md={4}>
122
            <button
2194 stevensc 123
              type='button'
5 stevensc 124
              className={`btn ${
125
                isJobApplied ? 'btn-secondary' : 'btn-primary'
126
              }`}
127
              onClick={isJobApplied ? removeApply : handleShowApplyModal}
128
              disabled={loading}
129
            >
130
              {isJobApplied ? 'Quitar aplicación' : 'Aplicar'}
131
            </button>
132
            <ClientInfo
133
              companySize={job?.company_size}
134
              companyAddress={job?.company_address}
135
              companyWebsite={job?.company_website}
136
              companyIndustry={job?.company_industry}
137
              companyFoundationYear={job?.company_foundation_year}
138
            />
139
          </Col>
140
        </Grid>
141
      </Container>
142
      <ApplyModal
143
        jobId={job?.job_uuid}
144
        show={showApplyModal}
145
        onApplied={handleApply}
146
        userProfiles={job?.user_profiles}
147
        onHide={() => setShowApplyModal(false)}
148
      />
149
    </>
150
  )
151
}
152
 
153
export default JobViewPage