Proyectos de Subversion LeadersLinked - SPA

Rev

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

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

import { useAnswerComments } from '@my-coach/hooks';
import { parse } from '@shared/utils';

import {
  Card,
  CardActions,
  CardContent,
  CardHeader,
  CommentForm,
  Menu,
  Button,
  CommentList
} from '@shared/components';
import { useAlertModal } from '@shared/hooks';

export function AnswerCard({
  answer: {
    uuid = '',
    time_elapsed = '',
    user_image = '',
    user_name = '',
    text = '',
    total_comments = 0,
    total_reactions = 0,
    comments = [],
    link_add_comment = ''
  },
  onEdit,
  onDelete,
  onUpdateComments
}) {
  const [showComments, setShowComments] = useState(false);
  const labels = useSelector(({ intl }) => intl.labels);

  const { showAlert, closeAlert } = useAlertModal();

  const {
    comments: answerComments,
    addComment,
    deleteComment
  } = useAnswerComments(comments, {
    onAddComment: (data) => {
      onUpdateComments(uuid, data);
    },
    onDeleteComment: (data) => {
      onUpdateComments(uuid, data);
      closeAlert();
    }
  });

  const handleAddComment = (comment) => {
    addComment(link_add_comment, comment);
  };

  const handleDeleteComment = (url) => {
    showAlert({
      title: 'Eliminar comentario',
      message: '¿Estás seguro de querer eliminar este comentario?',
      onConfirm: () => deleteComment(url)
    });
  };

  /* 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 (
    <Card>
      <CardHeader
        avatar={user_image}
        title={user_name}
        subheader={time_elapsed}
        renderAction={() => (
          <Menu>
            {onDelete && <Menu.Item onClick={onDelete}>Borrar</Menu.Item>}
            {onEdit && <Menu.Item onClick={onEdit}>{labels.edit}</Menu.Item>}
          </Menu>
        )}
      />

      <CardContent>
        <Typography variant='body1'>{parse(text)}</Typography>

        <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
          <Typography variant='overline'>{`${total_reactions} ${labels.reactions}`}</Typography>
          <Typography variant='overline'>{`${total_comments} ${labels.comments}`}</Typography>
        </Box>
      </CardContent>

      <CardActions>
        {/* {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>
        )}
      </CardActions>

      <Box
        sx={{
          padding: 1,
          display: showComments ? 'flex' : 'none',
          flexDirection: 'column',
          gap: 1,
          width: '100%'
        }}
      >
        <CommentForm onSubmit={handleAddComment} />
        <CommentList comments={answerComments} onDelete={handleDeleteComment} />
      </Box>
    </Card>
  );
}