Files
outline/shared/editor/commands/toggleMark.ts

36 lines
1.1 KiB
TypeScript

import { toggleMark as pmToggleMark } from "prosemirror-commands";
import { MarkType } from "prosemirror-model";
import { Command } from "prosemirror-state";
import { Primitive } from "utility-types";
import { chainTransactions } from "../lib/chainTransactions";
import { isMarkActive } from "../queries/isMarkActive";
/**
* Toggles a mark on the current selection, if the mark is already with
* matching attributes it will remove the mark instead, if the mark is active
* but with different attributes it will update the mark with the new attributes.
*
* @param type - The mark type to toggle.
* @param attrs - The attributes to apply to the mark.
* @returns A prosemirror command.
*/
export function toggleMark(
type: MarkType,
attrs: Record<string, Primitive> | undefined
): Command {
return (state, dispatch) => {
if (isMarkActive(type, attrs)(state)) {
return pmToggleMark(type)(state, dispatch);
}
if (isMarkActive(type)(state)) {
return chainTransactions(pmToggleMark(type), pmToggleMark(type, attrs))(
state,
dispatch
);
}
return pmToggleMark(type, attrs)(state, dispatch);
};
}