Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3946 | Rev 4005 | 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 */
1025 stevensc 2
import React, { useEffect, useState } from "react";
1034 stevensc 3
import { useDispatch } from "react-redux";
1 www 4
import { shareModalTypes } from "../../../redux/share-modal/shareModal.types";
1021 stevensc 5
import { axios } from "../../../utils";
1 www 6
import { feedTypes } from "../../../redux/feed/feed.types";
3630 stevensc 7
import { BsHeart, BsHeartFill } from 'react-icons/bs'
2839 stevensc 8
import { RiShareForwardLine } from 'react-icons/ri'
3630 stevensc 9
import { BiMessage, BiShareAlt } from "react-icons/bi";
3466 stevensc 10
import { EmailIcon, EmailShareButton, FacebookIcon, FacebookShareButton, RedditIcon, RedditShareButton, TelegramIcon, TelegramShareButton, TwitterIcon, TwitterShareButton, WhatsappIcon, WhatsappShareButton } from "react-share";
1 www 11
 
1034 stevensc 12
// Redux actions
13
import { openShareModal } from "../../../redux/share-modal/shareModal.actions";
14
import { addNotification } from "../../../redux/notification/notification.actions";
3202 stevensc 15
import { useRef } from "react";
3630 stevensc 16
import FeedModal from "./FeedModal";
17
import FeedHeader from "./FeedHeader";
3943 stevensc 18
import FeedCommentSection from "./feed-comment/FeedCommentSection";
1034 stevensc 19
 
3630 stevensc 20
const FeedTemplate = ({ feed, owner_shared, image, children }) => {
1034 stevensc 21
 
1 www 22
  // Destructuring feed data
23
  const {
24
    feed_unique,
25
    owner_name,
26
    owner_url,
27
    owner_image,
28
    owner_time_elapse,
29
    owner_file_image,
30
    owner_file_video,
31
    owner_file_document,
2572 stevensc 32
    feed_likes,
1 www 33
    feed_like_url,
34
    feed_unlike_url,
35
    feed_is_liked,
3207 stevensc 36
    feed_highlighted,
1 www 37
    feed_share_url,
38
    feed_delete_url,
39
    comments,
40
    comment_add_url,
3303 stevensc 41
    feed_share_external_url
1040 stevensc 42
  } = feed;
1 www 43
 
1034 stevensc 44
  const dispatch = useDispatch()
1 www 45
 
1291 stevensc 46
  const [totalComments, setTotalComments] = useState(comments.length || 0);
1 www 47
  const [feedIsLiked, setFeedIsLiked] = useState(feed_is_liked);
1034 stevensc 48
  const [sharedState, setSharedState] = useState(owner_shared);
1047 stevensc 49
  const [likesState, setLikesState] = useState(feed_likes);
3795 stevensc 50
  const [shareUrl, setShareUrl] = useState('');
3962 stevensc 51
  const [showComments, setShowComments] = useState(false);
3630 stevensc 52
 
3308 stevensc 53
  const [shareOptions, setShareOptions] = useState(false)
56 steven 54
  const [show, setShow] = useState(false);
1 www 55
 
1034 stevensc 56
 
3630 stevensc 57
  const shareContainer = useRef(null);
1030 stevensc 58
 
3630 stevensc 59
  useEffect(() => setSharedState(owner_shared), [owner_shared]);
3202 stevensc 60
 
3310 stevensc 61
  useEffect(() => {
62
    const handleClickOutside = (event) => {
63
      if (shareContainer.current && !shareContainer.current.contains(event.target)) {
3323 stevensc 64
        setShareOptions(false)
3310 stevensc 65
      }
66
    }
67
    document.addEventListener("mousedown", handleClickOutside);
68
 
69
    return () => {
70
      document.removeEventListener("mousedown", handleClickOutside);
71
    };
72
  }, [shareContainer]);
73
 
3798 stevensc 74
  const getShareUrl = new Promise((resolve, reject) => {
75
    axios
76
      .get(feed_share_external_url)
77
      .then(({ data }) => {
3803 stevensc 78
        if (!data.success) {
79
          dispatch(addNotification({ style: 'danger', msg: data.data }))
80
          setShareOptions(false)
81
          return reject(data.data)
82
        }
3802 stevensc 83
        setShareUrl(data.data)
3799 stevensc 84
        return resolve(data.data)
3798 stevensc 85
      })
3803 stevensc 86
      .catch((err) => reject(err))
3798 stevensc 87
  });
3797 stevensc 88
 
3795 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 (
112
    <React.Fragment>
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
        >
3630 stevensc 132
          {children}
718 steven 133
        </div>
1 www 134
        <div className="job-status-bar">
2833 stevensc 135
          <ul className="reactions-list">
1 www 136
            <li>
1082 stevensc 137
              <button
138
                type="button"
139
                id={feedIsLiked ? `btn-unlike-${feed_unique}` : `btn-like-${feed_unique}`}
140
                data-feed-unique={feed_unique}
141
                className={feedIsLiked ? "btn-unlike" : "btn-like"}
3202 stevensc 142
                onClick={() => likeHandler(feedIsLiked ? feed_unlike_url : feed_like_url)}
1082 stevensc 143
              >
2836 stevensc 144
                {feedIsLiked ? <BsHeartFill className="mr-1" /> : <BsHeart className="mr-1" />}
2571 stevensc 145
                {likesState}
1082 stevensc 146
              </button>
1068 stevensc 147
            </li>
148
            <li>
1080 stevensc 149
              <button
150
                type="button"
1 www 151
                id={`btn-comments-${feed_unique}`}
152
                className="btn-indicator"
3962 stevensc 153
                onClick={displayComments}
1 www 154
              >
2839 stevensc 155
                <BiMessage className="mr-1" />
2571 stevensc 156
                {totalComments}
1080 stevensc 157
              </button>
1 www 158
            </li>
159
            <li>
1080 stevensc 160
              <button
161
                type="button"
1 www 162
                id={`btn-share-${feed_unique}`}
163
                className="btn-indicator"
2211 stevensc 164
                onClick={btnShareHandler}
165
              >
2839 stevensc 166
                <RiShareForwardLine className="mr-1" />
2571 stevensc 167
                {sharedState}
2211 stevensc 168
              </button>
169
            </li>
3307 stevensc 170
            <li className="position-relative">
171
              <button
172
                type="button"
173
                className="btn-indicator"
3354 stevensc 174
                onClick={() => setShareOptions(!shareOptions)}
3305 stevensc 175
              >
3307 stevensc 176
                <BiShareAlt />
177
              </button>
3773 stevensc 178
              {shareOptions &&
3310 stevensc 179
                <div className="ext_share" ref={shareContainer}>
3803 stevensc 180
                  <FacebookShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3308 stevensc 181
                    <FacebookIcon size={32} round />
182
                  </FacebookShareButton>
3803 stevensc 183
                  <TwitterShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 184
                    <TwitterIcon size={32} round />
185
                  </TwitterShareButton>
3803 stevensc 186
                  <TelegramShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 187
                    <TelegramIcon size={32} round />
188
                  </TelegramShareButton>
3803 stevensc 189
                  <WhatsappShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 190
                    <WhatsappIcon size={32} round />
191
                  </WhatsappShareButton>
3803 stevensc 192
                  <RedditShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 193
                    <RedditIcon size={32} round />
194
                  </RedditShareButton>
3803 stevensc 195
                  <EmailShareButton beforeOnClick={() => getShareUrl} url={shareUrl}>
3309 stevensc 196
                    <EmailIcon size={32} round />
197
                  </EmailShareButton>
3308 stevensc 198
                </div>
199
              }
3303 stevensc 200
            </li>
1 www 201
          </ul>
202
        </div>
3943 stevensc 203
        <FeedCommentSection
204
          feedId={feed.feed_unique}
205
          image={image}
206
          addUrl={comment_add_url}
207
          updateTotalComments={(total) => setTotalComments(total)}
3946 stevensc 208
          comments={comments}
3962 stevensc 209
          isShow={showComments}
3943 stevensc 210
        />
3503 stevensc 211
      </div >
212
    </React.Fragment >
1 www 213
  );
214
};
215
 
1040 stevensc 216
export default React.memo(FeedTemplate);