Rev 5115 | Rev 5578 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
/* eslint-disable camelcase *//* eslint-disable react/prop-types */import React, { useEffect, useRef, useState } from 'react'import { axios } from '../../../../utils'import { useForm } from 'react-hook-form'import { connect } from 'react-redux'import { addNotification } from '../../../../redux/notification/notification.actions'import ConfirmModal from '../../../../shared/confirm-modal/ConfirmModal'import FormErrorFeedback from '../../../../shared/form-error-feedback/FormErrorFeedback'const FeedCommentSection = ({isShow = true,image = '',addUrl = '',updateTotalComments = function () { },comments = []}) => {const { register, handleSubmit, errors, reset } = useForm()const [commentsState, setCommentsState] = useState(comments)useEffect(() => {setCommentsState(comments)}, [comments])const submitCommentHandler = (data) => {const currentFormData = new FormData()Object.entries(data).forEach(([key, value]) => currentFormData.append(key, value))axios.post(addUrl, currentFormData).then(({ data: response }) => {const { data: newComment, success, total_comments } = responseif (!success) {return addNotification({ style: 'danger', msg: newComment })}updateTotalComments(total_comments)setCommentsState([newComment, ...commentsState])reset()})}return (<div className={`comments-container ${isShow ? 'show' : 'hidden'}`}><formclassName='feedCommentContainer'onSubmit={handleSubmit(submitCommentHandler)}>{image && <img src={image} alt="User profile image" />}<inputclassName='commentInput'type="text"name="comment"maxLength="256"placeholder={LABELS.WRITE_A_COMMENT}ref={register({ required: 'El campo es requerido' })}/><button className='shareIconContainer iconActive' ><img src='/images/icons/send.png' className='fa img-icon' /></button></form>{errors.comment && <FormErrorFeedback>{errors.comment.message}</FormErrorFeedback>}<FeedCommentSection.CommentsListcomments={commentsState}updateTotalComments={updateTotalComments}setComments={setCommentsState}/></div>)}const CommentsList = ({ comments, updateTotalComments, setComments }) => {const deleteCommentHandler = (commentUnique, deleteCommentUrl) => {axios.post(deleteCommentUrl).then(({ data: response }) => {const { success, data, total_comments } = responseif (!success) {return addNotification({ style: 'danger', msg: data })}updateTotalComments(total_comments)setComments(prevComments => prevComments.filter((comment) => comment.unique !== commentUnique))addNotification({ style: 'success', msg: data })}).catch((error) => addNotification({ style: 'danger', msg: error.message }))}return (<ul className='comment-list'>{comments.reverse().map((comment) => {return (<FeedCommentSection.CommentTemplatecommentData={comment}onDeleteHandler={deleteCommentHandler}key={comment.unique}/>)})}</ul>)}const CommentTemplate = ({ onDeleteHandler, commentData }) => {const {user_name,user_url,user_image,link_delete,time_elapsed,comment,unique} = commentDataconst [showConfirmModal, setShowConfirmModal] = useState(false)const [displayOption, setDisplayOption] = useState(false)const deleteButton = useRef()const handleShowConfirmModal = () => setShowConfirmModal(!showConfirmModal)const handleModalAccept = () => onDeleteHandler(unique, link_delete)useEffect(() => {const handleClickOutside = (event) => {if (deleteButton.current && !deleteButton.current.contains(event.target)) {setDisplayOption(false)}}document.addEventListener('mousedown', handleClickOutside)return () => {document.removeEventListener('mousedown', handleClickOutside)}}, [deleteButton])return (<li><div className="comment-container">{user_image &&<imgsrc={user_image}alt="user-image"className='user-image'/>}<div className='comment-content'><div className='info'><a href={user_url}><h3>{user_name}</h3></a><span>{time_elapsed}{link_delete &&<><imgsrc='/images/icons/options.png'className='cursor-pointer img-icon options-sm'onClick={() => setDisplayOption(!displayOption)}/><div className={`comments-options ${displayOption ? 'active' : ''}`}><ul><li><buttonclassName="option-btn"onClick={handleShowConfirmModal}ref={deleteButton}><i className="fa fa-trash-o mr-1" />{LABELS.DELETE}</button></li></ul></div></>}</span></div><p>{comment}</p></div></div><ConfirmModalshow={showConfirmModal}onClose={() => setShowConfirmModal(false)}onAccept={handleModalAccept}acceptLabel={LABELS.ACCEPT}/></li>)}FeedCommentSection.CommentsList = CommentsListFeedCommentSection.CommentTemplate = CommentTemplateconst mapDispatchToProps = {addNotification: (notification) => addNotification(notification)}export default connect(null, mapDispatchToProps)(FeedCommentSection)