Rev 4008 | Rev 4014 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
/* eslint-disable react/prop-types */
import React, { useEffect, useState } from "react";
import { useDispatch } from "react-redux";
import { shareModalTypes } from "../../../redux/share-modal/shareModal.types";
import { axios } from "../../../utils";
import { feedTypes } from "../../../redux/feed/feed.types";
import { BsHeart, BsHeartFill } from 'react-icons/bs'
import { RiShareForwardLine } from 'react-icons/ri'
import { BiMessage, BiShareAlt } from "react-icons/bi";
import { EmailIcon, EmailShareButton, FacebookIcon, FacebookShareButton, RedditIcon, RedditShareButton, TelegramIcon, TelegramShareButton, TwitterIcon, TwitterShareButton, WhatsappIcon, WhatsappShareButton } from "react-share";
// Redux actions
import { openShareModal } from "../../../redux/share-modal/shareModal.actions";
import { addNotification } from "../../../redux/notification/notification.actions";
import { useRef } from "react";
import FeedModal from "./FeedModal";
import FeedHeader from "./FeedHeader";
import FeedCommentSection from "./feed-comment/FeedCommentSection";
const FeedTemplate = ({ feed, owner_shared, image, children }) => {
// Destructuring feed data
const {
feed_unique,
owner_name,
owner_url,
owner_image,
owner_time_elapse,
owner_file_image,
owner_file_video,
owner_file_document,
feed_likes,
feed_like_url,
feed_unlike_url,
feed_is_liked,
feed_highlighted,
feed_share_url,
feed_delete_url,
comments,
comment_add_url,
feed_share_external_url
} = feed;
const dispatch = useDispatch()
const [totalComments, setTotalComments] = useState(comments.length || 0);
const [feedIsLiked, setFeedIsLiked] = useState(feed_is_liked);
const [sharedState, setSharedState] = useState(owner_shared);
const [likesState, setLikesState] = useState(feed_likes);
const [shareUrl, setShareUrl] = useState('');
const [showComments, setShowComments] = useState(false);
const [shareOptions, setShareOptions] = useState(false)
const [show, setShow] = useState(false);
const shareContainer = useRef(null);
useEffect(() => setSharedState(owner_shared), [owner_shared]);
useEffect(() => {
const handleClickOutside = (event) => {
if (shareContainer.current && !shareContainer.current.contains(event.target)) {
setShareOptions(false)
}
}
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, [shareContainer]);
const getShareUrl = async () => {
try {
const { data: response } = await axios.get(feed_share_external_url)
const { data, success } = response
if (!success) {
dispatch(addNotification({ style: 'danger', msg: data }))
setShareOptions(false)
return false
}
setShareUrl(data)
return Promise.resolve(data)
} catch (error) {
console.log(error)
}
}
const likeHandler = (likeUrl) => {
axios.post(likeUrl)
.then((res) => {
const { success, data } = res.data;
if (!success) {
setFeedIsLiked((previousState) => !previousState);
dispatch(addNotification({
style: "danger",
msg: data,
}));
} else {
setLikesState(data.likes)
setFeedIsLiked(!feedIsLiked);
}
});
};
const displayComments = () => setShowComments(!showComments)
const btnShareHandler = () => dispatch(openShareModal(feed_share_url, shareModalTypes.SHARE, feedTypes.DASHBOARD, feed_unique))
return (
<React.Fragment>
<FeedModal
isShow={show}
handleClose={() => setShow(false)}
feed={feed}
/>
<div className={`postContainer ${feed_highlighted ? 'highlighted' : ''}`}>
<FeedHeader
ownerName={owner_name}
ownerImage={owner_image}
ownerTimeElapse={owner_time_elapse}
ownerUrl={owner_url}
feedDeleteUrl={feed_delete_url}
feedUnique={feed_unique}
/>
<div onClick={() =>
(owner_file_image || owner_file_video || owner_file_document)
&& setShow(true)
}
>
{children}
</div>
<div className="job-status-bar">
<ul className="reactions-list">
<li>
<button
type="button"
id={feedIsLiked ? `btn-unlike-${feed_unique}` : `btn-like-${feed_unique}`}
data-feed-unique={feed_unique}
className={feedIsLiked ? "btn-unlike" : "btn-like"}
onClick={() => likeHandler(feedIsLiked ? feed_unlike_url : feed_like_url)}
>
{feedIsLiked ? <BsHeartFill className="mr-1" /> : <BsHeart className="mr-1" />}
{likesState}
</button>
</li>
<li>
<button
type="button"
id={`btn-comments-${feed_unique}`}
className="btn-indicator"
onClick={displayComments}
>
<BiMessage className="mr-1" />
{totalComments}
</button>
</li>
<li>
<button
type="button"
id={`btn-share-${feed_unique}`}
className="btn-indicator"
onClick={btnShareHandler}
>
<RiShareForwardLine className="mr-1" />
{sharedState}
</button>
</li>
<li className="position-relative">
<button
type="button"
className="btn-indicator"
onClick={() => setShareOptions(!shareOptions)}
>
<BiShareAlt />
</button>
{shareOptions &&
<div className="ext_share" ref={shareContainer}>
<FacebookShareButton beforeOnClick={getShareUrl().then((data) => data)} url={shareUrl}>
<FacebookIcon size={32} round />
</FacebookShareButton>
<TwitterShareButton beforeOnClick={getShareUrl().then((data) => data)} url={shareUrl}>
<TwitterIcon size={32} round />
</TwitterShareButton>
<TelegramShareButton beforeOnClick={getShareUrl().then((data) => data)} url={shareUrl}>
<TelegramIcon size={32} round />
</TelegramShareButton>
<WhatsappShareButton beforeOnClick={getShareUrl().then((data) => data)} url={shareUrl}>
<WhatsappIcon size={32} round />
</WhatsappShareButton>
<RedditShareButton beforeOnClick={getShareUrl().then((data) => data)} url={shareUrl}>
<RedditIcon size={32} round />
</RedditShareButton>
<EmailShareButton beforeOnClick={getShareUrl().then((data) => data)} url={shareUrl}>
<EmailIcon size={32} round />
</EmailShareButton>
</div>
}
</li>
</ul>
</div>
<FeedCommentSection
feedId={feed.feed_unique}
image={image}
addUrl={comment_add_url}
updateTotalComments={(total) => setTotalComments(total)}
comments={comments}
isShow={showComments}
/>
</div >
</React.Fragment >
);
};
export default React.memo(FeedTemplate);