Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 5697 | Rev 5706 | 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}
5698 stevensc 149
          feedType={'g'}
3630 stevensc 150
        />
5579 stevensc 151
        <div
152
          onClick={() =>
153
            (owner_file_image || owner_file_video || owner_file_document) &&
154
            setShow(true)
155
          }
718 steven 156
        >
4017 stevensc 157
          <Feed.Content
5115 stevensc 158
            isShare={!!feed.shared_name}
4017 stevensc 159
            ownerFileImage={feed.owner_file_image}
160
            ownerFileVideo={feed.owner_file_video}
161
            ownerFileImagePreview={feed.owner_file_image_preview}
162
            ownerFileDocument={feed.owner_file_document}
163
            ownerDescription={feed.owner_description}
164
            sharedItem={{
165
              name: feed.shared_name,
166
              image: feed.shared_image,
167
              time_elapse: feed.shared_time_elapse,
168
              description: feed.shared_description,
169
              file_video: feed.shared_file_video,
170
              file_image_preview: feed.shared_file_image_preview,
171
              file_image: feed.shared_file_image,
5579 stevensc 172
              file_document: feed.shared_file_document,
4017 stevensc 173
            }}
174
          />
718 steven 175
        </div>
1 www 176
        <div className="job-status-bar">
2833 stevensc 177
          <ul className="reactions-list">
1 www 178
            <li>
5667 stevensc 179
              <ReactionButton />
1068 stevensc 180
            </li>
181
            <li>
1080 stevensc 182
              <button
183
                type="button"
1 www 184
                id={`btn-comments-${feed_unique}`}
185
                className="btn-indicator"
3962 stevensc 186
                onClick={displayComments}
1 www 187
              >
5579 stevensc 188
                <img
189
                  src="/images/icons/message.png"
190
                  className="mr-1 img-icon"
191
                />
2571 stevensc 192
                {totalComments}
1080 stevensc 193
              </button>
1 www 194
            </li>
195
            <li>
1080 stevensc 196
              <button
197
                type="button"
1 www 198
                id={`btn-share-${feed_unique}`}
199
                className="btn-indicator"
2211 stevensc 200
                onClick={btnShareHandler}
201
              >
4061 stevensc 202
                <img src="/images/icons/share.png" className="mr-1 img-icon" />
2571 stevensc 203
                {sharedState}
2211 stevensc 204
              </button>
205
            </li>
3307 stevensc 206
            <li className="position-relative">
207
              <button
208
                type="button"
209
                className="btn-indicator"
3354 stevensc 210
                onClick={() => setShareOptions(!shareOptions)}
3305 stevensc 211
              >
4047 stevensc 212
                <i className="mr-1 far fa-share-square" />
3307 stevensc 213
              </button>
5579 stevensc 214
              {shareOptions && (
3310 stevensc 215
                <div className="ext_share" ref={shareContainer}>
5579 stevensc 216
                  <FacebookShareButton
217
                    beforeOnClick={() => getShareUrl}
218
                    url={shareUrl}
219
                  >
3308 stevensc 220
                    <FacebookIcon size={32} round />
221
                  </FacebookShareButton>
5579 stevensc 222
                  <TwitterShareButton
223
                    beforeOnClick={() => getShareUrl}
224
                    url={shareUrl}
225
                  >
3309 stevensc 226
                    <TwitterIcon size={32} round />
227
                  </TwitterShareButton>
5579 stevensc 228
                  <TelegramShareButton
229
                    beforeOnClick={() => getShareUrl}
230
                    url={shareUrl}
231
                  >
3309 stevensc 232
                    <TelegramIcon size={32} round />
233
                  </TelegramShareButton>
5579 stevensc 234
                  <WhatsappShareButton
235
                    beforeOnClick={() => getShareUrl}
236
                    url={shareUrl}
237
                  >
3309 stevensc 238
                    <WhatsappIcon size={32} round />
239
                  </WhatsappShareButton>
5579 stevensc 240
                  <RedditShareButton
241
                    beforeOnClick={() => getShareUrl}
242
                    url={shareUrl}
243
                  >
3309 stevensc 244
                    <RedditIcon size={32} round />
245
                  </RedditShareButton>
5579 stevensc 246
                  <EmailShareButton
247
                    beforeOnClick={() => getShareUrl}
248
                    url={shareUrl}
249
                  >
3309 stevensc 250
                    <EmailIcon size={32} round />
251
                  </EmailShareButton>
3308 stevensc 252
                </div>
5579 stevensc 253
              )}
3303 stevensc 254
            </li>
1 www 255
          </ul>
256
        </div>
3943 stevensc 257
        <FeedCommentSection
258
          feedId={feed.feed_unique}
259
          image={image}
260
          addUrl={comment_add_url}
5583 stevensc 261
          updateTotalComments={(total) => setTotalComments(total)}
5579 stevensc 262
          currentComments={comments}
3962 stevensc 263
          isShow={showComments}
3943 stevensc 264
        />
5115 stevensc 265
      </div>
4017 stevensc 266
    </>
5115 stevensc 267
  )
268
}
1 www 269
 
4017 stevensc 270
const Content = ({
271
  showDescription = true,
272
  ownerFileImage,
273
  ownerFileVideo,
274
  ownerFileImagePreview,
275
  ownerFileDocument,
276
  ownerDescription,
277
  isShare,
5579 stevensc 278
  sharedItem,
4017 stevensc 279
}) => {
5579 stevensc 280
  const labels = useSelector((state) => state.labels)
4017 stevensc 281
  return (
282
    <div className="job_descp">
5579 stevensc 283
      {showDescription && (
4017 stevensc 284
        <Feed.Description ownerDescription={ownerDescription} />
5579 stevensc 285
      )}
286
      {ownerFileImage && (
287
        <img src={ownerFileImage} className="Entradas" loading="lazy" />
288
      )}
289
      {ownerFileVideo && (
4017 stevensc 290
        <video
291
          src={ownerFileVideo}
292
          controls
293
          poster={ownerFileImagePreview}
294
          preload="none"
295
        />
5579 stevensc 296
      )}
297
      {ownerFileDocument && (
4017 stevensc 298
        <a href={ownerFileDocument} target="_blank" rel="noreferrer">
5414 stevensc 299
          {labels.DOWNLOAD}
4017 stevensc 300
        </a>
5579 stevensc 301
      )}
302
      {isShare && (
4017 stevensc 303
        <Feed.SharedContent
304
          name={sharedItem.name}
305
          image={sharedItem.image}
306
          timeElapse={sharedItem.time_elapse}
307
          description={sharedItem.description}
308
          fileVideo={sharedItem.file_video}
309
          fileImagePreview={sharedItem.file_image_preview}
310
          fileImage={sharedItem.file_image}
311
          fileDocument={sharedItem.file_document}
312
        />
5579 stevensc 313
      )}
4017 stevensc 314
    </div>
315
  )
316
}
317
 
318
const Description = ({ ownerDescription }) => {
5115 stevensc 319
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
5579 stevensc 320
  const labels = useSelector((state) => state.labels)
4017 stevensc 321
 
322
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
323
 
324
  const htmlParsedText = (fullStringText) => {
325
    const fullText = parse(fullStringText)
326
    if (fullStringText.length > 500) {
5115 stevensc 327
      const shortenedString = fullStringText.substr(0, 500)
328
      const shortenedText = parse(`${shortenedString}... `)
4017 stevensc 329
      return (
330
        <p>
331
          {isReadMoreActive ? fullText : shortenedText}
5579 stevensc 332
          <span className="cursor-pointer" onClick={readMoreHandler}>
5414 stevensc 333
            {isReadMoreActive ? labels.READ_LESS : labels.READ_MORE}
4017 stevensc 334
          </span>
335
        </p>
5115 stevensc 336
      )
4017 stevensc 337
    }
338
    return <p>{fullText}</p>
5115 stevensc 339
  }
4017 stevensc 340
 
341
  return (
5579 stevensc 342
    <div className="show-read-more">{htmlParsedText(ownerDescription)}</div>
4017 stevensc 343
  )
344
}
345
 
346
const SharedContent = ({
347
  name,
348
  image,
349
  timeElapse,
350
  description,
351
  fileVideo,
352
  fileImagePreview,
353
  fileImage,
5579 stevensc 354
  fileDocument,
4017 stevensc 355
}) => {
5115 stevensc 356
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
5579 stevensc 357
  const labels = useSelector((state) => state.labels)
4017 stevensc 358
 
359
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
360
 
361
  const htmlParsedText = (fullStringText) => {
362
    const fullText = parse(fullStringText)
363
    if (fullStringText.length > 500) {
5115 stevensc 364
      const shortenedString = fullStringText.substr(0, 500)
365
      const shortenedText = parse(`${shortenedString}... `)
4017 stevensc 366
      return (
367
        <p>
368
          {isReadMoreActive ? fullText : shortenedText}
5579 stevensc 369
          <span className="cursor-pointer" onClick={readMoreHandler}>
5414 stevensc 370
            {isReadMoreActive ? labels.READ_LESS : labels.READ_MORE}
4017 stevensc 371
          </span>
372
        </p>
5115 stevensc 373
      )
4017 stevensc 374
    }
375
    return <p>{fullText}</p>
5115 stevensc 376
  }
4017 stevensc 377
 
378
  return (
379
    <div className="shared-post-bar">
380
      <div className="post-bar">
381
        <div className="post_topbar">
382
          <div className="usy-dt">
5579 stevensc 383
            <img src={image} alt="" style={{ width: '50px', height: 'auto' }} />
4017 stevensc 384
            <div className="usy-name">
385
              <h3>{name}</h3>
5579 stevensc 386
              <span>{timeElapse}</span>
4017 stevensc 387
            </div>
388
          </div>
389
        </div>
390
        <div className="job_descp">
5579 stevensc 391
          <div className="show-read-more">{htmlParsedText(description)}</div>
392
          {fileImage && (
393
            <img src={fileImage} className="Entradas" loading="lazy" />
394
          )}
395
          {fileVideo && (
4017 stevensc 396
            <video
397
              src={fileVideo}
398
              controls
399
              poster={fileImagePreview}
400
              preload="none"
401
            />
5579 stevensc 402
          )}
403
          {fileDocument && (
4017 stevensc 404
            <a href={fileDocument} target="_blank" rel="noreferrer">
5414 stevensc 405
              {labels.DOWNLOAD}
4017 stevensc 406
            </a>
5579 stevensc 407
          )}
4017 stevensc 408
        </div>
409
      </div>
410
    </div>
411
  )
412
}
413
 
414
Feed.SharedContent = SharedContent
415
Feed.Description = Description
416
Feed.Content = Content
417
 
5115 stevensc 418
export default React.memo(Feed)