Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3083 stevensc 1
import React, { useEffect, useState } from 'react'
2
import { useDispatch } from 'react-redux'
3092 stevensc 3
import { Box, Button, Chip, Grid, Typography } from '@mui/material'
4
import { Email, Visibility } from '@mui/icons-material'
3083 stevensc 5
 
6
import { axios, parse } from '@utils'
7
import { addNotification } from '@store/notification/notification.actions'
8
 
9
import Widget from '@components/UI/Widget'
10
 
11
export default function JobCard({
12
  job: {
3086 stevensc 13
    company_uuid: companyUuid,
14
    company_image: companyImage,
15
    job_uuid: jobUuid,
16
    job_title: jobTitle,
17
    job_description: jobDescription,
18
    total_applications: totalApplications,
19
    location,
20
    employment_type: employmentType,
21
    last_date_of_application: lastDateOfApplication,
22
    job_category: jobCategory,
23
    timeElapsed,
24
    job_skills: jobSkills,
25
    job_visits: jobVisits,
26
    job_save_operation: jobSaveOperation,
27
    company_name: companyName
3083 stevensc 28
  }
29
}) {
30
  const [isJobSaved, setIsJobSaved] = useState(false)
31
  const dispatch = useDispatch()
32
 
33
  const handleClickFollow = () => {
34
    setIsJobSaved(!isJobSaved)
35
    likeHandler()
36
  }
37
 
38
  const likeHandler = () => {
39
    axios
3086 stevensc 40
      .post(`/job/${isJobSaved ? 'remove-' : ''}save-job/${jobUuid}`)
3083 stevensc 41
      .then((response) => {
42
        const { success } = response.data
43
 
44
        if (!success) {
45
          setIsJobSaved((currentState) => !currentState)
46
          dispatch(
47
            addNotification({
48
              style: 'danger',
49
              msg: 'Ha ocurrido un error, por favor intente más tarde'
50
            })
51
          )
52
        }
53
      })
54
  }
55
 
56
  useEffect(() => {
3086 stevensc 57
    setIsJobSaved(jobSaveOperation !== 'job-save')
58
  }, [jobSaveOperation])
3083 stevensc 59
 
60
  return (
61
    <Widget>
3089 stevensc 62
      <Widget.Header
63
        avatar={`/storage/type/company/code/${companyUuid}/${
64
          companyImage ? `filename/${companyImage}` : ''
65
        }`}
66
        title={companyName}
67
        subheader={timeElapsed}
3091 stevensc 68
        renderAction={() => (
69
          <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>
70
            <Typography variant='overline'>
71
              <Email />
72
              Solicitantes {totalApplications}
73
            </Typography>
74
 
75
            <Typography variant='overline'>
76
              <Visibility /> Visto {jobVisits}
77
            </Typography>
78
          </Box>
79
        )}
3089 stevensc 80
      />
3083 stevensc 81
      <Widget.Body>
3089 stevensc 82
        <Grid container>
83
          <Grid item xs>
84
            <Typography variant='h2'>{jobTitle}</Typography>
3083 stevensc 85
 
3092 stevensc 86
            <Typography variant='overline'>Ubicación: {location}</Typography>
3083 stevensc 87
 
3089 stevensc 88
            <Typography variant='overline'>
3091 stevensc 89
              Última aplicación: {lastDateOfApplication}
3089 stevensc 90
            </Typography>
3083 stevensc 91
 
3092 stevensc 92
            <Typography variant='overline'>
93
              Tipo de empleo: {employmentType}
3091 stevensc 94
            </Typography>
3083 stevensc 95
 
3092 stevensc 96
            <Typography variant='overline'>Categoría: {jobCategory}</Typography>
3091 stevensc 97
 
3092 stevensc 98
            <Typography>Descripción: {parse(jobDescription)}</Typography>
3089 stevensc 99
          </Grid>
3083 stevensc 100
 
3089 stevensc 101
          <Grid item xs>
3092 stevensc 102
            <Typography variant='overline'>Habilidades:</Typography>
3089 stevensc 103
            {jobSkills && !!jobSkills.length && (
3091 stevensc 104
              <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>
3089 stevensc 105
                {jobSkills.map((skill) => (
106
                  <Chip key={skill} label={skill} />
107
                ))}
3091 stevensc 108
              </Box>
3089 stevensc 109
            )}
110
          </Grid>
111
        </Grid>
3083 stevensc 112
      </Widget.Body>
3092 stevensc 113
 
114
      <Widget.Actions>
115
        <Button
116
          variant={isJobSaved ? 'secondary' : 'primary'}
117
          onClick={handleClickFollow}
118
        >
119
          {isJobSaved ? 'Dejar de seguir' : 'Guardar empleo'}
120
        </Button>
121
      </Widget.Actions>
3083 stevensc 122
    </Widget>
123
  )
124
}