Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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