Skip to content
Snippets Groups Projects
CommentComponent.js 1.5 KiB
Newer Older
chris's avatar
chris committed
import React, {
  useContext,
  useState,
  useEffect,
  useMemo,
  Fragment
} from "react";
import styled from "styled-components";
import { groupBy } from "lodash";
chris's avatar
chris committed
import { WaxContext } from "wax-prosemirror-core/src/ioc-react";
import { DocumentHelpers } from "wax-prosemirror-utilities";
chris's avatar
chris committed
import CommentsBoxList from "./CommentsBoxList";
export default ({ area }) => {
chris's avatar
chris committed
  const { view: { main }, activeView } = useContext(WaxContext);
chris's avatar
chris committed
  const [comments, setComments] = useState([]);
  useEffect(
    () => {
chris's avatar
chris committed
      setComments(updateComments(main));
chris's avatar
chris committed
    [JSON.stringify(updateComments(main))]
chris's avatar
chris committed
  );

  const CommentComponent = useMemo(
chris's avatar
chris committed
    () => (
      <CommentsBoxList
        comments={comments[area] || []}
        area={area}
        view={main}
      />
    ),
    [comments[area] || []]
chris's avatar
chris committed
  );
  return <Fragment>{CommentComponent}</Fragment>;
chris's avatar
chris committed
const updateComments = view => {
chris's avatar
chris committed
  if (view) {
    const nodes = DocumentHelpers.findChildrenByMark(
      view.state.doc,
      view.state.schema.marks.comment,
      true
    );

    const allComments = nodes.map(node => {
      return node.node.marks.filter(comment => {
        return comment.type.name === "comment";
      });
    });

    const groupedComments = {};
    allComments.forEach(comment => {
      if (!groupedComments[comment[0].attrs.group]) {
        groupedComments[comment[0].attrs.group] = [comment[0]];
      } else {
        groupedComments[comment[0].attrs.group].push(comment[0]);
      }
    });

    return groupedComments;
chris's avatar
chris committed
  }
  return [];
};