Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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