@portabletext/editor
Version:
Portable Text Editor made in React
57 lines (51 loc) • 1.35 kB
text/typescript
import {isSpan, isTextBlock} from '@portabletext/schema'
import type {EditorContext} from '../editor/editor-snapshot'
import type {EditorSelection, EditorSelectionPoint} from '../types/editor'
export function getEditorSelection(
context: Pick<EditorContext, 'schema' | 'value'>,
): EditorSelection {
let anchor: EditorSelectionPoint | undefined
let focus: EditorSelectionPoint | undefined
const firstBlock = context.value[0]
const lastBlock = context.value[context.value.length - 1]
if (isTextBlock(context, firstBlock)) {
anchor = {
path: [
{_key: firstBlock._key},
'children',
{_key: firstBlock.children[0]._key},
],
offset: 0,
}
} else {
anchor = {
path: [{_key: firstBlock._key}],
offset: 0,
}
}
const lastChild = isTextBlock(context, lastBlock)
? lastBlock.children[lastBlock.children.length - 1]
: undefined
if (
isTextBlock(context, lastBlock) &&
lastChild &&
isSpan(context, 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,
}
}