Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 5119 | Rev 5946 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
5109 stevensc 1
/* eslint-disable camelcase */
4265 stevensc 2
/* eslint-disable react/prop-types */
4621 stevensc 3
import React, { useEffect, useRef, useState } from 'react'
4265 stevensc 4
import ThumbUpAltOutlinedIcon from '@mui/icons-material/ThumbUpAltOutlined'
4280 stevensc 5
import ThumbUpAltIcon from '@mui/icons-material/ThumbUpAlt'
4265 stevensc 6
import ChatOutlinedIcon from '@mui/icons-material/ChatOutlined'
7
import ShareOutlinedIcon from '@mui/icons-material/ShareOutlined'
8
import SendOutlinedIcon from '@mui/icons-material/SendOutlined'
5107 stevensc 9
import RecommendIcon from '@mui/icons-material/Recommend'
4265 stevensc 10
import InputOption from './InputOption'
4270 stevensc 11
import parse from 'html-react-parser'
4265 stevensc 12
import Avatar from '../../../../shared/Avatar/Avatar'
5107 stevensc 13
import AccessTimeIcon from '@mui/icons-material/AccessTime'
4280 stevensc 14
import { axios } from '../../../../utils'
15
import { addNotification } from '../../../../redux/notification/notification.actions'
16
import { openShareModal } from '../../../../redux/share-modal/shareModal.actions'
17
import { shareModalTypes } from '../../../../redux/share-modal/shareModal.types'
18
import { feedTypes } from '../../../../redux/feed/feed.types'
19
import FeedCommentSection from '../../../components/feed/feed-comment/FeedCommentSection'
4621 stevensc 20
import { connect, useDispatch } from 'react-redux'
4309 stevensc 21
import withExternalShare from './withExternalShare'
4621 stevensc 22
import ConfirmModal from '../../../../shared/confirm-modal/ConfirmModal'
23
import { deleteFeed } from '../../../../redux/feed/feed.actions'
5007 stevensc 24
import FeedModal from '../../../components/feed/FeedModal'
4265 stevensc 25
 
5115 stevensc 26
const Feed = (props) => {
27
  const {
28
    isShare = false,
29
    feed_unique,
30
    feed_is_liked,
31
    feed_like_url,
32
    feed_unlike_url,
33
    feed_share_url,
34
    feed_share_external_url,
35
    feed_delete_url,
36
    feed_likes,
37
    owner_url,
38
    owner_image,
39
    owner_name,
40
    owner_description,
41
    owner_shared,
42
    owner_comments,
43
    owner_time_elapse,
44
    owner_file_image_preview,
45
    owner_file_video,
46
    owner_file_image,
47
    owner_file_document,
48
    comment_add_url,
49
    comments,
50
    shared_name,
51
    shared_image,
52
    shared_time_elapse,
53
    shared_description,
54
    shared_file_video,
55
    shared_file_image_preview,
56
    shared_file_image,
57
    owner_external_shared,
58
    shared_file_document,
59
    shared_url,
60
    feed_increment_external_counter_url,
61
    addNotification, // REDUX ACTION
5911 stevensc 62
    openShareModal, // REDUX ACTION
5115 stevensc 63
  } = props
64
 
5107 stevensc 65
  const [feedIsLiked, setFeedIsLiked] = useState(feed_is_liked)
66
  const [likesState, setLikesState] = useState(feed_likes)
67
  const [totalComments, setTotalComments] = useState(owner_comments)
68
  const [externalShare, setExternalShare] = useState(owner_external_shared)
69
  const [sharedState, setSharedState] = useState(owner_shared)
70
  const [showComments, setShowComments] = useState(false)
71
  const [showModal, setShowModal] = useState(false)
4271 stevensc 72
 
4280 stevensc 73
  const handleLike = (url) => {
5911 stevensc 74
    axios.post(url).then(({ data: response }) => {
75
      if (!response.success) {
76
        addNotification({ style: 'danger', msg: response.data })
77
        return
78
      }
79
      setLikesState(response.data.likes)
80
      setFeedIsLiked(!feedIsLiked)
81
    })
5107 stevensc 82
  }
4278 stevensc 83
 
5911 stevensc 84
  const handleShare = () =>
85
    openShareModal(
86
      feed_share_url,
87
      shareModalTypes.SHARE,
88
      feedTypes.DASHBOARD,
89
      feed_unique
90
    )
4803 stevensc 91
  const handleExternalShare = (value) => setExternalShare(value)
4271 stevensc 92
 
4280 stevensc 93
  const displayCommentSection = () => setShowComments(!showComments)
4265 stevensc 94
 
5911 stevensc 95
  const ExternalShareButton = withExternalShare(
96
    InputOption,
97
    feed_share_external_url,
98
    {
99
      Icon: SendOutlinedIcon,
100
      color: 'gray',
101
      title: 'Send',
102
      shareUrl: feed_increment_external_counter_url,
103
      setValue: handleExternalShare,
104
      withTitle: true,
105
    }
106
  )
4285 stevensc 107
 
5107 stevensc 108
  useEffect(() => setSharedState(owner_shared), [owner_shared])
4698 stevensc 109
 
4280 stevensc 110
  return (
5007 stevensc 111
    <>
5911 stevensc 112
      {showModal && (
113
        <FeedModal
114
          isShow={true}
115
          feed={props}
116
          handleClose={() => setShowModal(false)}
117
        />
118
      )}
119
      <div className="feed">
5007 stevensc 120
        <Feed.Header
121
          image={owner_image}
122
          name={owner_name}
123
          timeElapsed={owner_time_elapse}
124
          viewUrl={owner_url}
125
          deleteUrl={feed_delete_url}
126
          feedUnique={feed_unique}
4280 stevensc 127
        />
4698 stevensc 128
 
5911 stevensc 129
        <div
130
          className="feed__body"
131
          onClick={() =>
132
            (owner_file_image || owner_file_video || owner_file_document) &&
133
            setShowModal(true)
134
          }
135
        >
5007 stevensc 136
          <Feed.Content
137
            ownerDescription={owner_description}
138
            ownerFileImage={owner_file_image}
139
            ownerFileImagepreview={owner_file_image_preview}
140
            ownerFileVideo={owner_file_video}
141
            ownerFileDocument={owner_file_document}
142
            sharedItem={{
143
              name: shared_name,
144
              image: shared_image,
145
              time_elapse: shared_time_elapse,
146
              description: shared_description,
147
              file_video: shared_file_video,
148
              file_image_preview: shared_file_image_preview,
149
              file_image: shared_file_image,
150
              file_document: shared_file_document,
5911 stevensc 151
              shared_url,
5007 stevensc 152
            }}
153
          />
4697 stevensc 154
        </div>
4265 stevensc 155
 
5911 stevensc 156
        {!isShare && (
5007 stevensc 157
          <div className="px-3 d-flex align-items-center justify-content-between">
5911 stevensc 158
            {!!likesState && (
159
              <div
160
                className="d-inline-flex align-items-center"
161
                style={{ gap: '.5rem' }}
162
              >
5007 stevensc 163
                <RecommendIcon style={{ color: '#7405f9' }} />
164
                <span>{likesState}</span>
5911 stevensc 165
              </div>
166
            )}
167
            <div
168
              className="d-inline-flex align-items-center"
169
              style={{ gap: '5px' }}
170
            >
171
              {!!totalComments && (
172
                <span>{`${totalComments} ${LABELS.COMMENTS.toLowerCase()}`}</span>
173
              )}
174
              {!!sharedState && (
175
                <span>{`${sharedState} ${LABELS.SHARED.toLowerCase()}`}</span>
176
              )}
177
              {!!externalShare && (
178
                <span>{`${externalShare} ${LABELS.SENDS.toLowerCase()}`}</span>
179
              )}
5007 stevensc 180
            </div>
181
          </div>
5911 stevensc 182
        )}
5007 stevensc 183
 
5911 stevensc 184
        {!isShare && (
185
          <div className="feed__buttons">
5007 stevensc 186
            <InputOption
187
              Icon={feedIsLiked ? ThumbUpAltIcon : ThumbUpAltOutlinedIcon}
5115 stevensc 188
              title={LABELS.LIKE}
5007 stevensc 189
              color={feedIsLiked ? '#7405f9' : 'gray'}
5911 stevensc 190
              onClick={() =>
191
                handleLike(feedIsLiked ? feed_unlike_url : feed_like_url)
192
              }
193
              withTitle
5007 stevensc 194
            />
195
            <InputOption
196
              Icon={ChatOutlinedIcon}
5115 stevensc 197
              title={LABELS.COMMENT}
5911 stevensc 198
              color="gray"
5007 stevensc 199
              onClick={displayCommentSection}
5911 stevensc 200
              withTitle
5007 stevensc 201
            />
202
            <InputOption
203
              Icon={ShareOutlinedIcon}
5115 stevensc 204
              title={LABELS.SHARE}
5911 stevensc 205
              color="gray"
5007 stevensc 206
              onClick={handleShare}
5911 stevensc 207
              withTitle
5007 stevensc 208
            />
209
            <ExternalShareButton />
210
          </div>
5911 stevensc 211
        )}
5007 stevensc 212
 
5911 stevensc 213
        <div className="px-2 pb-2">
5007 stevensc 214
          <FeedCommentSection
215
            feedId={feed_unique}
216
            image={owner_image}
217
            addUrl={comment_add_url}
218
            updateTotalComments={(total) => setTotalComments(total)}
219
            comments={comments}
220
            isShow={showComments}
4310 stevensc 221
          />
222
        </div>
4322 stevensc 223
      </div>
5007 stevensc 224
    </>
4265 stevensc 225
  )
226
}
227
 
4280 stevensc 228
const Content = ({
229
  ownerDescription,
230
  ownerFileImage,
4987 stevensc 231
  ownerFileImagepreview,
4280 stevensc 232
  ownerFileVideo,
4295 stevensc 233
  ownerFileDocument,
5911 stevensc 234
  sharedItem,
4280 stevensc 235
}) => {
5107 stevensc 236
  const [isReadMoreActive, setIsReadMoreActive] = useState(false)
4636 stevensc 237
 
238
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
239
 
240
  const htmlParsedText = (fullStringText) => {
241
    const fullText = parse(fullStringText)
242
    if (fullStringText.length > 500) {
5107 stevensc 243
      const shortenedString = fullStringText.substr(0, 500)
244
      const shortenedText = parse(`${shortenedString}... `)
4636 stevensc 245
      return (
4697 stevensc 246
        <>
4636 stevensc 247
          {isReadMoreActive ? fullText : shortenedText}
5911 stevensc 248
          <span className="cursor-pointer" onClick={readMoreHandler}>
5115 stevensc 249
            {isReadMoreActive ? LABELS.READ_LESS : LABELS.READ_MORE}
4636 stevensc 250
          </span>
4697 stevensc 251
        </>
5107 stevensc 252
      )
4636 stevensc 253
    }
254
    return <p>{fullText}</p>
255
  }
256
 
4280 stevensc 257
  return (
258
    <>
4636 stevensc 259
      {ownerDescription && htmlParsedText(ownerDescription)}
5911 stevensc 260
      {ownerFileImage && (
261
        <img src={ownerFileImage} className="Entradas" loading="lazy" />
262
      )}
263
      {ownerFileVideo && (
4280 stevensc 264
        <video
265
          src={ownerFileVideo}
266
          controls
4987 stevensc 267
          poster={ownerFileImagepreview}
4280 stevensc 268
          preload="none"
269
        />
5911 stevensc 270
      )}
271
      {ownerFileDocument && (
4280 stevensc 272
        <a href={ownerFileDocument} target="_blank" rel="noreferrer">
5115 stevensc 273
          {LABELS.DOWNLOAD}
4280 stevensc 274
        </a>
5911 stevensc 275
      )}
276
      {sharedItem.name && (
5011 stevensc 277
        <div className="py-3 px-md-3">
4309 stevensc 278
          <Feed
4310 stevensc 279
            isShare={true}
4309 stevensc 280
            owner_name={sharedItem.name}
281
            owner_image={sharedItem.image}
282
            owner_time_elapse={sharedItem.time_elapse}
283
            owner_description={sharedItem.description}
284
            owner_file_video={sharedItem.file_video}
285
            owner_file_image_preview={sharedItem.file_image_preview}
286
            owner_file_image={sharedItem.file_image}
287
            owner_file_document={sharedItem.file_document}
4320 stevensc 288
            owner_url={sharedItem.shared_url}
4309 stevensc 289
          />
290
        </div>
5911 stevensc 291
      )}
4280 stevensc 292
    </>
293
  )
294
}
295
 
296
const Header = ({
4284 stevensc 297
  image = '',
298
  name = '',
299
  timeElapsed = '',
4320 stevensc 300
  deleteUrl = '',
301
  viewUrl = '',
5911 stevensc 302
  feedUnique = '',
4280 stevensc 303
}) => {
5107 stevensc 304
  const [showConfirmModal, setShowConfirmModal] = useState(false)
4621 stevensc 305
  const [displayOption, setDisplayOption] = useState(false)
5107 stevensc 306
  const deleteButton = useRef()
4621 stevensc 307
  const dispatch = useDispatch()
308
 
5107 stevensc 309
  const handleShowConfirmModal = () => setShowConfirmModal(!showConfirmModal)
4621 stevensc 310
 
311
  const deleteFeedHandler = () => {
5911 stevensc 312
    axios.post(deleteUrl).then((res) => {
313
      const { data } = res
314
      if (!data.success) {
315
        dispatch(addNotification({ style: 'danger', msg: data.data }))
316
        return
317
      }
318
      dispatch(addNotification({ style: 'success', msg: data.data }))
319
      handleShowConfirmModal()
320
      dispatch(deleteFeed(feedUnique))
321
    })
5107 stevensc 322
  }
4621 stevensc 323
 
324
  useEffect(() => {
325
    const handleClickOutside = (event) => {
5911 stevensc 326
      if (
327
        deleteButton.current &&
328
        !deleteButton.current.contains(event.target)
329
      ) {
4621 stevensc 330
        setDisplayOption(false)
331
      }
332
    }
5107 stevensc 333
    document.addEventListener('mousedown', handleClickOutside)
4621 stevensc 334
 
335
    return () => {
5107 stevensc 336
      document.removeEventListener('mousedown', handleClickOutside)
337
    }
338
  }, [deleteButton])
4621 stevensc 339
 
4280 stevensc 340
  return (
5911 stevensc 341
    <div className="feed__header">
4623 stevensc 342
      <div className="d-inline-flex" style={{ gap: '.5rem' }}>
5911 stevensc 343
        <Avatar imageUrl={image} name={name} size="xl" />
4623 stevensc 344
 
5911 stevensc 345
        <div className="feed__info">
4623 stevensc 346
          <a href={viewUrl}>
347
            <h2>{name}</h2>
348
          </a>
5911 stevensc 349
          <div className="time__elapse">
350
            <p>{timeElapsed}</p>
351
            <AccessTimeIcon className="time__elapse-icon" />
4623 stevensc 352
          </div>
4280 stevensc 353
        </div>
354
      </div>
4623 stevensc 355
 
5911 stevensc 356
      {deleteUrl && (
4623 stevensc 357
        <div className="cursor-pointer d-flex align-items-center position-relative">
4621 stevensc 358
          <img
5911 stevensc 359
            src="/images/icons/options.png"
360
            className="cursor-pointer img-icon options"
4621 stevensc 361
            onClick={() => setDisplayOption(!displayOption)}
362
          />
363
          <div className={`feed-options ${displayOption ? 'active' : ''}`}>
364
            <ul>
365
              <li>
366
                <button
367
                  className="option-btn"
368
                  onClick={handleShowConfirmModal}
369
                  ref={deleteButton}
370
                >
371
                  <i className="fa fa-trash-o mr-1" />
5109 stevensc 372
                  {LABELS.DELETE}
4621 stevensc 373
                </button>
374
              </li>
375
            </ul>
376
          </div>
377
          <ConfirmModal
378
            show={showConfirmModal}
379
            onClose={() => handleShowConfirmModal(false)}
380
            onAccept={deleteFeedHandler}
5107 stevensc 381
            acceptLabel={LABELS.ACCEPT}
4621 stevensc 382
          />
5911 stevensc 383
        </div>
384
      )}
4280 stevensc 385
    </div>
386
  )
387
}
388
 
389
Feed.Content = Content
390
Feed.Header = Header
391
 
4281 stevensc 392
const mapDispatchToProps = {
393
  addNotification: (notification) => addNotification(notification),
5911 stevensc 394
  openShareModal: (postUrl, modalType, feedType) =>
395
    openShareModal(postUrl, modalType, feedType),
5107 stevensc 396
}
4281 stevensc 397
 
5107 stevensc 398
export default connect(null, mapDispatchToProps)(Feed)