import { $getListDepth, $isListItemNode, $isListNode } from '@lexical/list';
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
import { $getSelection, $isElementNode, $isRangeSelection, COMMAND_PRIORITY_CRITICAL, INDENT_CONTENT_COMMAND, } from 'lexical';
import { useEffect } from 'react';
function getElementNodesInSelection(selection) {
    const nodesInSelection = selection.getNodes();
    if (nodesInSelection.length === 0) {
        return new Set([selection.anchor.getNode().getParentOrThrow(), selection.focus.getNode().getParentOrThrow()]);
    }
    return new Set(nodesInSelection.map((n) => ($isElementNode(n) ? n : n.getParentOrThrow())));
}
function isIndentPermitted(maxDepth) {
    const selection = $getSelection();
    if (!$isRangeSelection(selection)) {
        return false;
    }
    const elementNodesInSelection = getElementNodesInSelection(selection);
    let totalDepth = 0;
    elementNodesInSelection.forEach((elementNode) => {
        if ($isListNode(elementNode)) {
            totalDepth = Math.max($getListDepth(elementNode) + 1, totalDepth);
        }
        else if ($isListItemNode(elementNode)) {
            const parent = elementNode.getParent();
            if (!$isListNode(parent)) {
                throw new Error('ListMaxIndentLevelPlugin: A ListItemNode must have a ListNode for a parent.');
            }
            totalDepth = Math.max($getListDepth(parent) + 1, totalDepth);
        }
    });
    return totalDepth <= maxDepth;
}
export default function ListMaxIndentLevelPlugin({ maxDepth }) {
    const [editor] = useLexicalComposerContext();
    useEffect(() => editor.registerCommand(INDENT_CONTENT_COMMAND, () => !isIndentPermitted(maxDepth !== null && maxDepth !== void 0 ? maxDepth : 7), COMMAND_PRIORITY_CRITICAL), [editor, maxDepth]);
    return null;
}
//# sourceMappingURL=index.js.map