Rev 6018 | Rev 7113 | 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 parse from 'html-react-parser'import { axios } from '../../utils'import { useDispatch } from 'react-redux'import { setIntlLabels } from '../../redux/intl/intl.action'import withReactions from '../components/feed/withReaction'import { addNotification } from '../../redux/notification/notification.actions'import HomeNews from '../components/home-section/HomeNews'import InputOption from '../templates/linkedin/Feed/InputOption'import withExternalShare from '../templates/linkedin/Feed/withExternalShare'import FeedCommentSection from '../components/feed/feed-comment/FeedCommentSection'import ChatOutlinedIcon from '@mui/icons-material/ChatOutlined'import SendOutlinedIcon from '@mui/icons-material/SendOutlined'import AccessTimeIcon from '@mui/icons-material/AccessTime'import RecommendIcon from '@mui/icons-material/Recommend'import FavoriteIcon from '@mui/icons-material/FavoriteTwoTone'import VolunteerActivismIcon from '@mui/icons-material/VolunteerActivism'import EmojiEmotionsIcon from '@mui/icons-material/EmojiEmotions'import TungstenIcon from '@mui/icons-material/Tungsten'import '../templates/linkedin/Feed/Feed.scss'export default function PostView({ post, labels }) {const [externalShare, setExternalShare] = useState(post.total_share_external)const [ownerReactions, setOwnerReaction] = useState(post.reactions)const [currentReaction, setCurrentReaction] = useState(post.my_reaction)const [totalReactions, setTotalReactions] = useState(0)const [comments, setComments] = useState([])const [isReadMoreActive, setIsReadMoreActive] = useState(false)const [showComments, setShowComments] = useState(false)const dispatch = useDispatch()const reactionsOptions = [{type: 'r',icon: <RecommendIcon style={{ color: '#7405f9' }} />,},{type: 's',icon: <VolunteerActivismIcon style={{ color: '#6495ED' }} />,},{type: 'l',icon: <FavoriteIcon style={{ color: '#DF704D' }} />,},{type: 'i',icon: (<TungstenIconstyle={{ color: '#F5BB5C', transform: 'rotate(180deg)' }}/>),},{type: 'f',icon: <EmojiEmotionsIcon style={{ color: '#FF7F50' }} />,},]const readMoreHandler = () => setIsReadMoreActive(!isReadMoreActive)const displayCommentSection = () => {setShowComments(!showComments)}const getComments = async () => {await axios.get(post.comments_url).then(({ data: response }) => {if (!response.success) {addNotification({ style: 'danger', msg: response.data })return}setComments(response.data)})}const handleExternalShare = (value) => setExternalShare(value)const ExternalShareButton = withExternalShare(InputOption,post.share_external_url,{Icon: SendOutlinedIcon,color: 'gray',title: 'Enviar',shareUrl: post.share_increment_external_counter_url,setValue: handleExternalShare,withTitle: true,})const htmlParsedText = (fullStringText) => {const fullText = parse(fullStringText)if (fullStringText.length > 500) {const shortenedString = fullStringText.substr(0, 500)const shortenedText = parse(`${shortenedString}... `)return (<>{isReadMoreActive ? fullText : shortenedText}<span className="cursor-pointer" onClick={readMoreHandler}>{isReadMoreActive ? ' Leer menos' : ' Leer más'}</span></>)}return <p>{fullText}</p>}const saveReaction = (type) => {const reactionTypesUrl = {r: post.save_reaction_recommended_url,s: post.save_reaction_support_url,l: post.save_reaction_love_url,i: post.save_reaction_interest_url,f: post.save_reaction_fun_url,}axios.post(reactionTypesUrl[type]).then((res) => {const { success, data } = res.dataif (!success) {dispatch(addNotification({ style: 'danger', msg: data }))}setOwnerReaction(data.reactions)setCurrentReaction(type)})}const deleteReaction = () => {axios.post(post.delete_reaction_url).then((res) => {const { success, data } = res.dataif (!success) {dispatch(addNotification({ style: 'danger', msg: data }))return}setOwnerReaction(data.reactions)setCurrentReaction('')})}const WithReactionIcon = withReactions(InputOption, {onSelect: saveReaction,onDelete: deleteReaction,myReaction: currentReaction,withTitle: true,})useEffect(() => {dispatch(setIntlLabels(labels))}, [])useEffect(() => {if (showComments && !comments.length) getComments()}, [showComments])useEffect(() => {const feedReactions = ownerReactions.reduce((acc, reaction) => acc + Number(reaction.total),0)setTotalReactions(feedReactions)}, [ownerReactions])return (<div className="container"><div className="d-flex flex-column flex-md-row" style={{ gap: '1rem' }}><div className="col-12 col-md-8 p-0"><div className="feed"><div className="feed__body">{post.image && (<imgsrc={`/storage/type/post/code/${post.uuid}/filename/${post.image}`}className="Entradas"loading="lazy"/>)}</div><div className="feed__body"><div className="feed__header"><div className="feed__info"><h2>{post.title}</h2><div className="time__elapse"><p>{post.addedOn}</p><AccessTimeIcon className="time__elapse-icon" /></div></div></div>{post.description && htmlParsedText(post.description)}</div><div className="d-flex justify-content-between align-items-center px-3"><div className="reactions-counter">{reactionsOptions.filter((option) =>ownerReactions.find((reaction) => reaction.reaction === option.type)).map((reaction) => reaction.icon)}<span>{totalReactions} reacciones</span></div>{externalShare && (<span>{`${externalShare} ${labels.SENDS?.toLowerCase()}`}</span>)}</div><div className="feed__buttons"><WithReactionIcon /><InputOptionIcon={ChatOutlinedIcon}title={labels.COMMENTS}color="gray"onClick={displayCommentSection}withTitle/><ExternalShareButton /></div><div className="px-2 pb-2"><FeedCommentSectionisShow={showComments}currentComments={comments}addUrl={post.comments_add_url}/></div></div></div><div className="col-12 col-md-4 p-0"><HomeNews currentPost={post.uuid} /></div></div></div>)}