Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
5115 stevensc 1
/* eslint-disable camelcase */
3207 stevensc 2
/* eslint-disable react/prop-types */
5115 stevensc 3
import React, { useEffect, useState, useRef } from 'react'
4
import parse from 'html-react-parser'
5414 stevensc 5
import { useDispatch, useSelector } from 'react-redux'
5115 stevensc 6
import { axios } from '../../../utils'
5579 stevensc 7
import {
8
  EmailIcon,
9
  EmailShareButton,
10
  FacebookIcon,
11
  FacebookShareButton,
12
  RedditIcon,
13
  RedditShareButton,
14
  TelegramIcon,
15
  TelegramShareButton,
16
  TwitterIcon,
17
  TwitterShareButton,
18
  WhatsappIcon,
19
  WhatsappShareButton,
20
} from 'react-share'
1 www 21
 
4017 stevensc 22
// Redux types
5115 stevensc 23
import { shareModalTypes } from '../../../redux/share-modal/shareModal.types'
24
import { feedTypes } from '../../../redux/feed/feed.types'
4017 stevensc 25
 
1034 stevensc 26
// Redux actions
5115 stevensc 27
import { openShareModal } from '../../../redux/share-modal/shareModal.actions'
28
import { addNotification } from '../../../redux/notification/notification.actions'
1034 stevensc 29
 
5115 stevensc 30
// Components
31
import FeedModal from './FeedModal'
32
import FeedHeader from './FeedHeader'
33
import FeedCommentSection from './feed-comment/FeedCommentSection'
34
 
4017 stevensc 35
const Feed = ({ feed, owner_shared, image }) => {
1 www 36
  // Destructuring feed data
37
  const {
38
    feed_unique,
39
    owner_name,
40
    owner_url,
41
    owner_image,
42
    owner_time_elapse,
43
    owner_file_image,
44
    owner_file_video,
45
    owner_file_document,
2572 stevensc 46
    feed_likes,
1 www 47
    feed_like_url,
48
    feed_unlike_url,
49
    feed_is_liked,
3207 stevensc 50
    feed_highlighted,
1 www 51
    feed_share_url,
52
    feed_delete_url,
53
    comments,
54
    comment_add_url,
5579 stevensc 55
    feed_share_external_url,
5115 stevensc 56
  } = feed
1 www 57
 
1034 stevensc 58
  const dispatch = useDispatch()
1 www 59
 
5115 stevensc 60
  const [totalComments, setTotalComments] = useState(comments.length || 0)
61
  const [feedIsLiked, setFeedIsLiked] = useState(feed_is_liked)
62
  const [sharedState, setSharedState] = useState(owner_shared)
63
  const [likesState, setLikesState] = useState(feed_likes)
64
  const [shareUrl, setShareUrl] = useState('')
65
  const [showComments, setShowComments] = useState(false)
3630 stevensc 66
 
3308 stevensc 67
  const [shareOptions, setShareOptions] = useState(false)
5115 stevensc 68
  const [show, setShow] = useState(false)
1 www 69
 
5115 stevensc 70
  const shareContainer = useRef(null)
1034 stevensc 71
 
5115 stevensc 72
  useEffect(() => setSharedState(owner_shared), [owner_shared])
1030 stevensc 73
 
3310 stevensc 74
  useEffect(() => {
75
    const handleClickOutside = (event) => {
5579 stevensc 76
      if (
77
        shareContainer.current &&
78
        !shareContainer.current.contains(event.target)
79
      ) {
3323 stevensc 80
        setShareOptions(false)
3310 stevensc 81
      }
82
    }
5115 stevensc 83
    document.addEventListener('mousedown', handleClickOutside)
3310 stevensc 84
 
85
    return () => {
5115 stevensc 86
      document.removeEventListener('mousedown', handleClickOutside)
87
    }
88
  }, [shareContainer])
3310 stevensc 89
 
4016 stevensc 90
  const getShareUrl = new Promise((resolve, reject) => {
91
    if (shareOptions) {
5579 stevensc 92
      axios
93
        .get(feed_share_external_url)
4016 stevensc 94
        .then(({ data }) => {
95
          if (!data.success) {
96
            dispatch(addNotification({ style: 'danger', msg: data.data }))
97
            setShareOptions(false)
98
            return reject(data.data)
99
          }
100
          setShareUrl(data.data)
101
          return resolve(data.data)
102
        })
103
        .catch((err) => reject(err))
4015 stevensc 104
    }
5115 stevensc 105
  })
4015 stevensc 106
 
1072 stevensc 107
  const likeHandler = (likeUrl) => {
5579 stevensc 108
    axios.post(likeUrl).then((res) => {
109
      const { success, data } = res.data
110
      if (!success) {
111
        setFeedIsLiked((previousState) => !previousState)
112
        dispatch(
113
          addNotification({
5115 stevensc 114
            style: 'danger',
5579 stevensc 115
            msg: data,
116
          })
117
        )
118
      } else {
119
        setLikesState(data.likes)
120
        setFeedIsLiked(!feedIsLiked)
121
      }
122
    })
5115 stevensc 123
  }
1 www 124
 
3962 stevensc 125
  const displayComments = () => setShowComments(!showComments)
126
 
5579 stevensc 127
  const btnShareHandler = () =>
128
    dispatch(
129
      openShareModal(
130
        feed_share_url,
131
        shareModalTypes.SHARE,
132
        feedTypes.DASHBOARD,
133
        feed_unique
134
      )
135
    )
1 www 136
 
137
  return (
4017 stevensc 138
    <>
5579 stevensc 139
      <FeedModal isShow={show} handleClose={() => setShow(false)} feed={feed} />
5449 stevensc 140
      <div className={`feed ${feed_highlighted ? 'highlighted' : ''}`}>
3630 stevensc 141
        <FeedHeader
142
          ownerName={owner_name}
143
          ownerImage={owner_image}
144
          ownerTimeElapse={owner_time_elapse}
145
          ownerUrl={owner_url}
146
          feedDeleteUrl={feed_delete_url}
147
          feedUnique={feed_unique}
148
        />
5579 stevensc 149
        <div
150
          onClick={() =>
151
            (owner_file_image || owner_file_video || owner_file_document) &&
152
            setShow(true)
153
          }
718 steven 154
        >
4017 stevensc 155
          <Feed.Content
5115 stevensc 156
            isShare={!!feed.shared_name}
4017 stevensc 157
            ownerFileImage={feed.owner_file_image}
158
            ownerFileVideo={feed.owner_file_video}
159
            ownerFileImagePreview={feed.owner_file_image_preview}
160
            ownerFileDocument={feed.owner_file_document}
161
            ownerDescription={feed.owner_description}
162
            sharedItem={{
163
              name: feed.shared_name,
164
              image: feed.shared_image,
165
              time_elapse: feed.shared_time_elapse,
166
              description: feed.shared_description,
167
              file_video: feed.shared_file_video,
168
              file_image_preview: feed.shared_file_image_preview,
169
              file_image: feed.shared_file_image,
5579 stevensc 170
              file_document: feed.shared_file_document,
4017 stevensc 171
            }}
172
          />
718 steven 173
        </div>
1 www 174
        <div className="job-status-bar">
2833 stevensc 175
          <ul className="reactions-list">
1 www 176
            <li>
1082 stevensc 177
              <button
178
                type="button"
5579 stevensc 179
                id={
180
                  feedIsLiked
181
                    ? `btn-unlike-${feed_unique}`
182
                    : `btn-like-${feed_unique}`
183
                }
5115 stevensc 184
                className={feedIsLiked ? 'btn-unlike' : 'btn-like'}
5579 stevensc 185
                onClick={() =>
186
                  likeHandler(feedIsLiked ? feed_unlike_url : feed_like_url)
187
                }
1082 stevensc 188
              >
5579 stevensc 189
                {feedIsLiked ? (
190
                  <i className="mr-1 fa fa-heart" />
191
                ) : (
192
                  <i className="mr-1 fa fa-heart-o" />
193
                )}
2571 stevensc 194
                {likesState}
1082 stevensc 195
              </button>
1068 stevensc 196
            </li>
197
            <li>
1080 stevensc 198
              <button
199
                type="button"
1 www 200
                id={`btn-comments-${feed_unique}`}
201
                className="btn-indicator"
3962 stevensc 202
                onClick={displayComments}
1 www 203
              >
5579 stevensc 204
                <img
205
                  src="/images/icons/message.png"
206
                  className="mr-1 img-icon"
207
                />
2571 stevensc 208
                {totalComments}
1080 stevensc 209
              </button>
1 www 210
            </li>
211
            <li>
1080 stevensc 212
              <button
213
                type="button"
1 www 214
                id={`btn-share-${feed_unique}`}
215
                className="btn-indicator"
2211 stevensc 216
                onClick={btnShareHandler}
217
              >
4061 stevensc 218
                <img src="/images/icons/share.png" className="mr-1 img-icon" />
2571 stevensc 219
                {sharedState}
2211 stevensc 220
              </button>
221
            </li>
3307 stevensc 222
            <li className="position-relative">
223
              <button
224
                type="button"
225
                className="btn-indicator"
3354 stevensc 226
                onClick={() => setShareOptions(!shareOptions)}
3305 stevensc 227
              >
4047 stevensc 228
                <i className="mr-1 far fa-share-square" />
3307 stevensc 229
              </button>
5579 stevensc 230
              {shareOptions && (
3310 stevensc 231
                <div className="ext_share" ref={shareContainer}>
5579 stevensc 232
                  <FacebookShareButton
233
                    beforeOnClick={() => getShareUrl}
234
                    url={shareUrl}
235
                  >
3308 stevensc 236
                    <FacebookIcon size={32} round />
237
                  </FacebookShareButton>
5579 stevensc 238
                  <TwitterShareButton
239
                    beforeOnClick={() => getShareUrl}
240
                    url={shareUrl}
241
                  >
3309 stevensc 242
                    <TwitterIcon size={32} round />
243
                  </TwitterShareButton>
5579 stevensc 244
                  <TelegramShareButton
245
                    beforeOnClick={() => getShareUrl}
246
                    url={shareUrl}
247
                  >
3309 stevensc 248
                    <TelegramIcon size={32} round />
249
                  </TelegramShareButton>
5579 stevensc 250
                  <WhatsappShareButton
251
                    beforeOnClick={() => getShareUrl}
252
                    url={shareUrl}
253
                  >
3309 stevensc 254
                    <WhatsappIcon size={32} round />
255
                  </WhatsappShareButton>
5579 stevensc 256
                  <RedditShareButton
257
                    beforeOnClick={() => getShareUrl}
258
                    url={shareUrl}
259
                  >
3309 stevensc 260
                    <RedditIcon size={32} round />
261
                  </RedditShareButton>
5579 stevensc 262
                  <EmailShareButton
263
                    beforeOnClick={() => getShareUrl}
264
                    url={shareUrl}
265
                  >
3309 stevensc 266
                    <EmailIcon size={32} round />
267
                  </EmailShareButton>
3308 stevensc 268
                </div>
5579 stevensc 269
              )}
3303 stevensc 270
            </li>
1 www 271
          </ul>
272
        </div>
3943 stevensc 273
        <FeedCommentSection
274
          feedId={feed.feed_unique}
275
          image={image}
276
          addUrl={comment_add_url}
5583 stevensc 277
          updateTotalComments={(total) => setTotalComments(total)}
5579 stevensc 278
          currentComments={comments}
3962 stevensc 279
          isShow={showComments}
3943 stevensc 280
        />
5115 stevensc 281
      </div>
4017 stevensc 282
    </>
5115 stevensc 283
  )
284
}
1 www 285
 
4017 stevensc 286
const Content = ({
287
  showDescription = true,
288
  ownerFileImage,
289
  ownerFileVideo,
290
  ownerFileImagePreview,
291
  ownerFileDocument,
292
  ownerDescription,
293
  isShare,
5579 stevensc 294
  sharedItem,
4017 stevensc 295
}) => {
5579 stevensc 296
  const labels = useSelector((state) => state.labels)
4017 stevensc 297
  return (
298
    <div className="job_descp">
5579 stevensc 299
      {showDescription && (
4017 stevensc 300
        <Feed.Description ownerDescription={ownerDescription} />
5579 stevensc 301
      )}
302
      {ownerFileImage && (
303
        <img src={ownerFileImage} className="Entradas" loading="lazy" />
304
      )}
305
      {ownerFileVideo && (
4017 stevensc 306
        <video
307
          src={ownerFileVideo}
308
          controls
309
          poster={ownerFileImagePreview}
310
          preload="none"
311
        />
5579 stevensc 312
      )}
313
      {ownerFileDocument && (
4017 stevensc 314
        <a href={ownerFileDocument} target="_blank" rel="noreferrer">
5414 stevensc 315
          {labels.DOWNLOAD}
4017 stevensc 316
        </a>
5579 stevensc 317
      )}
318
      {isShare && (
4017 stevensc 319
        <Feed.SharedContent
320
          name={sharedItem.name}
321
          image={sharedItem.image}
322
          timeElapse={sharedItem.time_elapse}
323
          description={sharedItem.description}
324
          fileVideo={sharedItem.file_video}
325
          fileImagePreview={sharedItem.file_image_preview}
326
          fileImage={sharedItem.file_image}
327
          fileDocument={sharedItem.file_document}
328
        />
5579 stevensc 329
      )}
4017 stevensc 330
    </div>
331
  )
332
}
333
 
334
const Description = ({ ownerDescription }) => {
5115 stevensc 335
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
5579 stevensc 336
  const labels = useSelector((state) => state.labels)
4017 stevensc 337
 
338
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
339
 
340
  const htmlParsedText = (fullStringText) => {
341
    const fullText = parse(fullStringText)
342
    if (fullStringText.length > 500) {
5115 stevensc 343
      const shortenedString = fullStringText.substr(0, 500)
344
      const shortenedText = parse(`${shortenedString}... `)
4017 stevensc 345
      return (
346
        <p>
347
          {isReadMoreActive ? fullText : shortenedText}
5579 stevensc 348
          <span className="cursor-pointer" onClick={readMoreHandler}>
5414 stevensc 349
            {isReadMoreActive ? labels.READ_LESS : labels.READ_MORE}
4017 stevensc 350
          </span>
351
        </p>
5115 stevensc 352
      )
4017 stevensc 353
    }
354
    return <p>{fullText}</p>
5115 stevensc 355
  }
4017 stevensc 356
 
357
  return (
5579 stevensc 358
    <div className="show-read-more">{htmlParsedText(ownerDescription)}</div>
4017 stevensc 359
  )
360
}
361
 
362
const SharedContent = ({
363
  name,
364
  image,
365
  timeElapse,
366
  description,
367
  fileVideo,
368
  fileImagePreview,
369
  fileImage,
5579 stevensc 370
  fileDocument,
4017 stevensc 371
}) => {
5115 stevensc 372
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
5579 stevensc 373
  const labels = useSelector((state) => state.labels)
4017 stevensc 374
 
375
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
376
 
377
  const htmlParsedText = (fullStringText) => {
378
    const fullText = parse(fullStringText)
379
    if (fullStringText.length > 500) {
5115 stevensc 380
      const shortenedString = fullStringText.substr(0, 500)
381
      const shortenedText = parse(`${shortenedString}... `)
4017 stevensc 382
      return (
383
        <p>
384
          {isReadMoreActive ? fullText : shortenedText}
5579 stevensc 385
          <span className="cursor-pointer" onClick={readMoreHandler}>
5414 stevensc 386
            {isReadMoreActive ? labels.READ_LESS : labels.READ_MORE}
4017 stevensc 387
          </span>
388
        </p>
5115 stevensc 389
      )
4017 stevensc 390
    }
391
    return <p>{fullText}</p>
5115 stevensc 392
  }
4017 stevensc 393
 
394
  return (
395
    <div className="shared-post-bar">
396
      <div className="post-bar">
397
        <div className="post_topbar">
398
          <div className="usy-dt">
5579 stevensc 399
            <img src={image} alt="" style={{ width: '50px', height: 'auto' }} />
4017 stevensc 400
            <div className="usy-name">
401
              <h3>{name}</h3>
5579 stevensc 402
              <span>{timeElapse}</span>
4017 stevensc 403
            </div>
404
          </div>
405
        </div>
406
        <div className="job_descp">
5579 stevensc 407
          <div className="show-read-more">{htmlParsedText(description)}</div>
408
          {fileImage && (
409
            <img src={fileImage} className="Entradas" loading="lazy" />
410
          )}
411
          {fileVideo && (
4017 stevensc 412
            <video
413
              src={fileVideo}
414
              controls
415
              poster={fileImagePreview}
416
              preload="none"
417
            />
5579 stevensc 418
          )}
419
          {fileDocument && (
4017 stevensc 420
            <a href={fileDocument} target="_blank" rel="noreferrer">
5414 stevensc 421
              {labels.DOWNLOAD}
4017 stevensc 422
            </a>
5579 stevensc 423
          )}
4017 stevensc 424
        </div>
425
      </div>
426
    </div>
427
  )
428
}
429
 
430
Feed.SharedContent = SharedContent
431
Feed.Description = Description
432
Feed.Content = Content
433
 
5115 stevensc 434
export default React.memo(Feed)