Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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