Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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