Skip to content
Snippets Groups Projects
TitleButton.js 2.01 KiB
Newer Older
chris's avatar
chris committed
/* eslint react/prop-types: 0 */
chris's avatar
chris committed
import React, { useContext, useMemo, useEffect } from 'react';
chris's avatar
chris committed
import { isEmpty } from 'lodash';
import { useTranslation } from 'react-i18next';
chris's avatar
chris committed
import { WaxContext, DocumentHelpers, MenuButton } from 'wax-prosemirror-core';
chris's avatar
chris committed

const TitleButton = ({ view = {}, item }) => {
chris's avatar
chris committed
  const { t, i18n } = useTranslation();
chris's avatar
chris committed
  const { active, icon, label, run, select, title } = item;
chris's avatar
chris committed

  const {
chris's avatar
chris committed
    app,
chris's avatar
chris committed
    pmViews: { main },
chris's avatar
chris committed
    activeViewId,
    activeView,
  } = useContext(WaxContext);

  const { dispatch, state } = view;

chris's avatar
chris committed
  const titleNode = DocumentHelpers.findChildrenByType(
    state.doc,
    state.config.schema.nodes.title,
    true,
  );

chris's avatar
chris committed
  const handleMouseDown = (e, editorState) => {
chris's avatar
chris committed
    e.preventDefault();
    run(editorState, dispatch);
  };

  const serviceConfig = app.config.get('config.TitleService');

chris's avatar
chris committed
  let chapterTitle = '';
  if (titleNode[0]) chapterTitle = titleNode[0].node.textContent;

chris's avatar
chris committed
  useEffect(() => {
chris's avatar
chris committed
    if (serviceConfig) {
      if (titleNode[0]) {
chris's avatar
chris committed
        serviceConfig.updateTitle(titleNode[0].node.textContent);
chris's avatar
chris committed
      } else {
        serviceConfig.updateTitle('');
      }
chris's avatar
chris committed
    }
chris's avatar
chris committed
  }, [chapterTitle]);
chris's avatar
chris committed

chris's avatar
chris committed
  const isActive = !!active(state, activeViewId);
chris's avatar
chris committed
  let isDisabled = !select(state, activeViewId, activeView);

  const isEditable = main.props.editable(editable => {
    return editable;
  });
  if (!isEditable) isDisabled = true;
chris's avatar
chris committed

  const TitleButtonComponent = useMemo(
    () => (
      <MenuButton
        active={isActive || false}
        disabled={isDisabled}
        iconName={icon}
chris's avatar
chris committed
        label={
          !isEmpty(i18n) && i18n.exists(`Wax.BlockLevel.${label}`)
            ? t(`Wax.BlockLevel.${label}`)
            : label
        }
chris's avatar
chris committed
        onMouseDown={e => handleMouseDown(e, view.state, view.dispatch)}
chris's avatar
chris committed
        title={
          !isEmpty(i18n) && i18n.exists(`Wax.BlockLevel.${title}`)
            ? t(`Wax.BlockLevel.${title}`)
            : title
        }
chris's avatar
chris committed
      />
    ),
    [isActive, isDisabled],
  );

  return TitleButtonComponent;
};

export default TitleButton;