Skip to content

Commit f756754

Browse files
committed
feat(json-crdt-peritext-ui): 🎸 implement various formatting renderers
1 parent 612b64b commit f756754

File tree

12 files changed

+82
-47
lines changed

12 files changed

+82
-47
lines changed

src/json-crdt-peritext-ui/plugins/toolbar/cursor/caret/CaretBottomOverlay/FormattingDisplay.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import * as React from 'react';
22
import {ContextPane, ContextSep} from 'nice-ui/lib/4-card/ContextMenu';
3-
import {SliceFormatting} from '../../../state/formattings';
3+
import {SavedFormatting} from '../../../state/formattings';
44
import {ContextPaneHeader} from '../../../../../components/ContextPaneHeader';
55
import {ContextPaneHeaderSep} from '../../../../../components/ContextPaneHeaderSep';
66
import {FormattingTitle} from '../../../components/FormattingTitle';
7-
import {FormattingEdit} from '../../../formatting/FormattingEdit';
7+
import {FormattingEdit} from '../../../formatting/edit/FormattingEdit';
88

99
export interface FormattingDisplayProps {
10-
formatting: SliceFormatting;
10+
formatting: SavedFormatting;
1111
onClose?: () => void;
1212
}
1313

src/json-crdt-peritext-ui/plugins/toolbar/cursor/caret/CaretBottomOverlay/FormattingList.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import * as React from 'react';
22
import {ContextPane, ContextItem, ContextSep} from 'nice-ui/lib/4-card/ContextMenu';
33
import {SYMBOL} from 'nano-theme';
4-
import {FormattingGenericIcon} from '../../../components/FormattingGenericIcon';
5-
import {SliceFormatting} from '../../../state/formattings';
4+
import {SavedFormatting} from '../../../state/formattings';
5+
import {FormattingIcon} from '../../../formatting/icon/FormattingIcon';
66

77
export interface FormattingListProps {
8-
formattings: SliceFormatting[];
9-
onSelect: (formatting: SliceFormatting) => void;
8+
formattings: SavedFormatting[];
9+
onSelect: (formatting: SavedFormatting) => void;
1010
}
1111

1212
export const FormattingList: React.FC<FormattingListProps> = ({formattings, onSelect}) => {
@@ -25,7 +25,7 @@ export const FormattingList: React.FC<FormattingListProps> = ({formattings, onSe
2525
<ContextItem inset
2626
key={formatting.key()}
2727
icon={menu?.icon?.()}
28-
right={data.renderIcon?.(formatting) || <FormattingGenericIcon formatting={formatting} />}
28+
right={<FormattingIcon formatting={formatting} />}
2929
onClick={() => onSelect(formatting)}
3030
>
3131
{menu?.name ?? behavior.name}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import {BehaviorSubject} from 'rxjs';
2-
import {SliceFormatting} from '../../../state/formattings';
2+
import {SavedFormatting} from '../../../state/formattings';
33
import {PersistedSlice} from '../../../../../../json-crdt-extensions/peritext/slice/PersistedSlice';
44
import type {Inline} from '../../../../../../json-crdt-extensions';
55
import type {ToolbarState} from '../../../state';
66

77
export class CaretBottomState {
8-
public readonly selected$ = new BehaviorSubject<SliceFormatting | null>(null);
8+
public readonly selected$ = new BehaviorSubject<SavedFormatting | null>(null);
99

1010
public constructor(
1111
public readonly state: ToolbarState,
1212
public readonly inline: Inline | undefined,
1313
) {}
1414

15-
public getFormatting(inline: Inline | undefined = this.inline): SliceFormatting[] {
15+
public getFormatting(inline: Inline | undefined = this.inline): SavedFormatting[] {
1616
const slices = inline?.p1.layers;
17-
const res: SliceFormatting[] = [];
17+
const res: SavedFormatting[] = [];
1818
if (!slices) return res;
1919
const registry = this.state.txt.editor.getRegistry();
2020
for (const slice of slices) {
@@ -25,12 +25,12 @@ export class CaretBottomState {
2525
const isConfigurable = !!behavior.schema;
2626
if (!isConfigurable) continue;
2727
if (!(slice instanceof PersistedSlice)) continue;
28-
res.push(new SliceFormatting(behavior, slice));
28+
res.push(new SavedFormatting(behavior, slice));
2929
}
3030
return res;
3131
};
3232

33-
public readonly select = (formatting: SliceFormatting | null) => {
33+
public readonly select = (formatting: SavedFormatting | null) => {
3434
this.selected$.next(formatting);
3535
};
3636
}

src/json-crdt-peritext-ui/plugins/toolbar/formatting/FormattingEdit.tsx

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import * as React from 'react';
2+
import type {EditProps} from '../../types';
3+
4+
export interface FormattingEditProps extends EditProps {}
5+
6+
export const FormattingEdit: React.FC<FormattingEditProps> = (props) => {
7+
const Edit = props.formatting.behavior.data().Edit;
8+
9+
return (
10+
Edit ? <Edit {...props} /> : <div>no editor</div>
11+
);
12+
};
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import * as React from 'react';
2+
import {GenericIcon} from './GenericIcon';
3+
import type {IconProps} from '../../types';
4+
5+
export interface FormattingIconProps extends IconProps {}
6+
7+
export const FormattingIcon: React.FC<FormattingIconProps> = (props) => {
8+
const Icon = props.formatting.behavior.data().Icon;
9+
10+
return (
11+
Icon ? <Icon {...props} /> : <GenericIcon {...props} />
12+
);
13+
};

src/json-crdt-peritext-ui/plugins/toolbar/components/FormattingGenericIcon.tsx renamed to src/json-crdt-peritext-ui/plugins/toolbar/formatting/icon/GenericIcon.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import * as React from 'react';
22
import {Avatar} from 'nice-ui/lib/1-inline/Avatar';
3-
import type {SliceFormatting} from '../state/formattings';
3+
import type {FormattingIconProps} from './FormattingIcon';
44

5-
export interface FormattingGenericIconProps {
6-
formatting: SliceFormatting;
7-
}
5+
export interface GenericIconProps extends FormattingIconProps {}
86

9-
export const FormattingGenericIcon: React.FC<FormattingGenericIconProps> = ({formatting}) => {
7+
export const GenericIcon: React.FC<GenericIconProps> = ({formatting}) => {
108
const data = formatting.behavior.data();
11-
const id = formatting.range.id;
9+
const id = formatting.range.start.id;
1210
const time = id.time + '';
1311
const name = data?.previewText?.(formatting) || (time[time.length - 1] + time[time.length - 2] + time + '.' + id.sid);
1412

src/json-crdt-peritext-ui/plugins/toolbar/formatting/new/FormattingNew.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import * as React from 'react';
22
import type {NewProps} from '../../types';
33

4-
export const FormattingNew: React.FC<NewProps> = (props) => {
4+
export interface FormattingNewProps extends NewProps {}
5+
6+
export const FormattingNew: React.FC<FormattingNewProps> = (props) => {
57
const New = props.formatting.behavior.data().New;
68

79
return (
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import * as React from 'react';
2+
import type {EditProps} from '../../types';
3+
4+
export interface FormattingViewProps extends EditProps {}
5+
6+
export const FormattingView: React.FC<FormattingViewProps> = (props) => {
7+
const View = props.formatting.behavior.data().View;
8+
9+
return (
10+
View ? <View {...props} /> : <div>no editor</div>
11+
);
12+
};

src/json-crdt-peritext-ui/plugins/toolbar/state/ToolbarState.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,18 +108,18 @@ export class ToolbarState implements UiLifeCycles {
108108
if (linkEntry) {
109109
const data = linkEntry.data() as SliceRegistryEntryData;
110110
data.menu = this.linkMenuItem();
111-
data.previewText = ({range: slice}) => {
112-
const data = slice.data() as {href: string};
111+
data.previewText = (formatting) => {
112+
const data = formatting.conf()?.view() as {href: string};
113113
if (!data || typeof data !== 'object') return '';
114114
return (data.href || '').replace(/^(https?:\/\/)?(www\.)?/, '');
115115
};
116-
data.renderIcon = ({range}) => {
117-
const data = range.data() as {href: string};
116+
data.Icon = ({formatting}) => {
117+
const data = formatting.conf()?.view() as {href: string};
118118
if (!data || typeof data !== 'object') return;
119119
return <Favicon url={data.href} />;
120120
};
121121
data.New = NewLinkConfig;
122-
data.renderPreview = (formatting) => {
122+
data.View = ({formatting}) => {
123123
const data = formatting.range.data() as {href: string};
124124
if (!data || typeof data !== 'object') return;
125125
return <UrlDisplayLayout url={data.href} />;

0 commit comments

Comments
 (0)