Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 5851 | | 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'
5782 stevensc 21
import { feedTypes } from '../../../redux/feed/feed.types'
5115 stevensc 22
import { shareModalTypes } from '../../../redux/share-modal/shareModal.types'
23
import { openShareModal } from '../../../redux/share-modal/shareModal.actions'
24
import { addNotification } from '../../../redux/notification/notification.actions'
5782 stevensc 25
import useOutsideClick from '../../../hooks/useOutsideClick'
1034 stevensc 26
 
5115 stevensc 27
// Components
28
import FeedModal from './FeedModal'
29
import FeedHeader from './FeedHeader'
30
import FeedCommentSection from './feed-comment/FeedCommentSection'
5782 stevensc 31
import RecommendIcon from '@mui/icons-material/Recommend'
32
import FavoriteIcon from '@mui/icons-material/FavoriteTwoTone'
33
import VolunteerActivismIcon from '@mui/icons-material/VolunteerActivism'
34
import EmojiEmotionsIcon from '@mui/icons-material/EmojiEmotions'
35
import TungstenIcon from '@mui/icons-material/Tungsten'
5851 stevensc 36
import withReactions from './withReaction'
37
import InputOption from '../../templates/linkedin/Feed/InputOption'
5115 stevensc 38
 
4017 stevensc 39
const Feed = ({ feed, owner_shared, image }) => {
1 www 40
  const {
41
    feed_unique,
42
    owner_name,
43
    owner_url,
44
    owner_image,
45
    owner_time_elapse,
46
    owner_file_image,
47
    owner_file_video,
48
    owner_file_document,
5706 stevensc 49
    owner_feed_type,
3207 stevensc 50
    feed_highlighted,
1 www 51
    feed_share_url,
52
    feed_delete_url,
53
    comments,
54
    comment_add_url,
5579 stevensc 55
    feed_share_external_url,
5115 stevensc 56
  } = feed
5781 stevensc 57
  const [totalComments, setTotalComments] = useState(comments.length)
5783 stevensc 58
  const [ownerReactions, setOwnerReaction] = useState(feed.feed_reactions)
5851 stevensc 59
  const [currentReaction, setCurrentReaction] = useState(feed.feed_my_reaction)
5781 stevensc 60
  const [totalReactions, setTotalReactions] = useState(0)
5115 stevensc 61
  const [sharedState, setSharedState] = useState(owner_shared)
62
  const [shareUrl, setShareUrl] = useState('')
5781 stevensc 63
 
5115 stevensc 64
  const [showComments, setShowComments] = useState(false)
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)
5781 stevensc 69
  const dispatch = useDispatch()
70
  const outsideClick = useOutsideClick(shareContainer)
1034 stevensc 71
 
5781 stevensc 72
  const reactionsOptions = [
73
    {
74
      type: 'r',
75
      icon: <RecommendIcon style={{ color: '#7405f9' }} />,
76
    },
77
    {
78
      type: 's',
79
      icon: <VolunteerActivismIcon style={{ color: '#6495ED' }} />,
80
    },
81
    {
82
      type: 'l',
83
      icon: <FavoriteIcon style={{ color: '#DF704D' }} />,
84
    },
85
    {
86
      type: 'i',
87
      icon: (
88
        <TungstenIcon
89
          style={{ color: '#F5BB5C', transform: 'rotate(180deg)' }}
90
        />
91
      ),
92
    },
93
    {
94
      type: 'f',
95
      icon: <EmojiEmotionsIcon style={{ color: '#FF7F50' }} />,
96
    },
97
  ]
1030 stevensc 98
 
4016 stevensc 99
  const getShareUrl = new Promise((resolve, reject) => {
100
    if (shareOptions) {
5579 stevensc 101
      axios
102
        .get(feed_share_external_url)
4016 stevensc 103
        .then(({ data }) => {
104
          if (!data.success) {
105
            dispatch(addNotification({ style: 'danger', msg: data.data }))
106
            setShareOptions(false)
107
            return reject(data.data)
108
          }
109
          setShareUrl(data.data)
110
          return resolve(data.data)
111
        })
112
        .catch((err) => reject(err))
4015 stevensc 113
    }
5115 stevensc 114
  })
4015 stevensc 115
 
5791 stevensc 116
  const saveReaction = async (type) => {
5781 stevensc 117
    const reactionTypesUrl = {
118
      r: feed.feed_save_reaction_recommended_url,
119
      s: feed.feed_save_reaction_support_url,
120
      l: feed.feed_save_reaction_love_url,
121
      i: feed.feed_save_reaction_interest_url,
122
      f: feed.feed_save_reaction_fun_url,
123
    }
124
 
5791 stevensc 125
    await axios.post(reactionTypesUrl[type]).then((res) => {
5579 stevensc 126
      const { success, data } = res.data
5781 stevensc 127
 
5579 stevensc 128
      if (!success) {
5781 stevensc 129
        dispatch(addNotification({ style: 'danger', msg: data }))
5579 stevensc 130
      }
5781 stevensc 131
 
5786 stevensc 132
      setOwnerReaction(data.reactions)
5851 stevensc 133
      setCurrentReaction(type)
5579 stevensc 134
    })
5781 stevensc 135
  }
1 www 136
 
5791 stevensc 137
  const deleteReaction = async () => {
138
    await axios.post(feed.feed_delete_reaction_url).then((res) => {
5781 stevensc 139
      const { success, data } = res.data
140
 
141
      if (!success) {
142
        dispatch(addNotification({ style: 'danger', msg: data }))
143
        return
144
      }
145
 
5786 stevensc 146
      setOwnerReaction(data.reactions)
5851 stevensc 147
      setCurrentReaction('')
5781 stevensc 148
    })
149
  }
150
 
3962 stevensc 151
  const displayComments = () => setShowComments(!showComments)
152
 
5781 stevensc 153
  const btnShareHandler = () => {
5579 stevensc 154
    dispatch(
155
      openShareModal(
156
        feed_share_url,
157
        shareModalTypes.SHARE,
158
        feedTypes.DASHBOARD,
159
        feed_unique
160
      )
161
    )
5781 stevensc 162
  }
1 www 163
 
5851 stevensc 164
  const WithReactionIcon = withReactions(InputOption, {
165
    onSelect: saveReaction,
166
    onDelete: deleteReaction,
167
    myReaction: currentReaction,
5946 stevensc 168
    withTitle: true,
5851 stevensc 169
  })
170
 
5781 stevensc 171
  useEffect(() => setSharedState(owner_shared), [owner_shared])
172
 
173
  useEffect(() => outsideClick && setShareOptions(false), [outsideClick])
174
 
175
  useEffect(() => {
5783 stevensc 176
    const feedReactions = ownerReactions.reduce(
5781 stevensc 177
      (acc, reaction) => acc + Number(reaction.total),
178
 
179
    )
180
    setTotalReactions(feedReactions)
5783 stevensc 181
  }, [ownerReactions])
5781 stevensc 182
 
1 www 183
  return (
4017 stevensc 184
    <>
5579 stevensc 185
      <FeedModal isShow={show} handleClose={() => setShow(false)} feed={feed} />
5449 stevensc 186
      <div className={`feed ${feed_highlighted ? 'highlighted' : ''}`}>
3630 stevensc 187
        <FeedHeader
188
          ownerName={owner_name}
189
          ownerImage={owner_image}
190
          ownerTimeElapse={owner_time_elapse}
191
          ownerUrl={owner_url}
192
          feedDeleteUrl={feed_delete_url}
193
          feedUnique={feed_unique}
5706 stevensc 194
          feedType={owner_feed_type}
3630 stevensc 195
        />
5579 stevensc 196
        <div
197
          onClick={() =>
198
            (owner_file_image || owner_file_video || owner_file_document) &&
199
            setShow(true)
200
          }
718 steven 201
        >
4017 stevensc 202
          <Feed.Content
5115 stevensc 203
            isShare={!!feed.shared_name}
4017 stevensc 204
            ownerFileImage={feed.owner_file_image}
205
            ownerFileVideo={feed.owner_file_video}
206
            ownerFileImagePreview={feed.owner_file_image_preview}
207
            ownerFileDocument={feed.owner_file_document}
208
            ownerDescription={feed.owner_description}
209
            sharedItem={{
210
              name: feed.shared_name,
211
              image: feed.shared_image,
212
              time_elapse: feed.shared_time_elapse,
213
              description: feed.shared_description,
214
              file_video: feed.shared_file_video,
215
              file_image_preview: feed.shared_file_image_preview,
216
              file_image: feed.shared_file_image,
5579 stevensc 217
              file_document: feed.shared_file_document,
4017 stevensc 218
            }}
219
          />
718 steven 220
        </div>
5783 stevensc 221
        <div className="reactions-counter">
5781 stevensc 222
          {reactionsOptions
223
            .filter((option) =>
5783 stevensc 224
              ownerReactions.find(
5781 stevensc 225
                (reaction) => reaction.reaction === option.type
226
              )
227
            )
228
            .map((reaction) => reaction.icon)}
5785 stevensc 229
          <span>{totalReactions} reacciones</span>
5781 stevensc 230
        </div>
5706 stevensc 231
        <ul className="reactions-list">
232
          <li>
5851 stevensc 233
            <WithReactionIcon />
5706 stevensc 234
          </li>
235
          <li>
236
            <button
237
              type="button"
238
              id={`btn-comments-${feed_unique}`}
239
              className="btn-indicator"
240
              onClick={displayComments}
241
            >
242
              <img src="/images/icons/message.png" className="mr-1 img-icon" />
243
              {totalComments}
244
            </button>
245
          </li>
246
          <li>
247
            <button
248
              type="button"
249
              id={`btn-share-${feed_unique}`}
250
              className="btn-indicator"
251
              onClick={btnShareHandler}
252
            >
253
              <img src="/images/icons/share.png" className="mr-1 img-icon" />
254
              {sharedState}
255
            </button>
256
          </li>
257
          <li className="position-relative">
258
            <button
259
              type="button"
260
              className="btn-indicator"
261
              onClick={() => setShareOptions(!shareOptions)}
262
            >
263
              <i className="mr-1 far fa-share-square" />
264
            </button>
265
            {shareOptions && (
266
              <div className="ext_share" ref={shareContainer}>
267
                <FacebookShareButton
268
                  beforeOnClick={() => getShareUrl}
269
                  url={shareUrl}
270
                >
271
                  <FacebookIcon size={32} round />
272
                </FacebookShareButton>
273
                <TwitterShareButton
274
                  beforeOnClick={() => getShareUrl}
275
                  url={shareUrl}
276
                >
277
                  <TwitterIcon size={32} round />
278
                </TwitterShareButton>
279
                <TelegramShareButton
280
                  beforeOnClick={() => getShareUrl}
281
                  url={shareUrl}
282
                >
283
                  <TelegramIcon size={32} round />
284
                </TelegramShareButton>
285
                <WhatsappShareButton
286
                  beforeOnClick={() => getShareUrl}
287
                  url={shareUrl}
288
                >
289
                  <WhatsappIcon size={32} round />
290
                </WhatsappShareButton>
291
                <RedditShareButton
292
                  beforeOnClick={() => getShareUrl}
293
                  url={shareUrl}
294
                >
295
                  <RedditIcon size={32} round />
296
                </RedditShareButton>
297
                <EmailShareButton
298
                  beforeOnClick={() => getShareUrl}
299
                  url={shareUrl}
300
                >
301
                  <EmailIcon size={32} round />
302
                </EmailShareButton>
303
              </div>
304
            )}
305
          </li>
306
        </ul>
307
 
3943 stevensc 308
        <FeedCommentSection
309
          feedId={feed.feed_unique}
310
          image={image}
311
          addUrl={comment_add_url}
5583 stevensc 312
          updateTotalComments={(total) => setTotalComments(total)}
5579 stevensc 313
          currentComments={comments}
3962 stevensc 314
          isShow={showComments}
3943 stevensc 315
        />
5115 stevensc 316
      </div>
4017 stevensc 317
    </>
5115 stevensc 318
  )
319
}
1 www 320
 
4017 stevensc 321
const Content = ({
322
  showDescription = true,
323
  ownerFileImage,
324
  ownerFileVideo,
325
  ownerFileImagePreview,
326
  ownerFileDocument,
327
  ownerDescription,
328
  isShare,
5579 stevensc 329
  sharedItem,
4017 stevensc 330
}) => {
5579 stevensc 331
  const labels = useSelector((state) => state.labels)
4017 stevensc 332
  return (
333
    <div className="job_descp">
5579 stevensc 334
      {showDescription && (
4017 stevensc 335
        <Feed.Description ownerDescription={ownerDescription} />
5579 stevensc 336
      )}
337
      {ownerFileImage && (
338
        <img src={ownerFileImage} className="Entradas" loading="lazy" />
339
      )}
340
      {ownerFileVideo && (
4017 stevensc 341
        <video
342
          src={ownerFileVideo}
343
          controls
344
          poster={ownerFileImagePreview}
345
          preload="none"
346
        />
5579 stevensc 347
      )}
348
      {ownerFileDocument && (
4017 stevensc 349
        <a href={ownerFileDocument} target="_blank" rel="noreferrer">
5414 stevensc 350
          {labels.DOWNLOAD}
4017 stevensc 351
        </a>
5579 stevensc 352
      )}
353
      {isShare && (
4017 stevensc 354
        <Feed.SharedContent
355
          name={sharedItem.name}
356
          image={sharedItem.image}
357
          timeElapse={sharedItem.time_elapse}
358
          description={sharedItem.description}
359
          fileVideo={sharedItem.file_video}
360
          fileImagePreview={sharedItem.file_image_preview}
361
          fileImage={sharedItem.file_image}
362
          fileDocument={sharedItem.file_document}
363
        />
5579 stevensc 364
      )}
4017 stevensc 365
    </div>
366
  )
367
}
368
 
369
const Description = ({ ownerDescription }) => {
5115 stevensc 370
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
5579 stevensc 371
  const labels = useSelector((state) => state.labels)
4017 stevensc 372
 
373
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
374
 
375
  const htmlParsedText = (fullStringText) => {
376
    const fullText = parse(fullStringText)
377
    if (fullStringText.length > 500) {
5115 stevensc 378
      const shortenedString = fullStringText.substr(0, 500)
379
      const shortenedText = parse(`${shortenedString}... `)
4017 stevensc 380
      return (
381
        <p>
382
          {isReadMoreActive ? fullText : shortenedText}
5579 stevensc 383
          <span className="cursor-pointer" onClick={readMoreHandler}>
5414 stevensc 384
            {isReadMoreActive ? labels.READ_LESS : labels.READ_MORE}
4017 stevensc 385
          </span>
386
        </p>
5115 stevensc 387
      )
4017 stevensc 388
    }
389
    return <p>{fullText}</p>
5115 stevensc 390
  }
4017 stevensc 391
 
392
  return (
5579 stevensc 393
    <div className="show-read-more">{htmlParsedText(ownerDescription)}</div>
4017 stevensc 394
  )
395
}
396
 
397
const SharedContent = ({
398
  name,
399
  image,
400
  timeElapse,
401
  description,
402
  fileVideo,
403
  fileImagePreview,
404
  fileImage,
5579 stevensc 405
  fileDocument,
4017 stevensc 406
}) => {
5115 stevensc 407
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
5579 stevensc 408
  const labels = useSelector((state) => state.labels)
4017 stevensc 409
 
410
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
411
 
412
  const htmlParsedText = (fullStringText) => {
413
    const fullText = parse(fullStringText)
414
    if (fullStringText.length > 500) {
5115 stevensc 415
      const shortenedString = fullStringText.substr(0, 500)
416
      const shortenedText = parse(`${shortenedString}... `)
4017 stevensc 417
      return (
418
        <p>
419
          {isReadMoreActive ? fullText : shortenedText}
5579 stevensc 420
          <span className="cursor-pointer" onClick={readMoreHandler}>
5414 stevensc 421
            {isReadMoreActive ? labels.READ_LESS : labels.READ_MORE}
4017 stevensc 422
          </span>
423
        </p>
5115 stevensc 424
      )
4017 stevensc 425
    }
426
    return <p>{fullText}</p>
5115 stevensc 427
  }
4017 stevensc 428
 
429
  return (
430
    <div className="shared-post-bar">
431
      <div className="post-bar">
432
        <div className="post_topbar">
433
          <div className="usy-dt">
5579 stevensc 434
            <img src={image} alt="" style={{ width: '50px', height: 'auto' }} />
4017 stevensc 435
            <div className="usy-name">
436
              <h3>{name}</h3>
5579 stevensc 437
              <span>{timeElapse}</span>
4017 stevensc 438
            </div>
439
          </div>
440
        </div>
441
        <div className="job_descp">
5579 stevensc 442
          <div className="show-read-more">{htmlParsedText(description)}</div>
443
          {fileImage && (
444
            <img src={fileImage} className="Entradas" loading="lazy" />
445
          )}
446
          {fileVideo && (
4017 stevensc 447
            <video
448
              src={fileVideo}
449
              controls
450
              poster={fileImagePreview}
451
              preload="none"
452
            />
5579 stevensc 453
          )}
454
          {fileDocument && (
4017 stevensc 455
            <a href={fileDocument} target="_blank" rel="noreferrer">
5414 stevensc 456
              {labels.DOWNLOAD}
4017 stevensc 457
            </a>
5579 stevensc 458
          )}
4017 stevensc 459
        </div>
460
      </div>
461
    </div>
462
  )
463
}
464
 
465
Feed.SharedContent = SharedContent
466
Feed.Description = Description
467
Feed.Content = Content
468
 
5115 stevensc 469
export default React.memo(Feed)