Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6801 | Rev 6806 | 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 = '',
26
  user_profile_id: profileId,
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
    setConnectionUrl(RequestConnectionUrl || CancelConnectionUrl)
96
    setSettedOverview(overview)
97
    setProfileImg(image)
98
    setCoverImg(cover)
99
  }, [RequestConnectionUrl, CancelConnectionUrl, overview, image, cover])
100
 
6794 stevensc 101
  return (
102
    <>
103
      <section className="profile__user-card">
104
        <div className="cover__image-container">
105
          <img alt="Background Image" src={coverImg} />
106
          {PATH.includes('edit') && (
107
            <button
108
              className="button-icon cover__edit-btn"
109
              onClick={() => setModalToShow('cover')}
110
            >
111
              <EditIcon />
112
            </button>
113
          )}
114
        </div>
115
        <section className="px-4 pb-4">
116
          <div className="card__image-options">
117
            <img
118
              alt="Profile Image"
119
              className={`img ${PATH.includes('edit') && 'cursor-pointer'}`}
120
              src={profileImg}
121
              onClick={() => PATH.includes('edit') && setModalToShow('image')}
122
            />
123
            {PATH.includes('edit') && (
124
              <button
125
                className="button-icon"
126
                onClick={() => setModalToShow('overview')}
127
              >
128
                <EditIcon />
129
              </button>
130
            )}
131
          </div>
132
          <div className="card-content">
133
            <div className="card-info">
134
              <h1>{fullName}</h1>
135
              {parse(settedOverview.replaceAll('h1', 'p'))}
136
              <div
137
                className="d-inline-flex align-items-center mt-2"
138
                style={{ gap: '1rem' }}
139
              >
140
                <span>{formattedAddress}</span>
141
                <a
142
                  href=""
143
                  onClick={(e) => {
144
                    e.preventDefault()
145
                    setModalToShow('info')
146
                  }}
147
                >
6802 stevensc 148
                  {labels.personal_info}
6794 stevensc 149
                </a>
150
              </div>
151
              <div
152
                className="d-inline-flex align-items-center mt-2"
153
                style={{ gap: '1rem' }}
154
              >
155
                {Boolean(totalConnections) && view_total_connections && (
156
                  <a href="/connection/my-connections" target="_blank">
6802 stevensc 157
                    {`${totalConnections} ${labels.connections}`}
6794 stevensc 158
                  </a>
159
                )}
160
                {Boolean(follower) && view_following && (
161
                  <a
162
                    href=""
163
                    className="cursor-auto"
164
                    onClick={(e) => e.preventDefault()}
165
                  >
6802 stevensc 166
                    {`${follower} ${labels.followers}`}
6794 stevensc 167
                  </a>
168
                )}
169
                {Boolean(following) && view_following && (
170
                  <a href="/company/following-companies" target="_blank">
6802 stevensc 171
                    {`${following} ${labels.following}`}
6794 stevensc 172
                  </a>
173
                )}
174
              </div>
175
              <div className="button-actions mt-2">
176
                {connectionUrl && isAdded && (
177
                  <button
178
                    className="btn button btn-primary"
179
                    onClick={() => displayModal()}
180
                  >
6802 stevensc 181
                    {labels.cancel}
6794 stevensc 182
                  </button>
183
                )}
184
                {connectionUrl && !isAdded && (
185
                  <button
186
                    className="btn button btn-primary"
187
                    onClick={() => connect()}
188
                  >
6802 stevensc 189
                    {labels.connect}
6794 stevensc 190
                  </button>
191
                )}
192
                {showContact && (
193
                  <a href={linkInmail} className="btn button btn-secondary">
6802 stevensc 194
                    {labels.message}
6794 stevensc 195
                  </a>
196
                )}
197
              </div>
198
            </div>
199
            <div className="card-experiences">
200
              <ul>
201
                {experiences.map(
202
                  ({ company, title, industry, size }, index) => (
203
                    <li key={index}>
204
                      <span>{`${company} - ${title}`}</span>
205
                      <p>{`${industry} / ${size}`}</p>
206
                    </li>
207
                  )
208
                )}
209
              </ul>
210
            </div>
211
          </div>
212
        </section>
213
      </section>
214
      <OverviewModal
215
        isOpen={modalToShow === 'overview'}
216
        overview={settedOverview}
217
        id={profileId}
218
        closeModal={() => closeModal()}
219
        onComplete={(newOverview) => setSettedOverview(newOverview)}
220
      />
221
      <CoverModal
222
        isOpen={modalToShow === 'cover'}
6800 stevensc 223
        size={sizes}
6794 stevensc 224
        onClose={() => closeModal()}
225
        onComplete={(newImage) => setCoverImg(newImage)}
226
      />
227
      <ImageModal
228
        show={modalToShow === 'image'}
229
        id={profileId}
6800 stevensc 230
        sizes={sizes}
6794 stevensc 231
        onClose={() => closeModal()}
232
        onComplete={(newImage) => setProfileImg(newImage)}
233
      />
234
      <ProfileCard.Modal
235
        show={modalToShow === 'info'}
236
        closeModal={() => closeModal()}
237
        fullName={fullName}
238
        facebook={facebook}
239
        twitter={twitter}
240
        instagram={instagram}
241
        following={following}
242
        formatted_address={formattedAddress}
243
        overview={overview}
244
        total_connections={totalConnections}
245
        follower={follower}
246
      />
247
      <ConfirmModal
248
        show={isModalShow}
249
        onClose={() => setIsModalShow(false)}
250
        onAccept={() => connect()}
251
      />
252
    </>
253
  )
254
}
255
 
256
const InfoModal = ({
257
  show,
258
  closeModal,
259
  facebook,
260
  following,
261
  formatted_address,
262
  fullName,
263
  instagram,
264
  overview,
265
  total_connections,
266
  twitter,
267
  follower,
268
}) => {
269
  const labels = useSelector(({ intl }) => intl.labels)
270
 
271
  return (
272
    <Modal show={show} onHide={closeModal}>
273
      <Modal.Header closeButton>
6802 stevensc 274
        <h2>{labels.about_group}</h2>
6794 stevensc 275
      </Modal.Header>
276
      <Modal.Body>
277
        <div className="description__label">
6802 stevensc 278
          <label htmlFor="name">{labels.first_name}</label>
6794 stevensc 279
          <p>{fullName}</p>
280
        </div>
281
        {overview && (
282
          <div className="description__label">
6802 stevensc 283
            <label htmlFor="name">{labels.description}</label>
6794 stevensc 284
            {parse(overview)}
285
          </div>
286
        )}
287
        {formatted_address && (
288
          <div className="description__label">
6802 stevensc 289
            <label htmlFor="name">{labels.location}</label>
6794 stevensc 290
            <p>{formatted_address}</p>
291
          </div>
292
        )}
293
        {total_connections && (
294
          <div className="description__label">
6802 stevensc 295
            <label htmlFor="name">{labels.connections}</label>
6794 stevensc 296
            <p>{total_connections}</p>
297
          </div>
298
        )}
299
        {follower && (
300
          <div className="description__label">
6802 stevensc 301
            <label htmlFor="name">{labels.followers}</label>
6794 stevensc 302
            <p>{follower}</p>
303
          </div>
304
        )}
305
        {following && (
306
          <div className="description__label">
6802 stevensc 307
            <label htmlFor="name">{labels.following}</label>
6794 stevensc 308
            <p>{following}</p>
309
          </div>
310
        )}
311
        <div className="description__label">
6802 stevensc 312
          <label htmlFor="name">{labels.social_networks}</label>
6794 stevensc 313
          {facebook && (
314
            <a href={facebook} target="_blank" rel="noreferrer">
315
              <p className="mb-1">{facebook}</p>
316
            </a>
317
          )}
318
          {instagram && (
319
            <a href={instagram} target="_blank" rel="noreferrer">
320
              <p className="mb-1">{instagram}</p>
321
            </a>
322
          )}
323
          {twitter && (
324
            <a href={twitter} target="_blank" rel="noreferrer">
325
              <p className="mb-1">{twitter}</p>
326
            </a>
327
          )}
328
        </div>
329
      </Modal.Body>
330
    </Modal>
331
  )
332
}
333
 
334
ProfileCard.Modal = InfoModal
335
 
336
export default ProfileCard