@portabletext/editor
Version:
Portable Text Editor made in React
78 lines (71 loc) • 1.89 kB
text/typescript
import {isActiveAnnotation} from '../selectors'
import * as selectors from '../selectors'
import {raise} from './behavior.types.action'
import {defineBehavior} from './behavior.types.behavior'
export const abstractAnnotationBehaviors = [
defineBehavior({
on: 'annotation.set',
guard: ({snapshot, event}) => {
const blockKey = event.at[0]._key
const markDefKey = event.at[2]._key
const block = selectors.getFocusTextBlock({
...snapshot,
context: {
...snapshot.context,
selection: {
anchor: {
path: [{_key: blockKey}],
offset: 0,
},
focus: {
path: [{_key: blockKey}],
offset: 0,
},
},
},
})
if (!block) {
return false
}
const updatedMarkDefs = block.node.markDefs?.map((markDef) => {
if (markDef._key === markDefKey) {
return {
...markDef,
...event.props,
}
}
return markDef
})
return {blockKey, updatedMarkDefs}
},
actions: [
(_, {blockKey, updatedMarkDefs}) => [
raise({
type: 'block.set',
at: [{_key: blockKey}],
props: {markDefs: updatedMarkDefs},
}),
],
],
}),
defineBehavior({
on: 'annotation.toggle',
guard: ({snapshot, event}) =>
isActiveAnnotation(event.annotation.name)(snapshot),
actions: [
({event}) => [
raise({type: 'annotation.remove', annotation: event.annotation}),
],
],
}),
defineBehavior({
on: 'annotation.toggle',
guard: ({snapshot, event}) =>
!isActiveAnnotation(event.annotation.name)(snapshot),
actions: [
({event}) => [
raise({type: 'annotation.add', annotation: event.annotation}),
],
],
}),
]