Skip to content

Commit 6cc09af

Browse files
committed
feat(json-crdt-peritext-ui): 🎸 pass surrounding caret inlines to the renderers
1 parent 617e2ea commit 6cc09af

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

‎src/json-crdt-peritext-ui/web/react/BlockView.tsx‎

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import * as React from 'react';
2+
import {createElement as h} from 'react';
23
import {LeafBlock} from '../../../json-crdt-extensions/peritext/block/LeafBlock';
34
import {InlineView} from './InlineView';
45
import {Char} from '../constants';
56
import {usePeritext} from './context';
67
import {CommonSliceType} from '../../../json-crdt-extensions';
78
import {CaretView} from './cursor/CaretView';
89
import {FocusView} from './cursor/FocusView';
9-
import {InlineAttrEnd, InlineAttrPassing, InlineAttrStart} from '../../../json-crdt-extensions/peritext/block/Inline';
10+
import {Inline, InlineAttrEnd, InlineAttrPassing, InlineAttrStart} from '../../../json-crdt-extensions/peritext/block/Inline';
1011
import {AnchorView} from './cursor/AnchorView';
1112
import type {Block} from '../../../json-crdt-extensions/peritext/block/Block';
1213

@@ -22,8 +23,12 @@ export const BlockView: React.FC<BlockViewProps> = React.memo(
2223
const {plugins, dom} = usePeritext();
2324
const elements: React.ReactNode[] = [];
2425
if (block instanceof LeafBlock) {
25-
for (const inline of block.texts()) {
26+
let inline: Inline<string> | undefined;
27+
let prevInline: Inline<string> | undefined;
28+
for (const iterator = block.texts0(); (inline = iterator()); prevInline = inline) {
2629
const hasCursor = inline.hasCursor();
30+
31+
// Insert cursor before the inline text element.
2732
if (hasCursor) {
2833
const attr = inline.attr();
2934
const italic = attr[CommonSliceType.i]?.[0];
@@ -32,17 +37,22 @@ export const BlockView: React.FC<BlockViewProps> = React.memo(
3237
const key = cursorStart.start.key() + '-a';
3338
let element: React.ReactNode;
3439
if (cursorStart.isStartFocused()) {
35-
if (cursorStart.isCollapsed())
36-
element = <CaretView key={key} italic={!!italic} point={cursorStart.start} cursor={cursorStart} />;
37-
else {
40+
if (cursorStart.isCollapsed()) {
41+
element = <CaretView key={key} italic={!!italic} point={cursorStart.start} cursor={cursorStart} fwd={inline} bwd={prevInline} />;
42+
} else {
3843
const isItalic = italic instanceof InlineAttrEnd || italic instanceof InlineAttrPassing;
3944
element = <FocusView key={key} italic={isItalic} cursor={cursorStart} />;
4045
}
4146
} else element = <AnchorView key={key} />;
4247
elements.push(element);
4348
}
4449
}
45-
elements.push(<InlineView key={inline.key()} inline={inline} />);
50+
51+
// Insert the inline text element itself.
52+
const currInlineProps = {key: inline.key(), inline};
53+
elements.push(h(InlineView, currInlineProps));
54+
55+
// Insert cursor after the inline text element.
4656
if (hasCursor) {
4757
const cursorEnd = inline.cursorEnd();
4858
const attr = inline.attr();
@@ -51,9 +61,9 @@ export const BlockView: React.FC<BlockViewProps> = React.memo(
5161
const key = cursorEnd.end.key() + '-b';
5262
let element: React.ReactNode;
5363
if (cursorEnd.isEndFocused()) {
54-
if (cursorEnd.isCollapsed())
55-
element = <CaretView key={key} italic={!!italic} point={cursorEnd.start} cursor={cursorEnd} />;
56-
else
64+
if (cursorEnd.isCollapsed()) {
65+
element = <CaretView key={key} italic={!!italic} point={cursorEnd.start} cursor={cursorEnd} bwd={inline} />;
66+
} else
5767
element = (
5868
<FocusView
5969
key={key}

‎src/json-crdt-peritext-ui/web/react/cursor/CaretView.tsx‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@ import {usePeritext} from '../context';
44
import {Caret} from './Caret';
55
import type {Cursor} from '../../../../json-crdt-extensions/peritext/editor/Cursor';
66
import type {Point} from '../../../../json-crdt-extensions/peritext/rga/Point';
7+
import type {Inline} from '../../../../json-crdt-extensions';
78

89
export interface CaretViewProps {
910
italic?: boolean;
1011
point: Point<string>;
1112
cursor: Cursor<string>;
13+
14+
/** Inline text slice followed after the cursor. */
15+
fwd?: Inline<string>;
16+
17+
/** Inline text slice followed before the cursor. */
18+
bwd?: Inline<string>;
1219
}
1320

1421
export const CaretView: React.FC<CaretViewProps> = (props) => {

0 commit comments

Comments
 (0)