Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
5473 stevensc 1
/* eslint-disable camelcase */
2
/* eslint-disable indent */
3
/* eslint-disable react/prop-types */
4
import React, { useState } from 'react'
5
import parse from 'html-react-parser'
6
import EditIcon from '@mui/icons-material/EditOutlined'
5868 stevensc 7
import { axios } from '../../../../../../utils'
5473 stevensc 8
import { useDispatch } from 'react-redux'
5868 stevensc 9
import { addNotification } from '../../../../../../redux/notification/notification.actions'
5473 stevensc 10
import { Modal } from 'react-bootstrap'
5868 stevensc 11
import ImageModal from '../../../../../../shared/profile/edit/profile-info/profile-img/ImageModal'
12
import { profileTypes } from '../../../../../../shared/profile/Profile.types'
13
import CoverModal from '../../../../../../shared/cover/CoverModal'
14
import OverviewModal from '../../../../../components/overview/OverviewModal'
15
import ConfirmModal from '../../../../../../shared/confirm-modal/ConfirmModal'
5473 stevensc 16
 
17
const ProfileCard = ({
5868 stevensc 18
  fullName = '',
19
  overview = '',
20
  formatted_address: formattedAddress = '',
21
  total_connections: totalConnections,
22
  showContact = false,
23
  userExperiences = [],
24
  linkInmail = '',
25
  CancelConnectionUrl = '',
26
  RequestConnectionUrl = '',
27
  image = '',
28
  cover = '',
29
  userIdEncrypted,
30
  userProfileIdEncrypted,
31
  follower,
32
  following,
33
  facebook,
34
  twitter,
35
  instagram,
36
  imageProfileCover,
37
  imageSizeCover,
38
  view_following,
39
  view_total_connections,
5473 stevensc 40
}) => {
5868 stevensc 41
  const [isAdded, setIsAdded] = useState(!RequestConnectionUrl)
42
  const [connectionUrl, setConnectionUrl] = useState(
43
    RequestConnectionUrl || CancelConnectionUrl
44
  )
45
  const [isModalShow, setIsModalShow] = useState(false)
46
  const dispatch = useDispatch()
47
  const PATH = window.location.pathname
5473 stevensc 48
 
5868 stevensc 49
  // modals state
50
  const [modalToShow, setModalToShow] = useState(null)
51
  const [settedOverview, setSettedOverview] = useState(overview)
52
  const [profileImg, setProfileImg] = useState({
53
    path: `/storage/type/user-profile/code/${userIdEncrypted}/${
54
      image ? `filename/${image}` : ''
55
    }`,
56
  })
57
  const [coverImg, setCoverImg] = useState({
58
    path: `/storage/type/user-cover/code/${userIdEncrypted}/${
59
      cover ? `filename/${cover}` : ''
60
    }`,
61
  })
5473 stevensc 62
 
5868 stevensc 63
  const displayModal = () => setIsModalShow(!isModalShow)
5473 stevensc 64
 
5868 stevensc 65
  const getProfileData = async () => {
66
    try {
67
      const { data: response } = await axios.get(window.location.href)
5473 stevensc 68
 
5868 stevensc 69
      if (response.link_request) {
70
        return setConnectionUrl(response.link_request)
71
      }
5473 stevensc 72
 
5868 stevensc 73
      return setConnectionUrl(response.link_cancel)
74
    } catch (error) {
75
      console.log(error)
76
      return dispatch(
77
        addNotification({ style: 'danger', msg: 'Ha ocurrido un error' })
78
      )
5473 stevensc 79
    }
5868 stevensc 80
  }
5473 stevensc 81
 
5868 stevensc 82
  const connect = async () => {
83
    try {
84
      const { data: response } = await axios.post(connectionUrl)
5473 stevensc 85
 
5868 stevensc 86
      if (!response.success) {
87
        return dispatch(
88
          addNotification({ style: 'danger', msg: response.data })
89
        )
90
      }
5473 stevensc 91
 
5868 stevensc 92
      if (response.success && isModalShow) {
93
        displayModal()
94
      }
5473 stevensc 95
 
5868 stevensc 96
      await getProfileData()
97
      dispatch(addNotification({ style: 'success', msg: response.data }))
98
      setIsAdded(!isAdded)
99
    } catch (error) {
100
      dispatch(
101
        addNotification({ style: 'danger', msg: `Error: ${error.message}` })
102
      )
5473 stevensc 103
    }
5868 stevensc 104
  }
5473 stevensc 105
 
5868 stevensc 106
  const closeModal = () => setModalToShow(null)
5473 stevensc 107
 
5868 stevensc 108
  return (
109
    <>
110
      <section className="profile__user-card">
111
        <div className="cover__image-container">
112
          <img alt="Background Image" src={coverImg.path} />
113
          {PATH.includes('edit') && (
114
            <button
115
              className="button-icon cover__edit-btn"
116
              onClick={() => setModalToShow('cover')}
117
            >
118
              <EditIcon />
119
            </button>
120
          )}
121
        </div>
122
        <section className="px-4 pb-4">
123
          <div className="card__image-options">
124
            <img
125
              alt="Profile Image"
126
              className={`img ${PATH.includes('edit') && 'cursor-pointer'}`}
127
              src={profileImg.path}
128
              onClick={() => PATH.includes('edit') && setModalToShow('image')}
5473 stevensc 129
            />
5868 stevensc 130
            {PATH.includes('edit') && (
131
              <button
132
                className="button-icon"
133
                onClick={() => setModalToShow('overview')}
134
              >
135
                <EditIcon />
136
              </button>
137
            )}
138
          </div>
139
          <div className="card-content">
140
            <div className="card-info">
141
              <h1>{fullName}</h1>
142
              {parse(settedOverview.replaceAll('h1', 'p'))}
143
              <div
144
                className="d-inline-flex align-items-center mt-2"
145
                style={{ gap: '1rem' }}
146
              >
147
                <span>{formattedAddress}</span>
148
                <a
149
                  href=""
150
                  onClick={(e) => {
151
                    e.preventDefault()
152
                    setModalToShow('info')
153
                  }}
154
                >
155
                  {LABELS.PERSONAL_INFO}
156
                </a>
157
              </div>
158
              <div
159
                className="d-inline-flex align-items-center mt-2"
160
                style={{ gap: '1rem' }}
161
              >
162
                {Boolean(totalConnections) && view_total_connections && (
163
                  <a href="/connection/my-connections" target="_blank">
164
                    {`${totalConnections} ${LABELS.CONNECTIONS}`}
165
                  </a>
166
                )}
167
                {Boolean(follower) && view_following && (
168
                  <a
169
                    href=""
170
                    className="cursor-auto"
171
                    onClick={(e) => e.preventDefault()}
172
                  >
173
                    {`${follower} ${LABELS.FOLLOWERS}`}
174
                  </a>
175
                )}
176
                {Boolean(following) && view_following && (
177
                  <a href="/company/following-companies" target="_blank">
178
                    {`${following} ${LABELS.FOLLOWING}`}
179
                  </a>
180
                )}
181
              </div>
182
              <div className="button-actions mt-2">
183
                {connectionUrl && isAdded && (
184
                  <button
185
                    className="btn button btn-primary"
186
                    onClick={() => displayModal()}
187
                  >
188
                    {LABELS.CANCEL}
189
                  </button>
190
                )}
191
                {connectionUrl && !isAdded && (
192
                  <button
193
                    className="btn button btn-primary"
194
                    onClick={() => connect()}
195
                  >
196
                    {LABELS.CONNECT}
197
                  </button>
198
                )}
199
                {showContact && (
200
                  <a href={linkInmail} className="btn button btn-secondary">
201
                    {LABELS.MESSAGE}
202
                  </a>
203
                )}
204
              </div>
205
            </div>
206
            <div className="card-experiences">
207
              <ul>
208
                {userExperiences.map(
209
                  ({ company, title, industry, size }, index) => (
210
                    <li key={index}>
211
                      <span>{`${company} - ${title}`}</span>
212
                      <p>{`${industry} / ${size}`}</p>
213
                    </li>
214
                  )
215
                )}
216
              </ul>
217
            </div>
218
          </div>
219
        </section>
220
      </section>
221
      <OverviewModal
222
        isOpen={modalToShow === 'overview'}
223
        overview={settedOverview}
224
        userIdEncrypted={userProfileIdEncrypted}
225
        closeModal={() => closeModal()}
226
        setOverview={(newOverview) => setSettedOverview(newOverview)}
227
      />
228
      <CoverModal
5874 stevensc 229
        isOpen={modalToShow === 'cover'}
230
        type={profileTypes.USER}
231
        size={imageSizeCover}
232
        id={userIdEncrypted}
233
        onClose={() => closeModal()}
234
        onComplete={(newImage) => setCoverImg(newImage)}
5868 stevensc 235
      />
236
      <ImageModal
237
        handleModalOpen={() => closeModal()}
238
        isModalOpen={modalToShow === 'image'}
239
        profileId={userProfileIdEncrypted}
240
        imageProfileCover={imageProfileCover}
241
        profileType={profileTypes.USER}
242
        setProfileImg={(newImage) => setProfileImg(newImage)}
243
      />
244
      <ProfileCard.Modal
245
        show={modalToShow === 'info'}
246
        closeModal={() => closeModal()}
247
        fullName={fullName}
248
        facebook={facebook}
249
        twitter={twitter}
250
        instagram={instagram}
251
        following={following}
252
        formatted_address={formattedAddress}
253
        overview={overview}
254
        total_connections={totalConnections}
255
        follower={follower}
256
      />
257
      <ConfirmModal
258
        show={isModalShow}
259
        onClose={() => setIsModalShow(false)}
260
        onAccept={() => connect()}
261
      />
262
    </>
263
  )
5473 stevensc 264
}
265
 
266
const InfoModal = ({
5868 stevensc 267
  show,
268
  closeModal,
269
  facebook,
270
  following,
271
  formatted_address,
272
  fullName,
273
  instagram,
274
  overview,
275
  total_connections,
276
  twitter,
277
  follower,
5473 stevensc 278
}) => {
5868 stevensc 279
  return (
280
    <Modal show={show} onHide={closeModal}>
281
      <Modal.Header closeButton>
282
        <h2>{LABELS.ABOUT_GROUP}</h2>
283
      </Modal.Header>
284
      <Modal.Body>
285
        <div className="description__label">
286
          <label htmlFor="name">{LABELS.FIRST_NAME}</label>
287
          <p>{fullName}</p>
288
        </div>
289
        {overview && (
290
          <div className="description__label">
291
            <label htmlFor="name">{LABELS.DESCRIPTION}</label>
292
            {parse(overview)}
293
          </div>
294
        )}
295
        {formatted_address && (
296
          <div className="description__label">
297
            <label htmlFor="name">{LABELS.LOCATION}</label>
298
            <p>{formatted_address}</p>
299
          </div>
300
        )}
301
        {total_connections && (
302
          <div className="description__label">
303
            <label htmlFor="name">{LABELS.CONNECTIONS}</label>
304
            <p>{total_connections}</p>
305
          </div>
306
        )}
307
        {follower && (
308
          <div className="description__label">
309
            <label htmlFor="name">{LABELS.FOLLOWERS}</label>
310
            <p>{follower}</p>
311
          </div>
312
        )}
313
        {following && (
314
          <div className="description__label">
315
            <label htmlFor="name">{LABELS.FOLLOWING}</label>
316
            <p>{following}</p>
317
          </div>
318
        )}
319
        <div className="description__label">
320
          <label htmlFor="name">{LABELS.SOCIAL_NETWORKS}</label>
321
          {facebook && (
322
            <a href={facebook} target="_blank" rel="noreferrer">
323
              <p className="mb-1">{facebook}</p>
324
            </a>
325
          )}
326
          {instagram && (
327
            <a href={instagram} target="_blank" rel="noreferrer">
328
              <p className="mb-1">{instagram}</p>
329
            </a>
330
          )}
331
          {twitter && (
332
            <a href={twitter} target="_blank" rel="noreferrer">
333
              <p className="mb-1">{twitter}</p>
334
            </a>
335
          )}
336
        </div>
337
      </Modal.Body>
338
    </Modal>
339
  )
5473 stevensc 340
}
341
 
342
ProfileCard.Modal = InfoModal
343
 
344
export default ProfileCard