mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-05 15:00:30 +03:00
Editor Commands (#1450)
* add commands hook * add commands in editor * add command auto complete menu * add commands in room input * remove old reply code from room input * fix video component css * do not auto focus input on android or ios * fix crash on enable block after selection * fix circular deps in editor * fix autocomplete return focus move editor cursor * remove unwanted keydown from room input * fix emoji alignment in editor * test ipad user agent * refactor isAndroidOrIOS to mobileOrTablet * update slate & slate-react * downgrade slate-react to 0.98.4 0.99.0 has breaking changes with ReactEditor.focus * add sql to readable ext mimetype * fix empty editor formatting gets saved as draft * add option to use enter for newline * remove empty msg draft from atom family * prevent msg ctx menu from open on text selection
This commit is contained in:
parent
4d0b6b93bc
commit
613e6d6503
34 changed files with 620 additions and 131 deletions
|
|
@ -1,34 +1,18 @@
|
|||
import { Scroll, Text } from 'folds';
|
||||
import React from 'react';
|
||||
import { RenderElementProps, RenderLeafProps, useFocused, useSelected } from 'slate-react';
|
||||
import {
|
||||
RenderElementProps,
|
||||
RenderLeafProps,
|
||||
useFocused,
|
||||
useSelected,
|
||||
useSlate,
|
||||
} from 'slate-react';
|
||||
|
||||
import * as css from '../../styles/CustomHtml.css';
|
||||
import { EmoticonElement, LinkElement, MentionElement } from './slate';
|
||||
import { CommandElement, EmoticonElement, LinkElement, MentionElement } from './slate';
|
||||
import { useMatrixClient } from '../../hooks/useMatrixClient';
|
||||
|
||||
export enum MarkType {
|
||||
Bold = 'bold',
|
||||
Italic = 'italic',
|
||||
Underline = 'underline',
|
||||
StrikeThrough = 'strikeThrough',
|
||||
Code = 'code',
|
||||
Spoiler = 'spoiler',
|
||||
}
|
||||
|
||||
export enum BlockType {
|
||||
Paragraph = 'paragraph',
|
||||
Heading = 'heading',
|
||||
CodeLine = 'code-line',
|
||||
CodeBlock = 'code-block',
|
||||
QuoteLine = 'quote-line',
|
||||
BlockQuote = 'block-quote',
|
||||
ListItem = 'list-item',
|
||||
OrderedList = 'ordered-list',
|
||||
UnorderedList = 'unordered-list',
|
||||
Mention = 'mention',
|
||||
Emoticon = 'emoticon',
|
||||
Link = 'link',
|
||||
}
|
||||
import { getBeginCommand } from './utils';
|
||||
import { BlockType } from './types';
|
||||
|
||||
// Put this at the start and end of an inline component to work around this Chromium bug:
|
||||
// https://bugs.chromium.org/p/chromium/issues/detail?id=1249405
|
||||
|
|
@ -62,6 +46,29 @@ function RenderMentionElement({
|
|||
</span>
|
||||
);
|
||||
}
|
||||
function RenderCommandElement({
|
||||
attributes,
|
||||
element,
|
||||
children,
|
||||
}: { element: CommandElement } & RenderElementProps) {
|
||||
const selected = useSelected();
|
||||
const focused = useFocused();
|
||||
const editor = useSlate();
|
||||
|
||||
return (
|
||||
<span
|
||||
{...attributes}
|
||||
className={css.Command({
|
||||
focus: selected && focused,
|
||||
active: getBeginCommand(editor) === element.command,
|
||||
})}
|
||||
contentEditable={false}
|
||||
>
|
||||
{`/${element.command}`}
|
||||
{children}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
function RenderEmoticonElement({
|
||||
attributes,
|
||||
|
|
@ -200,6 +207,12 @@ export function RenderElement({ attributes, element, children }: RenderElementPr
|
|||
{children}
|
||||
</RenderLinkElement>
|
||||
);
|
||||
case BlockType.Command:
|
||||
return (
|
||||
<RenderCommandElement attributes={attributes} element={element}>
|
||||
{children}
|
||||
</RenderCommandElement>
|
||||
);
|
||||
default:
|
||||
return (
|
||||
<Text className={css.Paragraph} {...attributes}>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue