Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 5791 | 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'
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,
168
  })
169
 
5781 stevensc 170
  useEffect(() => setSharedState(owner_shared), [owner_shared])
171
 
172
  useEffect(() => outsideClick && setShareOptions(false), [outsideClick])
173
 
174
  useEffect(() => {
5783 stevensc 175
    const feedReactions = ownerReactions.reduce(
5781 stevensc 176
      (acc, reaction) => acc + Number(reaction.total),
177
 
178
    )
179
    setTotalReactions(feedReactions)
5783 stevensc 180
  }, [ownerReactions])
5781 stevensc 181
 
1 www 182
  return (
4017 stevensc 183
    <>
5579 stevensc 184
      <FeedModal isShow={show} handleClose={() => setShow(false)} feed={feed} />
5449 stevensc 185
      <div className={`feed ${feed_highlighted ? 'highlighted' : ''}`}>
3630 stevensc 186
        <FeedHeader
187
          ownerName={owner_name}
188
          ownerImage={owner_image}
189
          ownerTimeElapse={owner_time_elapse}
190
          ownerUrl={owner_url}
191
          feedDeleteUrl={feed_delete_url}
192
          feedUnique={feed_unique}
5706 stevensc 193
          feedType={owner_feed_type}
3630 stevensc 194
        />
5579 stevensc 195
        <div
196
          onClick={() =>
197
            (owner_file_image || owner_file_video || owner_file_document) &&
198
            setShow(true)
199
          }
718 steven 200
        >
4017 stevensc 201
          <Feed.Content
5115 stevensc 202
            isShare={!!feed.shared_name}
4017 stevensc 203
            ownerFileImage={feed.owner_file_image}
204
            ownerFileVideo={feed.owner_file_video}
205
            ownerFileImagePreview={feed.owner_file_image_preview}
206
            ownerFileDocument={feed.owner_file_document}
207
            ownerDescription={feed.owner_description}
208
            sharedItem={{
209
              name: feed.shared_name,
210
              image: feed.shared_image,
211
              time_elapse: feed.shared_time_elapse,
212
              description: feed.shared_description,
213
              file_video: feed.shared_file_video,
214
              file_image_preview: feed.shared_file_image_preview,
215
              file_image: feed.shared_file_image,
5579 stevensc 216
              file_document: feed.shared_file_document,
4017 stevensc 217
            }}
218
          />
718 steven 219
        </div>
5783 stevensc 220
        <div className="reactions-counter">
5781 stevensc 221
          {reactionsOptions
222
            .filter((option) =>
5783 stevensc 223
              ownerReactions.find(
5781 stevensc 224
                (reaction) => reaction.reaction === option.type
225
              )
226
            )
227
            .map((reaction) => reaction.icon)}
5785 stevensc 228
          <span>{totalReactions} reacciones</span>
5781 stevensc 229
        </div>
5706 stevensc 230
        <ul className="reactions-list">
231
          <li>
5851 stevensc 232
            <WithReactionIcon />
5706 stevensc 233
          </li>
234
          <li>
235
            <button
236
              type="button"
237
              id={`btn-comments-${feed_unique}`}
238
              className="btn-indicator"
239
              onClick={displayComments}
240
            >
241
              <img src="/images/icons/message.png" className="mr-1 img-icon" />
242
              {totalComments}
243
            </button>
244
          </li>
245
          <li>
246
            <button
247
              type="button"
248
              id={`btn-share-${feed_unique}`}
249
              className="btn-indicator"
250
              onClick={btnShareHandler}
251
            >
252
              <img src="/images/icons/share.png" className="mr-1 img-icon" />
253
              {sharedState}
254
            </button>
255
          </li>
256
          <li className="position-relative">
257
            <button
258
              type="button"
259
              className="btn-indicator"
260
              onClick={() => setShareOptions(!shareOptions)}
261
            >
262
              <i className="mr-1 far fa-share-square" />
263
            </button>
264
            {shareOptions && (
265
              <div className="ext_share" ref={shareContainer}>
266
                <FacebookShareButton
267
                  beforeOnClick={() => getShareUrl}
268
                  url={shareUrl}
269
                >
270
                  <FacebookIcon size={32} round />
271
                </FacebookShareButton>
272
                <TwitterShareButton
273
                  beforeOnClick={() => getShareUrl}
274
                  url={shareUrl}
275
                >
276
                  <TwitterIcon size={32} round />
277
                </TwitterShareButton>
278
                <TelegramShareButton
279
                  beforeOnClick={() => getShareUrl}
280
                  url={shareUrl}
281
                >
282
                  <TelegramIcon size={32} round />
283
                </TelegramShareButton>
284
                <WhatsappShareButton
285
                  beforeOnClick={() => getShareUrl}
286
                  url={shareUrl}
287
                >
288
                  <WhatsappIcon size={32} round />
289
                </WhatsappShareButton>
290
                <RedditShareButton
291
                  beforeOnClick={() => getShareUrl}
292
                  url={shareUrl}
293
                >
294
                  <RedditIcon size={32} round />
295
                </RedditShareButton>
296
                <EmailShareButton
297
                  beforeOnClick={() => getShareUrl}
298
                  url={shareUrl}
299
                >
300
                  <EmailIcon size={32} round />
301
                </EmailShareButton>
302
              </div>
303
            )}
304
          </li>
305
        </ul>
306
 
3943 stevensc 307
        <FeedCommentSection
308
          feedId={feed.feed_unique}
309
          image={image}
310
          addUrl={comment_add_url}
5583 stevensc 311
          updateTotalComments={(total) => setTotalComments(total)}
5579 stevensc 312
          currentComments={comments}
3962 stevensc 313
          isShow={showComments}
3943 stevensc 314
        />
5115 stevensc 315
      </div>
4017 stevensc 316
    </>
5115 stevensc 317
  )
318
}
1 www 319
 
4017 stevensc 320
const Content = ({
321
  showDescription = true,
322
  ownerFileImage,
323
  ownerFileVideo,
324
  ownerFileImagePreview,
325
  ownerFileDocument,
326
  ownerDescription,
327
  isShare,
5579 stevensc 328
  sharedItem,
4017 stevensc 329
}) => {
5579 stevensc 330
  const labels = useSelector((state) => state.labels)
4017 stevensc 331
  return (
332
    <div className="job_descp">
5579 stevensc 333
      {showDescription && (
4017 stevensc 334
        <Feed.Description ownerDescription={ownerDescription} />
5579 stevensc 335
      )}
336
      {ownerFileImage && (
337
        <img src={ownerFileImage} className="Entradas" loading="lazy" />
338
      )}
339
      {ownerFileVideo && (
4017 stevensc 340
        <video
341
          src={ownerFileVideo}
342
          controls
343
          poster={ownerFileImagePreview}
344
          preload="none"
345
        />
5579 stevensc 346
      )}
347
      {ownerFileDocument && (
4017 stevensc 348
        <a href={ownerFileDocument} target="_blank" rel="noreferrer">
5414 stevensc 349
          {labels.DOWNLOAD}
4017 stevensc 350
        </a>
5579 stevensc 351
      )}
352
      {isShare && (
4017 stevensc 353
        <Feed.SharedContent
354
          name={sharedItem.name}
355
          image={sharedItem.image}
356
          timeElapse={sharedItem.time_elapse}
357
          description={sharedItem.description}
358
          fileVideo={sharedItem.file_video}
359
          fileImagePreview={sharedItem.file_image_preview}
360
          fileImage={sharedItem.file_image}
361
          fileDocument={sharedItem.file_document}
362
        />
5579 stevensc 363
      )}
4017 stevensc 364
    </div>
365
  )
366
}
367
 
368
const Description = ({ ownerDescription }) => {
5115 stevensc 369
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
5579 stevensc 370
  const labels = useSelector((state) => state.labels)
4017 stevensc 371
 
372
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
373
 
374
  const htmlParsedText = (fullStringText) => {
375
    const fullText = parse(fullStringText)
376
    if (fullStringText.length > 500) {
5115 stevensc 377
      const shortenedString = fullStringText.substr(0, 500)
378
      const shortenedText = parse(`${shortenedString}... `)
4017 stevensc 379
      return (
380
        <p>
381
          {isReadMoreActive ? fullText : shortenedText}
5579 stevensc 382
          <span className="cursor-pointer" onClick={readMoreHandler}>
5414 stevensc 383
            {isReadMoreActive ? labels.READ_LESS : labels.READ_MORE}
4017 stevensc 384
          </span>
385
        </p>
5115 stevensc 386
      )
4017 stevensc 387
    }
388
    return <p>{fullText}</p>
5115 stevensc 389
  }
4017 stevensc 390
 
391
  return (
5579 stevensc 392
    <div className="show-read-more">{htmlParsedText(ownerDescription)}</div>
4017 stevensc 393
  )
394
}
395
 
396
const SharedContent = ({
397
  name,
398
  image,
399
  timeElapse,
400
  description,
401
  fileVideo,
402
  fileImagePreview,
403
  fileImage,
5579 stevensc 404
  fileDocument,
4017 stevensc 405
}) => {
5115 stevensc 406
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
5579 stevensc 407
  const labels = useSelector((state) => state.labels)
4017 stevensc 408
 
409
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
410
 
411
  const htmlParsedText = (fullStringText) => {
412
    const fullText = parse(fullStringText)
413
    if (fullStringText.length > 500) {
5115 stevensc 414
      const shortenedString = fullStringText.substr(0, 500)
415
      const shortenedText = parse(`${shortenedString}... `)
4017 stevensc 416
      return (
417
        <p>
418
          {isReadMoreActive ? fullText : shortenedText}
5579 stevensc 419
          <span className="cursor-pointer" onClick={readMoreHandler}>
5414 stevensc 420
            {isReadMoreActive ? labels.READ_LESS : labels.READ_MORE}
4017 stevensc 421
          </span>
422
        </p>
5115 stevensc 423
      )
4017 stevensc 424
    }
425
    return <p>{fullText}</p>
5115 stevensc 426
  }
4017 stevensc 427
 
428
  return (
429
    <div className="shared-post-bar">
430
      <div className="post-bar">
431
        <div className="post_topbar">
432
          <div className="usy-dt">
5579 stevensc 433
            <img src={image} alt="" style={{ width: '50px', height: 'auto' }} />
4017 stevensc 434
            <div className="usy-name">
435
              <h3>{name}</h3>
5579 stevensc 436
              <span>{timeElapse}</span>
4017 stevensc 437
            </div>
438
          </div>
439
        </div>
440
        <div className="job_descp">
5579 stevensc 441
          <div className="show-read-more">{htmlParsedText(description)}</div>
442
          {fileImage && (
443
            <img src={fileImage} className="Entradas" loading="lazy" />
444
          )}
445
          {fileVideo && (
4017 stevensc 446
            <video
447
              src={fileVideo}
448
              controls
449
              poster={fileImagePreview}
450
              preload="none"
451
            />
5579 stevensc 452
          )}
453
          {fileDocument && (
4017 stevensc 454
            <a href={fileDocument} target="_blank" rel="noreferrer">
5414 stevensc 455
              {labels.DOWNLOAD}
4017 stevensc 456
            </a>
5579 stevensc 457
          )}
4017 stevensc 458
        </div>
459
      </div>
460
    </div>
461
  )
462
}
463
 
464
Feed.SharedContent = SharedContent
465
Feed.Description = Description
466
Feed.Content = Content
467
 
5115 stevensc 468
export default React.memo(Feed)