Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2185 | Rev 2844 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useEffect, useMemo, useState } from 'react'
import { Link } from 'react-router-dom'
import { useDispatch } from 'react-redux'

import { axios } from '@app/utils'
import { addNotification } from '@app/redux/notification/notification.actions'
import { showReportModal } from '@app/redux/report/report.actions'

import { CommentsContainer, CommentTemplate } from './comments-ui'
import Options from '@app/components/UI/Option'
import ConfirmModal from '@app/components/modals/ConfirmModal'

export default function CommentsList({ comments: defaultComments = [] }) {
  const [comments, setComments] = useState(defaultComments)
  const [currentComment, setCurrentComment] = useState(null)
  const [showConfirm, setShowConfirm] = useState(false)
  const dispatch = useDispatch()

  const handleDelete = (comment) => {
    setCurrentComment(comment)
    setShowConfirm(true)
  }

  const removeComment = () => {
    setComments((prev) =>
      prev.filter((comment) => comment.unique !== currentComment.unique)
    )
  }

  const onCloseConfirm = () => {
    setShowConfirm(false)
    setCurrentComment(null)
  }

  const reportComment = (reportUrl) =>
    dispatch(
      showReportModal({
        reportUrl,
        type: 'Comentario',
        onComplete: () => removeComment()
      })
    )

  const deleteComment = () => {
    axios
      .post(currentComment.link_delete)
      .then((response) => {
        const { success, data } = response.data

        if (!success) {
          throw new Error(
            'Error al eliminar un comentario, por favor intente más tarde'
          )
        }

        dispatch(addNotification({ style: 'success', msg: data }))
        removeComment()
        onCloseConfirm()
      })
      .catch((error) => {
        dispatch(addNotification({ style: 'danger', msg: error.message }))
      })
  }

  useEffect(() => setComments(defaultComments), [defaultComments])

  return (
    <>
      <CommentsContainer>
        {comments.map((comment) => (
          <Comment
            key={comment.unique}
            comment={comment}
            onDelete={handleDelete}
            onReport={reportComment}
          />
        ))}
      </CommentsContainer>
      <ConfirmModal
        show={showConfirm}
        onClose={onCloseConfirm}
        onAccept={deleteComment}
      />
    </>
  )
}

function Comment({ comment, onReport, onDelete }) {
  const {
    user_url,
    user_name,
    time_elapsed,
    comment: content,
    link_delete,
    link_abuse_report
  } = comment

  const actions = useMemo(() => {
    const options = []

    if (link_delete)
      options.push({ label: 'Borrar', action: () => onDelete(comment) })

    if (link_abuse_report)
      options.push({
        label: 'Reportar',
        action: () => onReport(link_abuse_report)
      })

    return options
  }, [link_delete, link_abuse_report])

  return (
    <CommentTemplate>
      <div className='content'>
        <div className='info'>
          <Link to={user_url}>
            <h3>{user_name}</h3>
          </Link>
          <span>{time_elapsed}</span>
        </div>

        <Options options={actions} />

        <p>{content}</p>
      </div>
    </CommentTemplate>
  )
}