Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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