Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
6768 stevensc 1
import React, { useState, useRef, useEffect } from 'react'
2
import { axios } from '../../utils'
6769 stevensc 3
import { getMonthName } from '../../utils/dates'
6768 stevensc 4
import { useDispatch, useSelector } from 'react-redux'
5
import { addNotification } from '../../redux/notification/notification.actions'
6779 stevensc 6
import parse from 'html-react-parser'
6769 stevensc 7
import AddIcon from '@mui/icons-material/Add'
8
import EditIcon from '@mui/icons-material/Edit'
9
import DeleteIcon from '@mui/icons-material/Delete'
6768 stevensc 10
import IconButton from '@mui/material/IconButton'
11
 
12
import EmptySection from '../UI/EmptySection'
13
import ExperienceModal from './ExperienceModal'
6769 stevensc 14
import ConfirmModal from '../modals/ConfirmModal'
6768 stevensc 15
 
6769 stevensc 16
const ExperiencesList = ({ experiences = [], userId, isEdit }) => {
6768 stevensc 17
  const [settedExperiences, setSettedExperiences] = useState([])
18
  const [isModalOpen, setIsModalOpen] = useState(false)
19
  const actionUrl = useRef('')
20
  const actionType = useRef('add')
21
  const labels = useSelector(({ intl }) => intl.labels)
22
  const dispatch = useDispatch()
23
 
24
  const deleteExperience = (url) => {
25
    axios
26
      .post(url)
27
      .then(({ data: response }) => {
28
        const { success, data } = response
29
        if (!success) {
30
          dispatch(addNotification({ style: 'danger', msg: response.data }))
31
          return
32
        }
33
 
34
        setSettedExperiences(data)
35
      })
36
      .catch((err) => {
37
        dispatch(
38
          addNotification({ style: 'danger', msg: labels.there_was_an_error })
39
        )
40
        throw new Error(err)
41
      })
42
  }
43
 
44
  const addExperience = () => {
45
    actionUrl.current = `/profile/my-profiles/experience/${userId}/operation/add`
46
    actionType.current = 'add'
47
    setIsModalOpen(true)
48
  }
49
 
50
  const editExperience = async (url) => {
51
    actionUrl.current = url
52
    actionType.current = 'edit'
53
    setIsModalOpen(true)
54
  }
55
 
56
  useEffect(() => {
57
    setSettedExperiences(experiences)
58
  }, [experiences])
59
 
60
  return (
61
    <>
62
      <div className="profile-attr">
63
        <div className="profile-attr-header">
64
          <h2>{labels.experience}</h2>
65
          {isEdit && (
66
            <IconButton onClick={addExperience}>
67
              <AddIcon />
68
            </IconButton>
69
          )}
70
        </div>
71
        {settedExperiences.length ? (
72
          settedExperiences.map((experience) => (
6769 stevensc 73
            <ExperiencesList.Item
6768 stevensc 74
              key={`${experience.company} - ${experience.title}`}
75
              experience={experience}
76
              onDelete={deleteExperience}
77
              onEdit={editExperience}
78
              isEdit={isEdit}
79
            />
80
          ))
81
        ) : (
82
          <EmptySection align="left" message={labels.empty} />
83
        )}
84
      </div>
85
      <ExperienceModal
86
        show={isModalOpen}
87
        url={actionUrl.current}
88
        onClose={() => setIsModalOpen(false)}
89
        onComplete={(value) => setSettedExperiences(value)}
90
        isEdit={actionType.current === 'edit'}
91
      />
92
    </>
93
  )
94
}
95
 
6769 stevensc 96
const Experience = ({ experience, onDelete, onEdit, isEdit }) => {
97
  const [isShow, setIsShow] = useState(false)
98
 
99
  const toggleConfirmModal = () => {
100
    setIsShow(!isShow)
101
  }
102
 
103
  return (
104
    <>
105
      <div className="experience-item">
106
        <div className="experience-item-header">
107
          <h3>{experience.company}</h3>
108
          {isEdit && (
109
            <div className="icon-buttons-group">
110
              <IconButton onClick={() => onEdit(experience.link_edit)}>
111
                <EditIcon />
112
              </IconButton>
113
              <IconButton onClick={toggleConfirmModal}>
114
                <DeleteIcon />
115
              </IconButton>
116
            </div>
117
          )}
118
        </div>
119
        <h4>{experience.title}</h4>
120
        <p>
121
          {`${getMonthName(experience.from_month)} ${experience.from_year} - ${
122
            experience.is_current === 'y'
123
              ? 'Actual'
124
              : `${getMonthName(experience.to_month)} ${experience.to_year}`
125
          }`}
126
        </p>
127
        <p>{`${experience.industry.name || experience.industry} / ${
128
          experience.size
129
        }`}</p>
130
        <p>{experience.formatted_address}</p>
6779 stevensc 131
        {experience.description && parse(experience.description)}
6769 stevensc 132
      </div>
133
      <ConfirmModal
134
        show={isShow}
135
        onClose={toggleConfirmModal}
136
        onAccept={() => onDelete(experience.link_delete)}
137
      />
138
    </>
139
  )
140
}
141
 
142
ExperiencesList.Item = Experience
143
 
144
export default ExperiencesList