Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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