Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3801 | Rev 3803 | 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 { useForm } from "react-hook-form";
5
import FormErrorFeedback from "../../../shared/form-error-feedback/FormErrorFeedback";
6
import FeedCommentTemplate from "./feed-comment/FeedCommentTemplate";
7
import { shareModalTypes } from "../../../redux/share-modal/shareModal.types";
1021 stevensc 8
import { axios } from "../../../utils";
1 www 9
import { feedTypes } from "../../../redux/feed/feed.types";
3630 stevensc 10
import { BsHeart, BsHeartFill } from 'react-icons/bs'
2839 stevensc 11
import { RiShareForwardLine } from 'react-icons/ri'
12
import { TbSend } from "react-icons/tb";
3630 stevensc 13
import { BiMessage, BiShareAlt } from "react-icons/bi";
3466 stevensc 14
import { EmailIcon, EmailShareButton, FacebookIcon, FacebookShareButton, RedditIcon, RedditShareButton, TelegramIcon, TelegramShareButton, TwitterIcon, TwitterShareButton, WhatsappIcon, WhatsappShareButton } from "react-share";
1 www 15
 
1034 stevensc 16
// Redux actions
17
import { openShareModal } from "../../../redux/share-modal/shareModal.actions";
18
import { addNotification } from "../../../redux/notification/notification.actions";
3202 stevensc 19
import { useRef } from "react";
3630 stevensc 20
import FeedModal from "./FeedModal";
21
import FeedHeader from "./FeedHeader";
1034 stevensc 22
 
3630 stevensc 23
const FeedTemplate = ({ feed, owner_shared, image, children }) => {
1034 stevensc 24
 
1 www 25
  // Destructuring feed data
26
  const {
27
    feed_unique,
28
    owner_name,
29
    owner_url,
30
    owner_image,
31
    owner_time_elapse,
32
    owner_file_image,
33
    owner_file_video,
34
    owner_file_document,
2572 stevensc 35
    feed_likes,
1 www 36
    feed_like_url,
37
    feed_unlike_url,
38
    feed_is_liked,
3207 stevensc 39
    feed_highlighted,
1 www 40
    feed_share_url,
41
    feed_delete_url,
42
    comments,
43
    comment_add_url,
3303 stevensc 44
    feed_share_external_url
1040 stevensc 45
  } = feed;
1 www 46
 
1034 stevensc 47
  // react hook form
3669 stevensc 48
  const { register, handleSubmit, errors } = useForm();
722 steven 49
 
1034 stevensc 50
  const dispatch = useDispatch()
1 www 51
 
1291 stevensc 52
  const [totalComments, setTotalComments] = useState(comments.length || 0);
1 www 53
  const [feedIsLiked, setFeedIsLiked] = useState(feed_is_liked);
54
  const [commentsState, setCommentsState] = useState(comments);
1034 stevensc 55
  const [sharedState, setSharedState] = useState(owner_shared);
1047 stevensc 56
  const [likesState, setLikesState] = useState(feed_likes);
3795 stevensc 57
  const [shareUrl, setShareUrl] = useState('');
3630 stevensc 58
 
3308 stevensc 59
  const [shareOptions, setShareOptions] = useState(false)
56 steven 60
  const [show, setShow] = useState(false);
1 www 61
 
1034 stevensc 62
 
3630 stevensc 63
  const shareContainer = useRef(null);
1030 stevensc 64
 
3630 stevensc 65
  useEffect(() => setSharedState(owner_shared), [owner_shared]);
3202 stevensc 66
 
3310 stevensc 67
  useEffect(() => {
68
    const handleClickOutside = (event) => {
69
      if (shareContainer.current && !shareContainer.current.contains(event.target)) {
3323 stevensc 70
        setShareOptions(false)
3310 stevensc 71
      }
72
    }
73
    document.addEventListener("mousedown", handleClickOutside);
74
 
75
    return () => {
76
      document.removeEventListener("mousedown", handleClickOutside);
77
    };
78
  }, [shareContainer]);
79
 
3798 stevensc 80
  const getShareUrl = new Promise((resolve, reject) => {
81
    axios
82
      .get(feed_share_external_url)
83
      .then(({ data }) => {
3799 stevensc 84
        if (!data.success) return reject(data.data)
3802 stevensc 85
        setShareUrl(data.data)
3799 stevensc 86
        return resolve(data.data)
3798 stevensc 87
      })
3799 stevensc 88
      .catch((err) => console.log(`Error : ${err}`))
3798 stevensc 89
  });
3797 stevensc 90
 
3795 stevensc 91
 
1072 stevensc 92
  const likeHandler = (likeUrl) => {
1043 stevensc 93
    axios.post(likeUrl)
1046 stevensc 94
      .then((res) => {
95
        const { success, data } = res.data;
1043 stevensc 96
        if (!success) {
97
          setFeedIsLiked((previousState) => !previousState);
98
          dispatch(addNotification({
99
            style: "danger",
100
            msg: data,
101
          }));
1049 stevensc 102
        } else {
103
          setLikesState(data.likes)
104
          setFeedIsLiked(!feedIsLiked);
1043 stevensc 105
        }
106
      });
1 www 107
  };
108
 
109
  const submitCommentHandler = (data, e) => {
110
    const currentFormData = new FormData();
111
    for (let input in data) {
112
      currentFormData.append(input, data[input]);
113
    }
114
    axios.post(comment_add_url, currentFormData).then((res) => {
115
      const resData = res.data;
116
      const { data, success, total_comments } = resData;
117
      if (success) {
118
        const newComment = data;
722 steven 119
        setTotalComments(total_comments);
1084 stevensc 120
        setCommentsState([newComment, ...commentsState]);
1 www 121
        e.target.reset();
122
      } else {
1034 stevensc 123
        dispatch(addNotification({
1 www 124
          style: "danger",
125
          msg: data,
1034 stevensc 126
        }));
1 www 127
      }
128
    });
129
  };
130
 
131
  const deleteCommentHandler = (commentUnique, deleteCommentUrl) => {
1068 stevensc 132
    axios.post(deleteCommentUrl)
1 www 133
      .then((res) => {
975 steven 134
        const { success, data, total_comments } = res.data;
3613 stevensc 135
        if (!success) {
1034 stevensc 136
          dispatch(addNotification({
1 www 137
            style: "danger",
138
            msg: data,
1034 stevensc 139
          }));
1 www 140
        }
3613 stevensc 141
        setCommentsState(prevComments => prevComments.filter((comment) => comment.unique !== commentUnique));
142
        setTotalComments(total_comments);
143
        dispatch(addNotification({ style: "success", msg: data }));
1 www 144
      })
3613 stevensc 145
      .catch((error) =>
146
        dispatch(addNotification({ style: "danger", msg: error.message }))
147
      );
1 www 148
  };
149
 
3630 stevensc 150
  const btnShareHandler = () => dispatch(openShareModal(feed_share_url, shareModalTypes.SHARE, feedTypes.DASHBOARD, feed_unique))
1 www 151
 
152
  let commentsRender = null;
153
  if (commentsState.length) {
154
    commentsRender = (
3503 stevensc 155
      <div className='commentSection'>
1 www 156
        <div className={`comment-sec comment-sec-${feed_unique}`}>
157
          <ul>
158
            {[...commentsState].reverse().map((commentData) => {
159
              const { unique } = commentData;
160
              return (
161
                <FeedCommentTemplate
162
                  commentData={commentData}
163
                  onDeleteHandler={deleteCommentHandler}
164
                  key={unique}
165
                />
166
              );
167
            })}
168
          </ul>
169
        </div>
170
      </div>
171
    );
172
  }
173
 
174
  return (
175
    <React.Fragment>
3630 stevensc 176
      <FeedModal
177
        isShow={show}
178
        handleClose={() => setShow(false)}
179
        feed={feed}
180
      />
3504 stevensc 181
      <div className={`postContainer ${feed_highlighted ? 'highlighted' : ''}`}>
3630 stevensc 182
        <FeedHeader
183
          ownerName={owner_name}
184
          ownerImage={owner_image}
185
          ownerTimeElapse={owner_time_elapse}
186
          ownerUrl={owner_url}
187
          feedDeleteUrl={feed_delete_url}
188
          feedUnique={feed_unique}
189
        />
190
        <div onClick={() =>
191
          (owner_file_image || owner_file_video || owner_file_document)
192
          && setShow(true)
193
        }
718 steven 194
        >
3630 stevensc 195
          {children}
718 steven 196
        </div>
1 www 197
        <div className="job-status-bar">
2833 stevensc 198
          <ul className="reactions-list">
1 www 199
            <li>
1082 stevensc 200
              <button
201
                type="button"
202
                id={feedIsLiked ? `btn-unlike-${feed_unique}` : `btn-like-${feed_unique}`}
203
                data-feed-unique={feed_unique}
204
                className={feedIsLiked ? "btn-unlike" : "btn-like"}
3202 stevensc 205
                onClick={() => likeHandler(feedIsLiked ? feed_unlike_url : feed_like_url)}
1082 stevensc 206
              >
2836 stevensc 207
                {feedIsLiked ? <BsHeartFill className="mr-1" /> : <BsHeart className="mr-1" />}
2571 stevensc 208
                {likesState}
1082 stevensc 209
              </button>
1068 stevensc 210
            </li>
211
            <li>
1080 stevensc 212
              <button
213
                type="button"
1 www 214
                id={`btn-comments-${feed_unique}`}
215
                className="btn-indicator"
216
              >
2839 stevensc 217
                <BiMessage className="mr-1" />
2571 stevensc 218
                {totalComments}
1080 stevensc 219
              </button>
1 www 220
            </li>
221
            <li>
1080 stevensc 222
              <button
223
                type="button"
1 www 224
                id={`btn-share-${feed_unique}`}
225
                className="btn-indicator"
2211 stevensc 226
                onClick={btnShareHandler}
227
              >
2839 stevensc 228
                <RiShareForwardLine className="mr-1" />
2571 stevensc 229
                {sharedState}
2211 stevensc 230
              </button>
231
            </li>
3307 stevensc 232
            <li className="position-relative">
233
              <button
234
                type="button"
235
                className="btn-indicator"
3354 stevensc 236
                onClick={() => setShareOptions(!shareOptions)}
3305 stevensc 237
              >
3307 stevensc 238
                <BiShareAlt />
239
              </button>
3773 stevensc 240
              {shareOptions &&
3310 stevensc 241
                <div className="ext_share" ref={shareContainer}>
3799 stevensc 242
                  <FacebookShareButton beforeOnClick={() =>
243
                    getShareUrl
3801 stevensc 244
                      .then(data => console.log(data))
3799 stevensc 245
                      .catch(error => dispatch(addNotification({ style: 'danger', msg: error })))
246
                  } url={shareUrl}>
3308 stevensc 247
                    <FacebookIcon size={32} round />
248
                  </FacebookShareButton>
3799 stevensc 249
                  <TwitterShareButton beforeOnClick={() =>
250
                    getShareUrl
3801 stevensc 251
                      .then(data => setShareUrl(data))
3799 stevensc 252
                      .catch(error => dispatch(addNotification({ style: 'danger', msg: error })))
253
                  } url={shareUrl}>
3309 stevensc 254
                    <TwitterIcon size={32} round />
255
                  </TwitterShareButton>
3799 stevensc 256
                  <TelegramShareButton beforeOnClick={() =>
257
                    getShareUrl
258
                      .then(data => setShareUrl(data))
259
                      .catch(error => dispatch(addNotification({ style: 'danger', msg: error })))
260
                  } url={shareUrl}>
3309 stevensc 261
                    <TelegramIcon size={32} round />
262
                  </TelegramShareButton>
3799 stevensc 263
                  <WhatsappShareButton beforeOnClick={() =>
264
                    getShareUrl
265
                      .then(data => setShareUrl(data))
266
                      .catch(error => dispatch(addNotification({ style: 'danger', msg: error })))
267
                  } url={shareUrl}>
3309 stevensc 268
                    <WhatsappIcon size={32} round />
269
                  </WhatsappShareButton>
3799 stevensc 270
                  <RedditShareButton beforeOnClick={() =>
271
                    getShareUrl
272
                      .then(data => setShareUrl(data))
273
                      .catch(error => dispatch(addNotification({ style: 'danger', msg: error })))
274
                  } url={shareUrl}>
3309 stevensc 275
                    <RedditIcon size={32} round />
276
                  </RedditShareButton>
3799 stevensc 277
                  <EmailShareButton beforeOnClick={() =>
278
                    getShareUrl
279
                      .then(data => setShareUrl(data))
280
                      .catch(error => dispatch(addNotification({ style: 'danger', msg: error })))
281
                  } url={shareUrl}>
3309 stevensc 282
                    <EmailIcon size={32} round />
283
                  </EmailShareButton>
3308 stevensc 284
                </div>
285
              }
3303 stevensc 286
            </li>
1 www 287
          </ul>
288
        </div>
289
        {commentsRender}
290
        <div>
291
          <form
292
            className={`form-comment-feed-${feed_unique}`}
293
            data-feed-unique={feed_unique}
294
            onSubmit={handleSubmit(submitCommentHandler)}
295
          >
3504 stevensc 296
            <div className='feedCommentContainer'>
3611 stevensc 297
              <img src={image} alt="User profile image" />
298
              <input
299
                className='commentInput'
300
                type="text"
301
                name="comment"
302
                id={`comment-${feed_unique}`}
303
                maxLength="256"
304
                placeholder="Escribe un comentario"
3666 stevensc 305
                ref={register({ required: "El campo es requerido" })}
1 www 306
              />
3611 stevensc 307
              <button className={`shareIconContainer iconActive`} >
308
                <TbSend className='shareIcon' />
309
              </button>
310
            </div>
311
          </form>
312
          {errors.comment &&
3630 stevensc 313
            <FormErrorFeedback>
314
              {errors.comment.message}
315
            </FormErrorFeedback>
3611 stevensc 316
          }
1 www 317
        </div>
3503 stevensc 318
      </div >
319
    </React.Fragment >
1 www 320
  );
321
};
322
 
1040 stevensc 323
export default React.memo(FeedTemplate);