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

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

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

  const { state } = view;

chris's avatar
chris committed
  const [isSaving, setIsSaving] = useState(false);

chris's avatar
chris committed
  const handleMouseDown = () => {
    // view.props.onChange(state.doc.content);
chris's avatar
chris committed
    setIsSaving(true);
    setTimeout(() => {
      setIsSaving(false);
    }, 300);
chris's avatar
chris committed
  };

chris's avatar
chris committed
  const triggerSave = e => {
    if ((e.key === 83 || e.keyCode === 83) && (e.metaKey || e.ctrlKey)) {
      e.preventDefault();
      handleMouseDown();
      return false;
    }
    return true;
  };

  useEffect(() => {
    document.addEventListener('keydown', triggerSave);

    return () => document.removeEventListener('keydown', triggerSave);
  }, []);

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 iconTodisplay = !isSaving ? icon : 'done';

chris's avatar
chris committed
  const SaveButtonComponent = useMemo(
    () => (
      <MenuButton
chris's avatar
chris committed
        active={false}
chris's avatar
chris committed
        disabled={isDisabled}
chris's avatar
chris committed
        iconName={iconTodisplay}
chris's avatar
chris committed
        label={label}
chris's avatar
chris committed
        onMouseDown={handleMouseDown}
        title={
          !isEmpty(i18n) && i18n.exists(`Wax.Base.${title}`)
            ? t(`Wax.Base.${title}`)
            : title
        }
chris's avatar
chris committed
      />
    ),
chris's avatar
chris committed
    [isSaving, isDisabled, t(`Wax.Base.${title}`)],
chris's avatar
chris committed
  );

  return SaveButtonComponent;
};

export default SaveButton;