Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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