Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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