Skip to content
Snippets Groups Projects
ConnectedComment.js 2.25 KiB
Newer Older
chris's avatar
chris committed
/* eslint react/prop-types: 0 */
import React, { useState, useEffect, useContext, memo } from 'react';
import styled from 'styled-components';
import { DocumentHelpers } from 'wax-prosemirror-utilities';
import { WaxContext } from 'wax-prosemirror-core';
import CommentBox from '../../ui/comments/CommentBox';

const ConnectedCommentStyled = styled.div`
  position: absolute;
`;

chris's avatar
chris committed
export default ({ key, comment, dataBox, top, commentId, commentData }) => {
chris's avatar
chris committed
  const [commentAnnotation, setCommentAnnotation] = useState(comment);

chris's avatar
chris committed
  const MemorizedComponent = memo(() => {
chris's avatar
chris committed
    const {
      view,
      view: {
        main: {
          props: { user },
        },
      },
      app,
      activeView,
    } = useContext(WaxContext);
chris's avatar
chris committed
    const { state, dispatch } = activeView;

    const allCommentsWithSameId = DocumentHelpers.findAllMarksWithSameId(
      state,
      comment,
    );
    const commentMark = state.schema.marks.comment;

chris's avatar
chris committed
    let active = false;

    const styles = {
      top: `${top}px`,
    };

chris's avatar
chris committed
    const commentPlugin = app.PmPlugins.get('commentPlugin');
    const activeComment = commentPlugin.getState(activeView.state).comment;

    if (activeComment && commentId === activeComment.attrs.id) active = true;
chris's avatar
chris committed

    const onClickPost = content => {
      const { tr } = state;

      const obj = {
        content,
        displayName: user.username,
        timestamp: Math.floor(Date.now() / 300000),
      };

      commentAnnotation.attrs.conversation.push(obj);

      allCommentsWithSameId.forEach(singleComment => {
        dispatch(
          tr.addMark(
            singleComment.pos,
            singleComment.pos + singleComment.nodeSize,
            commentMark.create({
              ...((commentAnnotation && commentAnnotation.attrs) || {}),
              conversation: commentAnnotation.attrs.conversation,
            }),
          ),
        );
      });
    };

chris's avatar
chris committed
    return (
      <ConnectedCommentStyled data-box={commentId} style={styles}>
        <CommentBox
          key={commentId}
          active={active}
          dataBox={commentId}
          top={top}
          commentId={commentId}
          commentData={commentData}
chris's avatar
chris committed
          onClickPost={onClickPost}
        />
      </ConnectedCommentStyled>
chris's avatar
chris committed
    );
  });
  return <MemorizedComponent />;
};