Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7314 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
7316 stevensc 1
import React, { useEffect, useState } from 'react'
7268 stevensc 2
import { axios } from '../../utils'
7271 stevensc 3
import { useDispatch } from 'react-redux'
7268 stevensc 4
import { addNotification } from '../../redux/notification/notification.actions'
5
import parse from 'html-react-parser'
7271 stevensc 6
import Avatar from '@mui/material/Avatar'
7
import { Favorite, FavoriteBorder } from '@mui/icons-material'
8
import AccessTimeIcon from '@mui/icons-material/AccessTime'
9
import LocationOnIcon from '@mui/icons-material/LocationOn'
10
import VisibilityIcon from '@mui/icons-material/Visibility'
11
import EmailIcon from '@mui/icons-material/Email'
12
 
7268 stevensc 13
import styled from 'styled-components'
7271 stevensc 14
import WidgetLayout from '../widgets/WidgetLayout'
7268 stevensc 15
 
7271 stevensc 16
const StyledContainer = styled(WidgetLayout)`
17
  padding: 1rem;
7272 stevensc 18
  h3 {
19
    font-size: 1.1rem;
20
    font-weight: 600;
21
    color: var(--title-color);
22
  }
23
  span {
24
    font-weight: 600;
25
    color: var(--subtitle-color);
7279 stevensc 26
    display: flex;
27
    align-items: center;
7272 stevensc 28
  }
7316 stevensc 29
  p {
30
    font-size: 1rem;
31
    color: var(--font-color);
32
  }
7272 stevensc 33
  .info {
34
    align-items: center;
35
    display: inline-flex;
36
    gap: 0.5rem;
37
  }
38
  .name {
39
    display: flex;
40
    flex-direction: column;
41
  }
7273 stevensc 42
  .details {
43
    display: flex;
44
    align-items: center;
45
    justify-content: space-between;
46
    gap: 0.5rem;
47
  }
7316 stevensc 48
  .job {
49
    display: flex;
50
    flex-direction: column;
51
    gap: 5px;
52
  }
7271 stevensc 53
`
54
 
55
const StyledHeart = styled(Favorite)`
56
  animation: heartBeatAnimation 0.2s linear;
57
 
58
  @keyframes heartBeatAnimation {
59
    0% {
60
      transform: scale(1);
61
    }
62
    50% {
63
      transform: scale(1.3);
64
    }
65
    100% {
66
      transform: scale(1);
67
    }
7268 stevensc 68
  }
7271 stevensc 69
`
70
 
71
const StyledHeartOutline = styled(FavoriteBorder)`
72
  animation: heartBeatAnimation 0.2s linear;
73
 
7268 stevensc 74
  @keyframes heartBeatAnimation {
75
    0% {
76
      transform: scale(1);
77
    }
78
    50% {
79
      transform: scale(1.3);
80
    }
81
    100% {
82
      transform: scale(1);
83
    }
84
  }
85
`
86
 
87
const Description = ({
7312 stevensc 88
  jobId = '',
89
  companyId = '',
90
  companyImage = '',
91
  jobTitle = '',
92
  companyName = '',
93
  timeElapsed = '',
94
  location = '',
95
  jobSaved = false,
96
  lastDateOfApplication = '',
97
  employmentType = '',
98
  jobCategory = '',
99
  jobDescription = '',
100
  jobSkills = [],
101
  totalApplications = 0,
102
  jobVisits = 0,
7268 stevensc 103
}) => {
7316 stevensc 104
  const [isJobSaved, setIsJobSaved] = useState(false)
7271 stevensc 105
  const dispatch = useDispatch()
7268 stevensc 106
 
107
  const handleClickFollow = () => {
108
    setIsJobSaved(!isJobSaved)
109
    likeHandler()
110
  }
111
 
112
  const likeHandler = () => {
113
    axios
114
      .post(`/job/${isJobSaved ? 'remove-' : ''}save-job/${jobId}`)
7271 stevensc 115
      .then((response) => {
116
        const { success } = response.data
117
 
118
        if (!success) {
7268 stevensc 119
          setIsJobSaved((currentState) => !currentState)
7271 stevensc 120
          dispatch(
121
            addNotification({
122
              style: 'danger',
123
              msg: 'Ha ocurrido un error, por favor intente más tarde',
124
            })
125
          )
7268 stevensc 126
        }
127
      })
128
  }
129
 
7316 stevensc 130
  useEffect(() => {
131
    setIsJobSaved(jobSaved !== 'job-save')
132
  }, [jobSaved])
133
 
7268 stevensc 134
  return (
7271 stevensc 135
    <StyledContainer>
7272 stevensc 136
      <div className="info">
7271 stevensc 137
        <Avatar
138
          src={`/storage/type/company/code/${companyId}/${
139
            companyImage ? `filename/${companyImage}` : ''
140
          }`}
141
          sx={{ width: '50px', height: '50px' }}
142
        />
7272 stevensc 143
 
144
        <div className="name">
7271 stevensc 145
          <h3>{jobTitle}</h3>
146
          <p>{companyName}</p>
147
          <span>
7316 stevensc 148
            <AccessTimeIcon sx={{ fontSize: '1rem' }} />
7271 stevensc 149
            Posteado hace {timeElapsed}
150
          </span>
7268 stevensc 151
        </div>
152
      </div>
153
 
7271 stevensc 154
      <div className="details">
155
        <span>
7316 stevensc 156
          <LocationOnIcon sx={{ color: '#cd5c5c' }} />
7271 stevensc 157
          {location}
158
        </span>
159
 
160
        <span>
161
          {isJobSaved ? (
7316 stevensc 162
            <StyledHeart sx={{ color: 'red' }} onClick={handleClickFollow} />
7271 stevensc 163
          ) : (
7316 stevensc 164
            <StyledHeartOutline
165
              sx={{ color: 'red' }}
166
              onClick={handleClickFollow}
167
            />
7268 stevensc 168
          )}
7271 stevensc 169
          Última aplicación : {lastDateOfApplication}
170
        </span>
7268 stevensc 171
      </div>
7271 stevensc 172
 
7272 stevensc 173
      <div className="job">
7271 stevensc 174
        <h3>{employmentType}</h3>
175
        <h3>{jobCategory}</h3>
7311 stevensc 176
        <div>{jobDescription && parse(jobDescription)}</div>
7271 stevensc 177
 
7314 stevensc 178
        {jobSkills && !!jobSkills.length && (
7271 stevensc 179
          <ul className="skill-tags">
180
            {jobSkills.map((skill, index) => (
181
              <li key={index}>
182
                <span>{skill}</span>
183
              </li>
184
            ))}
185
          </ul>
186
        )}
187
        <span>
188
          <EmailIcon />
189
          Solicitantes {totalApplications}
190
        </span>
7268 stevensc 191
      </div>
7271 stevensc 192
 
193
      <span>
194
        <VisibilityIcon /> Visto {jobVisits}
195
      </span>
196
    </StyledContainer>
7268 stevensc 197
  )
198
}
199
 
7271 stevensc 200
export default Description