import type { Node as PMNode } from '@tiptap/pm/model' import type { Editor } from '@tiptap/react' import { findNodeAtPosition } from '@admin/utils/editor/find-node-at-position' import { isValidPosition } from '@admin/utils/editor/is-valid-position' export function findNodePosition(props: { editor: Editor | null node?: PMNode | null nodePos?: number | null }): { pos: number; node: PMNode } | null { const { editor, node, nodePos } = props if (!editor || !editor.state?.doc) return null const hasValidNode = node !== undefined && node !== null const hasValidPos = isValidPosition(nodePos) if (!hasValidNode && !hasValidPos) { return null } if (hasValidNode) { let foundPos = -1 let foundNode: PMNode | null = null editor.state.doc.descendants((currentNode, pos) => { if (currentNode === node) { foundPos = pos foundNode = currentNode return false } return true }) if (foundPos !== -1 && foundNode !== null) { return { pos: foundPos, node: foundNode } } } if (isValidPosition(nodePos)) { const nodeAtPos = findNodeAtPosition(editor, nodePos) if (nodeAtPos) { return { pos: nodePos, node: nodeAtPos } } } return null }