Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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