Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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