diff --git a/wax-prosemirror-components/src/components/UndoRedoButton.js b/wax-prosemirror-components/src/components/UndoRedoButton.js new file mode 100644 index 0000000000000000000000000000000000000000..834b053ff3cacc0b0b0cd1ddf8eed7ca5ad88388 --- /dev/null +++ b/wax-prosemirror-components/src/components/UndoRedoButton.js @@ -0,0 +1,51 @@ +/* eslint react/prop-types: 0 */ +import React, { useContext, useMemo } from 'react'; +import { WaxContext } from 'wax-prosemirror-core'; +import MenuButton from '../ui/buttons/MenuButton'; + +const UndoRedoButton = ({ view = {}, item }) => { + const { active, icon, label, run, select, title } = item; + + const { + view: { main }, + activeViewId, + activeView, + } = useContext(WaxContext); + + const isEditable = main.props.editable(editable => { + return editable; + }); + + const { state } = view; + + const handleMouseDown = (e, editorState, editorDispatch) => { + e.preventDefault(); + run(editorState, editorDispatch); + }; + + const isActive = !!( + active(activeView.state, activeViewId) && + select(state, activeViewId, activeView) + ); + + let isDisabled = !select(state, activeViewId, activeView); + if (!isEditable) isDisabled = true; + + const UndoRedoButtonComponent = useMemo( + () => ( + <MenuButton + active={isActive || false} + disabled={isDisabled} + iconName={icon} + label={label} + onMouseDown={e => handleMouseDown(e, main.state, main.dispatch)} + title={title} + /> + ), + [isActive, isDisabled], + ); + + return UndoRedoButtonComponent; +}; + +export default UndoRedoButton;