Skip to content
Snippets Groups Projects
TrackChangeBox.js 1.8 KiB
Newer Older
chris's avatar
chris committed
import { Mark } from "prosemirror-model";
chris's avatar
chris committed
import React, { Fragment, useState, useEffect, useContext } from "react";
import { Transition } from "react-transition-group";
import styled from "styled-components";
import { WaxContext } from "wax-prosemirror-core";

chris's avatar
chris committed
const TrackChangeBoxStyled = styled.div`
chris's avatar
chris committed
  display: flex;
  flex-direction: column;
  margin-top: 10px;
chris's avatar
chris committed
  border: 1px solid blue;
chris's avatar
chris committed
  position: absolute;
  transition: ${({ state }) => "top 1s, opacity 1.5s, left 1s"};
  top: ${props => (props.top ? `${props.top}px` : 0)};
  left: ${props => (props.active ? `${63}%` : `${65}%`)};
  opacity: ${({ state }) => {
    switch (state) {
      case "exited":
        return 0.2;
      case "exiting":
        return 0.4;
      case "entering":
        return 0.6;
      case "entered":
        return 1;
    }
  }};
`;

chris's avatar
chris committed
export default ({ trackChange, view, top, dataBox }) => {
chris's avatar
chris committed
  const [animate, setAnimate] = useState(false);
  const { view: { main }, app, activeView } = useContext(WaxContext);
chris's avatar
chris committed
  let action;
  if (trackChange instanceof Mark) {
    if ((trackChange.type.name = "format_change")) {
      const { attrs: { username, before, after } } = trackChange;
      action = `User ${username} added ${after[0]}`;
    }
  } else {
    action = `User demo changed paragraph to heading 1`;
  }
chris's avatar
chris committed

  let active = false;
  useEffect(() => {
    setAnimate(true);
  }, []);

  return (
    <Fragment>
      <Transition in={animate} timeout={1000}>
        {state => (
chris's avatar
chris committed
          <TrackChangeBoxStyled
chris's avatar
chris committed
            top={top}
            state={state}
            data-box={dataBox}
            active={active}
chris's avatar
chris committed
          >
chris's avatar
chris committed
            <div>
              {action}
              <button>Accept</button>
              <button>Reject</button>
            </div>
chris's avatar
chris committed
          </TrackChangeBoxStyled>
chris's avatar
chris committed
        )}
      </Transition>
    </Fragment>
  );
};