Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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