Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
3207 stevensc 1
/* eslint-disable react/prop-types */
4017 stevensc 2
import React, { useEffect, useState, useRef } from "react";
3
import parse from "html-react-parser"
1034 stevensc 4
import { useDispatch } from "react-redux";
1021 stevensc 5
import { axios } from "../../../utils";
3466 stevensc 6
import { EmailIcon, EmailShareButton, FacebookIcon, FacebookShareButton, RedditIcon, RedditShareButton, TelegramIcon, TelegramShareButton, TwitterIcon, TwitterShareButton, WhatsappIcon, WhatsappShareButton } from "react-share";
1 www 7
 
4017 stevensc 8
// Redux types
9
import { shareModalTypes } from "../../../redux/share-modal/shareModal.types";
10
import { feedTypes } from "../../../redux/feed/feed.types";
11
 
1034 stevensc 12
// Redux actions
13
import { openShareModal } from "../../../redux/share-modal/shareModal.actions";
14
import { addNotification } from "../../../redux/notification/notification.actions";
3630 stevensc 15
import FeedModal from "./FeedModal";
16
import FeedHeader from "./FeedHeader";
3943 stevensc 17
import FeedCommentSection from "./feed-comment/FeedCommentSection";
1034 stevensc 18
 
4017 stevensc 19
const Feed = ({ feed, owner_shared, image }) => {
1034 stevensc 20
 
1 www 21
  // Destructuring feed data
22
  const {
23
    feed_unique,
24
    owner_name,
25
    owner_url,
26
    owner_image,
27
    owner_time_elapse,
28
    owner_file_image,
29
    owner_file_video,
30
    owner_file_document,
2572 stevensc 31
    feed_likes,
1 www 32
    feed_like_url,
33
    feed_unlike_url,
34
    feed_is_liked,
3207 stevensc 35
    feed_highlighted,
1 www 36
    feed_share_url,
37
    feed_delete_url,
38
    comments,
39
    comment_add_url,
3303 stevensc 40
    feed_share_external_url
1040 stevensc 41
  } = feed;
1 www 42
 
1034 stevensc 43
  const dispatch = useDispatch()
1 www 44
 
1291 stevensc 45
  const [totalComments, setTotalComments] = useState(comments.length || 0);
1 www 46
  const [feedIsLiked, setFeedIsLiked] = useState(feed_is_liked);
1034 stevensc 47
  const [sharedState, setSharedState] = useState(owner_shared);
1047 stevensc 48
  const [likesState, setLikesState] = useState(feed_likes);
3795 stevensc 49
  const [shareUrl, setShareUrl] = useState('');
3962 stevensc 50
  const [showComments, setShowComments] = useState(false);
3630 stevensc 51
 
3308 stevensc 52
  const [shareOptions, setShareOptions] = useState(false)
56 steven 53
  const [show, setShow] = useState(false);
1 www 54
 
1034 stevensc 55
 
3630 stevensc 56
  const shareContainer = useRef(null);
1030 stevensc 57
 
3630 stevensc 58
  useEffect(() => setSharedState(owner_shared), [owner_shared]);
3202 stevensc 59
 
3310 stevensc 60
  useEffect(() => {
61
    const handleClickOutside = (event) => {
62
      if (shareContainer.current && !shareContainer.current.contains(event.target)) {
3323 stevensc 63
        setShareOptions(false)
3310 stevensc 64
      }
65
    }
66
    document.addEventListener("mousedown", handleClickOutside);
67
 
68
    return () => {
69
      document.removeEventListener("mousedown", handleClickOutside);
70
    };
71
  }, [shareContainer]);
72
 
4016 stevensc 73
  const getShareUrl = new Promise((resolve, reject) => {
74
    if (shareOptions) {
4017 stevensc 75
      axios.get(feed_share_external_url)
4016 stevensc 76
        .then(({ data }) => {
77
          if (!data.success) {
78
            dispatch(addNotification({ style: 'danger', msg: data.data }))
79
            setShareOptions(false)
80
            return reject(data.data)
81
          }
82
          setShareUrl(data.data)
83
          return resolve(data.data)
84
        })
85
        .catch((err) => reject(err))
4015 stevensc 86
    }
4016 stevensc 87
  });
4015 stevensc 88
 
3797 stevensc 89
 
1072 stevensc 90
  const likeHandler = (likeUrl) => {
1043 stevensc 91
    axios.post(likeUrl)
1046 stevensc 92
      .then((res) => {
93
        const { success, data } = res.data;
1043 stevensc 94
        if (!success) {
95
          setFeedIsLiked((previousState) => !previousState);
96
          dispatch(addNotification({
97
            style: "danger",
98
            msg: data,
99
          }));
1049 stevensc 100
        } else {
101
          setLikesState(data.likes)
102
          setFeedIsLiked(!feedIsLiked);
1043 stevensc 103
        }
104
      });
1 www 105
  };
106
 
3962 stevensc 107
  const displayComments = () => setShowComments(!showComments)
108
 
3630 stevensc 109
  const btnShareHandler = () => dispatch(openShareModal(feed_share_url, shareModalTypes.SHARE, feedTypes.DASHBOARD, feed_unique))
1 www 110
 
111
  return (
4017 stevensc 112
    <>
3630 stevensc 113
      <FeedModal
114
        isShow={show}
115
        handleClose={() => setShow(false)}
116
        feed={feed}
117
      />
3504 stevensc 118
      <div className={`postContainer ${feed_highlighted ? 'highlighted' : ''}`}>
3630 stevensc 119
        <FeedHeader
120
          ownerName={owner_name}
121
          ownerImage={owner_image}
122
          ownerTimeElapse={owner_time_elapse}
123
          ownerUrl={owner_url}
124
          feedDeleteUrl={feed_delete_url}
125
          feedUnique={feed_unique}
126
        />
127
        <div onClick={() =>
128
          (owner_file_image || owner_file_video || owner_file_document)
129
          && setShow(true)
130
        }
718 steven 131
        >
4017 stevensc 132
          <Feed.Content
133
            isShare={feed.shared_name ? true : false}
134
            ownerFileImage={feed.owner_file_image}
135
            ownerFileVideo={feed.owner_file_video}
136
            ownerFileImagePreview={feed.owner_file_image_preview}
137
            ownerFileDocument={feed.owner_file_document}
138
            ownerDescription={feed.owner_description}
139
            sharedItem={{
140
              name: feed.shared_name,
141
              image: feed.shared_image,
142
              time_elapse: feed.shared_time_elapse,
143
              description: feed.shared_description,
144
              file_video: feed.shared_file_video,
145
              file_image_preview: feed.shared_file_image_preview,
146
              file_image: feed.shared_file_image,
147
              file_document: feed.shared_file_document
148
            }}
149
          />
718 steven 150
        </div>
1 www 151
        <div className="job-status-bar">
2833 stevensc 152
          <ul className="reactions-list">
1 www 153
            <li>
1082 stevensc 154
              <button
155
                type="button"
156
                id={feedIsLiked ? `btn-unlike-${feed_unique}` : `btn-like-${feed_unique}`}
157
                data-feed-unique={feed_unique}
158
                className={feedIsLiked ? "btn-unlike" : "btn-like"}
3202 stevensc 159
                onClick={() => likeHandler(feedIsLiked ? feed_unlike_url : feed_like_url)}
1082 stevensc 160
              >
4039 stevensc 161
                {feedIsLiked ? <img src="/images/icons/heart.png" className="mr-1 img-icon" /> : <img src="/images/icons/heart.png" className="mr-1 img-icon" />}
2571 stevensc 162
                {likesState}
1082 stevensc 163
              </button>
1068 stevensc 164
            </li>
165
            <li>
1080 stevensc 166
              <button
167
                type="button"
1 www 168
                id={`btn-comments-${feed_unique}`}
169
                className="btn-indicator"
3962 stevensc 170
                onClick={displayComments}
1 www 171
              >
4039 stevensc 172
                <img src="/images/icons/message.png" className="mr-1 img-icon" />
2571 stevensc 173
                {totalComments}
1080 stevensc 174
              </button>
1 www 175
            </li>
176
            <li>
1080 stevensc 177
              <button
178
                type="button"
1 www 179
                id={`btn-share-${feed_unique}`}
180
                className="btn-indicator"
2211 stevensc 181
                onClick={btnShareHandler}
182
              >
4039 stevensc 183
                <img src="/images/icons/share.png" className="mr-1 img-icon" />
2571 stevensc 184
                {sharedState}
2211 stevensc 185
              </button>
186
            </li>
3307 stevensc 187
            <li className="position-relative">
188
              <button
189
                type="button"
190
                className="btn-indicator"
3354 stevensc 191
                onClick={() => setShareOptions(!shareOptions)}
3305 stevensc 192
              >
4039 stevensc 193
                <img src="/images/icons/share.png" className="mr-1 img-icon" />
3307 stevensc 194
              </button>
3773 stevensc 195
              {shareOptions &&
3310 stevensc 196
                <div className="ext_share" ref={shareContainer}>
4016 stevensc 197
                  <FacebookShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3308 stevensc 198
                    <FacebookIcon size={32} round />
199
                  </FacebookShareButton>
4016 stevensc 200
                  <TwitterShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 201
                    <TwitterIcon size={32} round />
202
                  </TwitterShareButton>
4016 stevensc 203
                  <TelegramShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 204
                    <TelegramIcon size={32} round />
205
                  </TelegramShareButton>
4016 stevensc 206
                  <WhatsappShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 207
                    <WhatsappIcon size={32} round />
208
                  </WhatsappShareButton>
4016 stevensc 209
                  <RedditShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 210
                    <RedditIcon size={32} round />
211
                  </RedditShareButton>
4016 stevensc 212
                  <EmailShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 213
                    <EmailIcon size={32} round />
214
                  </EmailShareButton>
3308 stevensc 215
                </div>
216
              }
3303 stevensc 217
            </li>
1 www 218
          </ul>
219
        </div>
3943 stevensc 220
        <FeedCommentSection
221
          feedId={feed.feed_unique}
222
          image={image}
223
          addUrl={comment_add_url}
224
          updateTotalComments={(total) => setTotalComments(total)}
3946 stevensc 225
          comments={comments}
3962 stevensc 226
          isShow={showComments}
3943 stevensc 227
        />
3503 stevensc 228
      </div >
4017 stevensc 229
    </>
1 www 230
  );
231
};
232
 
4017 stevensc 233
const Content = ({
234
  showDescription = true,
235
  ownerFileImage,
236
  ownerFileVideo,
237
  ownerFileImagePreview,
238
  ownerFileDocument,
239
  ownerDescription,
240
  isShare,
241
  sharedItem
242
}) => {
243
 
244
  return (
245
    <div className="job_descp">
246
      {showDescription &&
247
        <Feed.Description ownerDescription={ownerDescription} />
248
      }
249
      {ownerFileImage &&
250
        <img src={ownerFileImage} className="Entradas" loading='lazy' />
251
      }
252
      {ownerFileVideo &&
253
        <video
254
          src={ownerFileVideo}
255
          controls
256
          poster={ownerFileImagePreview}
257
          preload="none"
258
        />
259
      }
260
      {ownerFileDocument &&
261
        <a href={ownerFileDocument} target="_blank" rel="noreferrer">
262
          Descargar
263
        </a>
264
      }
265
      {isShare &&
266
        <Feed.SharedContent
267
          name={sharedItem.name}
268
          image={sharedItem.image}
269
          timeElapse={sharedItem.time_elapse}
270
          description={sharedItem.description}
271
          fileVideo={sharedItem.file_video}
272
          fileImagePreview={sharedItem.file_image_preview}
273
          fileImage={sharedItem.file_image}
274
          fileDocument={sharedItem.file_document}
275
        />
276
      }
277
    </div>
278
  )
279
}
280
 
281
const Description = ({ ownerDescription }) => {
282
 
283
  const [isReadMoreActive, setIsReadMoreActive] = useState(false);
284
 
285
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
286
 
287
  const htmlParsedText = (fullStringText) => {
288
    const fullText = parse(fullStringText)
289
    if (fullStringText.length > 500) {
290
      const shortenedString = fullStringText.substr(0, 500);
291
      const shortenedText = parse(`${shortenedString}... `);
292
      return (
293
        <p>
294
          {isReadMoreActive ? fullText : shortenedText}
295
          <span className='cursor-pointer' onClick={readMoreHandler}>
296
            {isReadMoreActive ? " Leer menos" : " Leer más"}
297
          </span>
298
        </p>
299
      );
300
    }
301
    return <p>{fullText}</p>
302
  };
303
 
304
  return (
305
    <div className="show-read-more">
306
      {htmlParsedText(ownerDescription)}
307
    </div>
308
  )
309
}
310
 
311
const SharedContent = ({
312
  name,
313
  image,
314
  timeElapse,
315
  description,
316
  fileVideo,
317
  fileImagePreview,
318
  fileImage,
319
  fileDocument,
320
}) => {
321
 
322
  const [isReadMoreActive, setIsReadMoreActive] = useState(false);
323
 
324
  const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)
325
 
326
  const htmlParsedText = (fullStringText) => {
327
    const fullText = parse(fullStringText)
328
    if (fullStringText.length > 500) {
329
      const shortenedString = fullStringText.substr(0, 500);
330
      const shortenedText = parse(`${shortenedString}... `);
331
      return (
332
        <p>
333
          {isReadMoreActive ? fullText : shortenedText}
334
          <span className='cursor-pointer' onClick={readMoreHandler}>
335
            {isReadMoreActive ? " Leer menos" : " Leer más"}
336
          </span>
337
        </p>
338
      );
339
    }
340
    return <p>{fullText}</p>
341
  };
342
 
343
  return (
344
    <div className="shared-post-bar">
345
      <div className="post-bar">
346
        <div className="post_topbar">
347
          <div className="usy-dt">
348
            <img
349
              src={image}
350
              alt=""
351
              style={{ width: "50px", height: "auto" }}
352
            />
353
            <div className="usy-name">
354
              <h3>{name}</h3>
355
              <span>
356
                {timeElapse}
357
              </span>
358
            </div>
359
          </div>
360
        </div>
361
        <div className="job_descp">
362
          <div className="show-read-more">
363
            {htmlParsedText(description)}
364
          </div>
365
          {fileImage &&
366
            <img src={fileImage} className="Entradas" loading='lazy' />
367
          }
368
          {fileVideo &&
369
            <video
370
              src={fileVideo}
371
              controls
372
              poster={fileImagePreview}
373
              preload="none"
374
            />
375
          }
376
          {fileDocument &&
377
            <a href={fileDocument} target="_blank" rel="noreferrer">
378
              Descargar
379
            </a>
380
          }
381
        </div>
382
      </div>
383
    </div>
384
  )
385
}
386
 
387
Feed.SharedContent = SharedContent
388
Feed.Description = Description
389
Feed.Content = Content
390
 
391
export default React.memo(Feed);