Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3694 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { Box, Typography } from '@mui/material';
import ChatOutlined from '@mui/icons-material/ChatOutlined';

import { axios } from '@utils';
// import { withReactions } from '@hocs';
import { addNotification } from '@store/notification/notification.actions';

import Widget from '@components/UI/Widget';
import Button from '@components/UI/buttons/Buttons';
import CommentForm from '@components/dashboard/linkedin/comments/comment-form';
import CommentsList from '@components/dashboard/linkedin/comments/comment-list';
import FeedDescription from '@components/dashboard/feed/feed-description';
import Options from '@components/UI/Option';

const AnswerCard = ({
  time_elapsed = '',
  user_image = '',
  // user_url = '',
  user_name = '',
  text = '',
  // reaction = '',
  total_comments = 0,
  total_reactions = 0,
  comments: defaultComments = [],
  link_edit = '',
  link_delete = '',
  // link_reaction_delete = '',
  // link_save_reaction = '',
  link_add_comment = '',
  onEdit = () => {},
  onDelete = () => {},
  updateComments = () => {}
  // updateReactions = () => {}
}) => {
  const [comments, setComments] = useState(defaultComments);
  const [totalComments, setTotalComments] = useState(total_comments);
  const [totalReactions] = useState(total_reactions);
  const [showComments, setShowComments] = useState(false);
  const labels = useSelector(({ intl }) => intl.labels);
  const dispatch = useDispatch();

  const addComment = (comment) => {
    const formData = new FormData();
    formData.append('comment', comment);

    axios
      .post(link_add_comment, formData)
      .then((response) => {
        const { success, data } = response.data;

        if (!success) {
          const errorMessage =
            typeof data === 'string' ? data : 'Error interno. Intente más tarde.';
          dispatch(addNotification({ style: 'danger', msg: errorMessage }));
          return;
        }

        setComments([...comments, data.item]);
        updateComments(data.total_comments_question);
        setTotalComments(data.total_comments_answer);
      })
      .catch((err) => {
        dispatch(addNotification({ style: 'danger', msg: err.message }));
      });
  };

  const deleteComment = (commentUnique, deleteCommentUrl) => {
    axios
      .post(deleteCommentUrl)
      .then((response) => {
        const { success, data } = response.data;

        if (!success) {
          const errorMessage =
            typeof data === 'string' ? data : 'Error interno. Intente más tarde.';

          dispatch(addNotification({ style: 'danger', msg: errorMessage }));
          return;
        }

        const newComments = comments.filter(({ unique }) => unique !== commentUnique);

        dispatch(addNotification({ style: 'success', msg: data.message }));

        setComments(newComments);
        updateComments(data.total_comments_question);
        setTotalComments(data.total_comments_answer);
      })
      .catch((err) => {
        dispatch(addNotification({ style: 'danger', msg: err.message }));
      });
  };

  // const ReactionsButton = withReactions(Button);

  return (
    <>
      <Widget>
        <Widget.Header
          avatar={user_image}
          title={user_name}
          subheader={time_elapsed}
          renderAction={() => (
            <Options>
              {link_delete && (
                <Options.Item onClick={() => onDelete(link_delete)}>Borrar</Options.Item>
              )}
              {link_edit && (
                <Options.Item onClick={() => onEdit(link_edit, text)}>{labels.edit}</Options.Item>
              )}
            </Options>
          )}
        />

        <Widget.Body>
          <FeedDescription description={text} />

          <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
            <Typography variant='overline'>{`${totalReactions} ${labels.reactions}`}</Typography>
            <Typography variant='overline'>{`${totalComments} ${labels.comments}`}</Typography>
          </Box>
        </Widget.Body>

        <Widget.Actions>
          {/* {link_save_reaction && (
            <ReactionsButton
              currentReactionType={reaction}
              saveUrl={link_save_reaction}
              deleteUrl={link_reaction_delete}
              onReaction={({
                total_reactions_answer,
                total_reactions_question
              }) => {
                setTotalReactions(total_reactions_answer)
                updateReactions(total_reactions_question)
              }}
            />
          )} */}
          {link_add_comment && (
            <Button onClick={() => setShowComments(!showComments)}>
              <ChatOutlined />
              {labels.comment}
            </Button>
          )}
        </Widget.Actions>

        <Box sx={{ padding: 0.5, display: showComments ? 'block' : 'none' }}>
          <CommentForm onSubmit={addComment} />
          <CommentsList comments={comments} onDelete={deleteComment} />
        </Box>
      </Widget>
    </>
  );
};

export default AnswerCard;