Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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