Skip to content
Snippets Groups Projects
NoteComponent.js 1.38 KiB
Newer Older
chris's avatar
chris committed
import React, { useContext, useState, useMemo } from 'react';
import useDeepCompareEffect from 'use-deep-compare-effect';
chris's avatar
chris committed
import { differenceBy } from 'lodash';
chris's avatar
chris committed
import { WaxContext } from 'wax-prosemirror-core';
import { DocumentHelpers } from 'wax-prosemirror-utilities';
import NoteEditor from './NoteEditor';

export default () => {
chris's avatar
chris committed
  const {
chris's avatar
chris committed
    view: { main },
  } = useContext(WaxContext);
chris's avatar
chris committed
  const [notes, setNotes] = useState([]);
chris's avatar
chris committed
  const cleanUpNoteViews = () => {
    if (view) {
chris's avatar
chris committed
      const currentNotes = DocumentHelpers.findChildrenByType(
        main.state.doc,
        main.state.schema.nodes.footnote,
        true,
      );
chris's avatar
chris committed
      if (notes.length > currentNotes.length) {
        // TODO remove from context views that no loger exist
chris's avatar
chris committed
        const difference = differenceBy(notes, currentNotes, 'node.attrs.id');
        difference.forEach((item, i) => {
          // delete view[item.node.attrs.id];
        });
chris's avatar
chris committed
      }
chris's avatar
chris committed
  useDeepCompareEffect(() => {
    setNotes(updateNotes(main));
chris's avatar
chris committed
    // cleanUpNoteViews();
chris's avatar
chris committed
  }, [updateNotes(main)]);

  const noteComponent = useMemo(
    () => <NoteEditor notes={notes} view={main} />,
chris's avatar
chris committed
    [notes],
chris's avatar
chris committed
  return <>{noteComponent}</>;
};
const updateNotes = view => {
  if (view) {
    return DocumentHelpers.findChildrenByType(
      view.state.doc,
      view.state.schema.nodes.footnote,
chris's avatar
chris committed
      true,