Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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