Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

import React, { useState } from "react";
import { connect } from "react-redux";
import { useForm } from "react-hook-form";
import FormErrorFeedback from "../../../shared/form-error-feedback/FormErrorFeedback";
import FeedCommentTemplate from "./feed-comment/FeedCommentTemplate";
import { openShareModal as OpenShareModalAction } from "../../../redux/share-modal/shareModal.actions";
import { addNotification } from "../../../redux/notification/notification.actions";
import { deleteFeed } from "../../../redux/feed/feed.actions";
import { shareModalTypes } from "../../../redux/share-modal/shareModal.types";
import parse from "html-react-parser";
import {axios} from "../../../utils";
import ConfirmModal from "../../../shared/confirm-modal/ConfirmModal";
import { Modal } from "react-bootstrap";
import styles from "./feedTemplate.module.scss";
import { feedTypes } from "../../../redux/feed/feed.types";

const FeedTemplate = (props) => {
  // Destructuring feed data
  const {
    feed_unique,
    feed_id_encrypted,
    owner_name,
    owner_url,
    owner_image,
    owner_comments,
    owner_shared,
    owner_time_elapse,
    owner_description,
    owner_file_image,
    owner_file_video,
    owner_file_document,
    owner_file_image_preview,
    shared_name,
    shared_image,
    shared_time_elapse,
    shared_description,
    shared_file_video,
    shared_file_image_preview,
    shared_file_image,
    shared_file_document,
    feed_like_url,
    feed_unlike_url,
    feed_is_liked,
    feed_share_url,
    feed_delete_url,
    comments,
    comment_add_url,
  } = props.feed;

  const [totalComments, setTotalComments] = useState(owner_comments || 0);

  // Destructuring redux
  const { feedType } = props;
  const { deleteFeed, addNotification, openShareModal } = props;

  const [feedIsLiked, setFeedIsLiked] = useState(feed_is_liked);

  // react hook form
  const { register, handleSubmit, errors } = useForm();

  const [commentsState, setCommentsState] = useState(comments);

  const [isReadMoreActive, setIsReadMoreActive] = useState(false);
  const [showConfirmModal, setShowConfirmModal] = useState(false);
  const [show, setShow] = useState(false);

  const handleClose = () => setShow(false);
  const handleShow = () => setShow(true);
  const deleteFeedHandler = () => {
    axios.post(feed_delete_url).then((res) => {
      const data = res.data;
      if (data.success) {
        deleteFeed(feed_unique);
        addNotification({
          style: "success",
          msg: data.data,
        });
      } else {
        addNotification({
          style: "danger",
          msg: data.data,
        });
      }
    });
  };

  const handleShowConfirmModal = () => {
    setShowConfirmModal(!showConfirmModal);
  };

  const handleModalAccept = () => {
    deleteFeedHandler();
  };

  const likeHandler = (event, likeUrl) => {
    event.preventDefault();
    setFeedIsLiked(!feedIsLiked);
    axios.post(likeUrl).then((res) => {
      const resData = res.data;
      const { success, data } = resData;
      if (!success) {
        setFeedIsLiked((previousState) => !previousState);
        addNotification({
          style: "danger",
          msg: data,
        });
      }
    });
  };

  const submitCommentHandler = (data, e) => {
    const currentFormData = new FormData();
    for (let input in data) {
      currentFormData.append(input, data[input]);
    }
    axios.post(comment_add_url, currentFormData).then((res) => {
      const resData = res.data;
      const { data, success, total_comments } = resData;
      if (success) {
        const newComment = data;
        setTotalComments(total_comments);
        setCommentsState([...commentsState, newComment]);
        e.target.reset();
      } else {
        addNotification({
          style: "danger",
          msg: data,
        });
      }
    });
  };

  const deleteCommentHandler = (commentUnique, deleteCommentUrl) => {
    axios
      .post(deleteCommentUrl)
      .then((res) => {
        const { success, data, total_comments } = res.data;
        if (success) {
          const newCommentsState = commentsState.filter(
            (comment) => comment.unique !== commentUnique
          );
          setCommentsState(newCommentsState);
          setTotalComments(total_comments);
        } else {
          addNotification({
            style: "danger",
            msg: data,
          });
        }
      })
      .catch((error) => {
        addNotification({
          style: "danger",
          msg: error.message,
        });
      });
  };

  const btnShareHandler = (event) => {
    event.preventDefault();
    openShareModal(feed_share_url, shareModalTypes.SHARE, feedTypes.DASHBOARD);
  };

  let commentsRender = null;
  if (commentsState.length) {
    commentsRender = (
      <div className={styles.commentSection}>
        <div className={`comment-sec comment-sec-${feed_unique}`}>
          <ul>
            {[...commentsState].reverse().map((commentData) => {
              const { unique } = commentData;
              return (
                <FeedCommentTemplate
                  commentData={commentData}
                  onDeleteHandler={deleteCommentHandler}
                  key={unique}
                />
              );
            })}
          </ul>
        </div>
      </div>
    );
  }

  let likeButton = feedIsLiked ? (
    <a
      href={feed_unlike_url}
      id={`btn-unlike-${feed_unique}`}
      data-feed-unique={feed_unique}
      className="btn-unlike"
      onClick={(event) => {
        likeHandler(event, feed_unlike_url);
      }}
    >
      <i className="fas fa-heart"></i>
      Ya no me gusta
    </a>
  ) : (
    <a
      href={feed_like_url}
      id={`btn-like-${feed_unique}`}
      data-feed-unique={feed_unique}
      className="btn-like"
      onClick={(event) => {
        likeHandler(event, feed_like_url);
      }}
    >
      <i className="far fa-heart"></i>
      Me gusta
    </a>
  );

  const readMoreHandler = (event) => {
    event.preventDefault();
    setIsReadMoreActive(!isReadMoreActive);
  };

  const htmlParsedText = (fullStringText) => {
    const fullText = parse(fullStringText);
    if (fullStringText.length > 500) {
      const shortenedString = fullStringText.substr(0, 500);
      const shortenedText = parse(`${shortenedString}... `);
      return (
        <React.Fragment>
          {isReadMoreActive ? fullText : shortenedText}
          <a
            href="#"
            onClick={(e) => {
              readMoreHandler(e);
            }}
          >
            {isReadMoreActive ? " Leer menos" : " Leer más"}
          </a>
        </React.Fragment>
      );
    } else {
      return fullText;
    }
  };

  let sharedName = null;
  if (shared_name) {
    sharedName = (
      <div className="shared-post-bar">
        <div className="post-bar">
          <div className="post_topbar">
            <div className="usy-dt">
              <img
                src={shared_image}
                alt=""
                style={{
                  width: "50px",
                  height: "auto",
                }}
              />
              <div className="usy-name">
                <h3>{shared_name}</h3>
                <span>
                  <img
                    style={{
                      width: "12px",
                      height: "auto",
                    }}
                    src="/images/clock.png"
                    alt=""
                  />
                  {shared_time_elapse}
                </span>
              </div>
            </div>
          </div>
          <div className="job_descp">
            <div className="show-read-more">
              {htmlParsedText(shared_description)}
            </div>
            {shared_file_image ? (
              <img src={shared_file_image} className="Entradas" />
            ) : null}
            {shared_file_video ? (
              <video
                src={shared_file_video}
                controls
                poster={shared_file_image_preview}
                preload="none"
              />
            ) : null}
            {shared_file_document ? (
              <a href={shared_file_document} target="_blank">
                Descargar
              </a>
            ) : null}
          </div>
        </div>
      </div>
    );
  }
  const OwnerDescription = () => <div className="show-read-more">
    {htmlParsedText(owner_description)}
  </div>
  const TopBar = () => <div className="post_topbar">
    <div className="usy-dt">
      <a href={owner_url}>
        <img
          src={owner_image}
          alt=""
          style={{
            width: "50px",
            height: "auto",
          }}
        />
      </a>
      <div className="usy-name">
        <a href={owner_url}>
          <h3>{owner_name}</h3>
        </a>
        <span>
          <img src="/images/clock.png" alt="" />
          {owner_time_elapse}
          {feed_delete_url ? (
            <a
              href="#"
              className="btn-feed-trash"
              data-link={feed_delete_url}
              data-feed-unique={feed_unique}
              onClick={(e) => {
                e.preventDefault();
                handleShowConfirmModal();
              }}
            >
              <i className="fa fa-trash"></i>
            </a>
          ) : null}
        </span>
      </div>
    </div>
  </div>

  const Content = ({showDescription}) => <div className="job_descp">
    {
      !!showDescription && (
        <OwnerDescription />
      )
    }
    {owner_file_image ? (
      <img src={owner_file_image} className="Entradas" />
    ) : null}
    {owner_file_video ? (
      <video
        src={owner_file_video}
        controls
        poster={owner_file_image_preview}
        preload="none"
      />
    ) : null}
    {owner_file_document ? (
      <a href={owner_file_document} target="_blank">
        Descargar
      </a>
    ) : null}
    {sharedName}
  </div>
  return (
    <React.Fragment>
      <Modal
        show={show}
        onHide={handleClose}
        dialogClassName="modal-md"
      >
        <div
          className="row"
        >
          <div
            className="col-md-8 col-sm-12 col-12"
          >
            <Content
              showDescription
            />
          </div>
          <div
            className="col-md-4 col-sm-12 col-12"
          >
            <TopBar />
            <OwnerDescription />
          </div>
        </div>
      </Modal>
      <div className={styles.postContainer} >
        <TopBar
          showDescription
        />
        <div
          onClick={() => (owner_file_image || owner_file_video || owner_file_document) ? handleShow() : null}
        >
          <Content
            showDescription
          />
        </div>
        <div className="job-status-bar">
          <ul className="like-com">
            <li>{likeButton}</li>
            <li>
              <a
                href="#"
                id={`btn-comments-${feed_unique}`}
                className="btn-indicator"
              >
                <i className="fas fa-comments"></i> {totalComments}
              </a>
            </li>
            <li>
              <a
                href="#"
                id={`btn-share-${feed_unique}`}
                className="btn-indicator"
              >
                <i className="fas fa-share"></i> {owner_shared}
              </a>
            </li>
          </ul>
          <a
            href={feed_share_url}
            data-feed-unique={feed_unique}
            className="btn-feed-share"
            onClick={(e) => {
              btnShareHandler(e);
            }}
          >
            <i className="fas fa-share"></i>Compartir
          </a>
        </div>
        {commentsRender}
        <div>
          <form
            className={`form-comment-feed-${feed_unique}`}
            data-feed-unique={feed_unique}
            onSubmit={handleSubmit(submitCommentHandler)}
          >
            <div className={styles.feedCommentContainer}>
              <input
                className={styles.commentInput}
                type="text"
                name="comment"
                id={`comment-${feed_unique}`}
                maxLength="256"
                placeholder="Escribe un comentario"
                ref={register({
                  required: {
                    value: "true",
                    message: "El campo es requerido",
                  },
                })}
              />
              <button type="submit" className={styles.submitButton}>
                Enviar
              </button>{" "}
              {/* Falta multilenguaje */}
            </div>
          </form>
          {errors.comment && (
            <FormErrorFeedback>{errors.comment.message}</FormErrorFeedback>
          )}
        </div>
      </div>
      <ConfirmModal
        show={showConfirmModal}
        onClose={() => {
          setShowConfirmModal(false);
        }}
        onAccept={handleModalAccept}
        acceptLabel="Aceptar"
      />
    </React.Fragment>
  );
};

const mapStateToProps = (state) => ({
  currentFeed: state.feed.currentFeed,
  isShareModalOpen: state.feed.isShareModalOpen,
  feedType: state.shareModal.feedType,
});

const mapDispatchToProps = {
  deleteFeed: (feedId) => deleteFeed(feedId),
  openShareModal: (postUrl, modalType, feedType) => OpenShareModalAction(postUrl, modalType, feedType),
  addNotification: (notification) => addNotification(notification),
};

export default connect(mapStateToProps, mapDispatchToProps)(FeedTemplate);