Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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