Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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