UNPKG

@portabletext/editor

Version:

Portable Text Editor made in React

61 lines (54 loc) 1.4 kB
import {isPortableTextBlock, isPortableTextSpan} from '@portabletext/toolkit' import type {PortableTextBlock} from '@sanity/types' import type {EditorSelection, EditorSelectionPoint} from '../types/editor' export function getEditorSelection( blocks: Array<PortableTextBlock> | undefined, ): EditorSelection { if (!blocks) { throw new Error('No value found') } let anchor: EditorSelectionPoint | undefined let focus: EditorSelectionPoint | undefined const firstBlock = blocks[0] const lastBlock = blocks[blocks.length - 1] if (isPortableTextBlock(firstBlock)) { anchor = { path: [ {_key: firstBlock._key}, 'children', {_key: firstBlock.children[0]._key}, ], offset: 0, } } else { anchor = { path: [{_key: firstBlock._key}], offset: 0, } } const lastChild = isPortableTextBlock(lastBlock) ? lastBlock.children[lastBlock.children.length - 1] : undefined if ( isPortableTextBlock(lastBlock) && lastChild && isPortableTextSpan(lastChild) ) { focus = { path: [{_key: lastBlock._key}, 'children', {_key: lastChild._key}], offset: lastChild.text.length ?? 0, } } else { focus = { path: [{_key: lastBlock._key}], offset: 0, } } if (!anchor || !focus) { throw new Error('No selection found') } return { anchor, focus, } }