Skip to content
Snippets Groups Projects
Editoria.js 2.22 KiB
Newer Older
chris's avatar
chris committed
import React, { useLayoutEffect, useState, useMemo } from 'react';
import { createGlobalStyle } from 'styled-components';
chris's avatar
chris committed

import { Wax } from 'wax-prosemirror-core';
chris's avatar
chris committed

import { EditoriaLayout, EditoriaMobileLayout } from './layout';
chris's avatar
chris committed
import { config, configMobile } from './config';
chris's avatar
chris committed
import { demo } from './demo';
chris's avatar
chris committed

chris's avatar
chris committed
const GlobalStyle = createGlobalStyle`
  body {
    margin: 0;
    padding: 0;
chris's avatar
chris committed
    overflow-y: hidden;
chris's avatar
chris committed
  #root {
    height:100vh;
    width:100vw;
  }
chris's avatar
chris committed
`;

chris's avatar
chris committed
const renderImage = file => {
  const reader = new FileReader();
  return new Promise((accept, fail) => {
    reader.onload = () => accept(reader.result);
    reader.onerror = () => fail(reader.error);
    // Some extra delay to make the asynchronicity visible
    setTimeout(() => reader.readAsDataURL(file), 150);
  });
};

chris's avatar
chris committed
const user = {
  userId: 'b3cfc28e-0f2e-45b5-b505-e66783d4f946',
  userColor: {
    addition: 'royalblue',
    deletion: 'indianred',
  },
  username: 'admin',
chris's avatar
chris committed
};
const Editoria = () => {
chris's avatar
chris committed
  const [width] = useWindowSize();
chris's avatar
chris committed

  let layout = EditoriaLayout;
chris's avatar
chris committed
  let finalConfig = config;
  let key = 'editoria';
  if (width < 600) {
chris's avatar
chris committed
    layout = EditoriaMobileLayout;
chris's avatar
chris committed
    finalConfig = configMobile;
    key = 'editoriaMobile';
chris's avatar
chris committed
  const EditoriaComponent = useMemo(
chris's avatar
chris committed
    () => (
      <>
        <GlobalStyle />
        <Wax
chris's avatar
chris committed
          key={key}
          config={finalConfig}
          autoFocus
          placeholder="Type Something..."
          fileUpload={file => renderImage(file)}
chris's avatar
chris committed
          value={
            '<p>hello</p><p class="custom-tag-label-3" data-type="block">Lorem ipsum dolor si</p>'
          }
          // value={demo}
chris's avatar
chris committed
          layout={layout}
chris's avatar
chris committed
          // onChange={source => console.log(source)}
          user={user}
        />
      </>
chris's avatar
chris committed
    ),
chris's avatar
chris committed
    [layout, finalConfig],
chris's avatar
chris committed
  );
chris's avatar
chris committed
  return <>{EditoriaComponent}</>;
chris's avatar
chris committed

function useWindowSize() {
chris's avatar
chris committed
  const [size, setSize] = useState([window.innerWidth, window.innerHeight]);
  useLayoutEffect(() => {
    function updateSize() {
      setSize([window.innerWidth, window.innerHeight]);
    }
    window.addEventListener('resize', updateSize);
    updateSize();
    return () => window.removeEventListener('resize', updateSize);
  }, []);
  return size;
chris's avatar
chris committed
export default Editoria;