Insert MD links when autocompleting in MD mode

These will appear decorated because they are inserted as entities. It was necessary to modify pills to have an explicit linkText that is derived from the `href` being pillified (and is thus no longer the inserted completion but rather the display name (or user ID) or room alias.
This commit is contained in:
Luke Barnard 2017-07-20 15:09:59 +01:00
parent 199b771051
commit 84fe51a162
3 changed files with 21 additions and 23 deletions

View file

@ -55,13 +55,8 @@ export default class RoomProvider extends AutocompleteProvider {
const displayAlias = getDisplayAliasForRoom(room.room) || room.roomId; const displayAlias = getDisplayAliasForRoom(room.room) || room.roomId;
return { return {
completion: displayAlias, completion: displayAlias,
entity: { suffix: ' ',
type: 'LINK', href: 'https://matrix.to/#/' + displayAlias,
mutability: 'IMMUTABLE',
data: {
url: 'https://matrix.to/#/' + displayAlias,
},
},
component: ( component: (
<PillCompletion initialComponent={<RoomAvatar width={24} height={24} room={room.room} />} title={room.name} description={displayAlias} /> <PillCompletion initialComponent={<RoomAvatar width={24} height={24} room={room.room} />} title={room.name} description={displayAlias} />
), ),

View file

@ -56,13 +56,7 @@ export default class UserProvider extends AutocompleteProvider {
return { return {
completion: displayName, completion: displayName,
suffix: range.start === 0 ? ': ' : ' ', suffix: range.start === 0 ? ': ' : ' ',
entity: { href: 'https://matrix.to/#/' + user.userId,
type: 'LINK',
mutability: 'IMMUTABLE',
data: {
url: 'https://matrix.to/#/' + user.userId,
},
},
component: ( component: (
<PillCompletion <PillCompletion
initialComponent={<MemberAvatar member={user} width={24} height={24}/>} initialComponent={<MemberAvatar member={user} width={24} height={24}/>}

View file

@ -198,6 +198,9 @@ export default class MessageComposerInput extends React.Component {
const resource = matrixToMatch[1]; // The room/user ID const resource = matrixToMatch[1]; // The room/user ID
const prefix = matrixToMatch[2]; // The first character of prefix const prefix = matrixToMatch[2]; // The first character of prefix
// Default to the room/user ID
let linkText = resource;
const isUserPill = prefix === '@'; const isUserPill = prefix === '@';
const isRoomPill = prefix === '#' || prefix === '!'; const isRoomPill = prefix === '#' || prefix === '!';
@ -212,12 +215,18 @@ export default class MessageComposerInput extends React.Component {
// member. This could be improved by doing an async profile lookup. // member. This could be improved by doing an async profile lookup.
const member = this.props.room.getMember(resource) || const member = this.props.room.getMember(resource) ||
new RoomMember(null, resource); new RoomMember(null, resource);
linkText = member.name;
avatar = member ? <MemberAvatar member={member} width={16} height={16}/> : null; avatar = member ? <MemberAvatar member={member} width={16} height={16}/> : null;
} else if (isRoomPill) { } else if (isRoomPill) {
const room = prefix === '#' ? const room = prefix === '#' ?
MatrixClientPeg.get().getRooms().find((r) => { MatrixClientPeg.get().getRooms().find((r) => {
return r.getCanonicalAlias() === resource; return r.getCanonicalAlias() === resource;
}) : MatrixClientPeg.get().getRoom(resource); }) : MatrixClientPeg.get().getRoom(resource);
linkText = room.getCanonicalAlias();
avatar = room ? <RoomAvatar room={room} width={16} height={16}/> : null; avatar = room ? <RoomAvatar room={room} width={16} height={16}/> : null;
} }
@ -225,7 +234,7 @@ export default class MessageComposerInput extends React.Component {
return ( return (
<span className={classes}> <span className={classes}>
{avatar} {avatar}
{props.children} {linkText}
</span> </span>
); );
} }
@ -928,14 +937,14 @@ export default class MessageComposerInput extends React.Component {
return false; return false;
} }
const {range = {}, completion = '', entity = null, suffix = ''} = displayedCompletion; const {range = {}, completion = '', href = null, suffix = ''} = displayedCompletion;
let entityKey; let entityKey;
if (entity) { let mdCompletion;
entityKey = Entity.create( if (href) {
entity.type, entityKey = Entity.create('LINK', 'IMMUTABLE', {url: href});
entity.mutability, if (!this.state.isRichtextEnabled) {
entity.data, mdCompletion = `[${completion}](${href})`;
); }
} }
let contentState = Modifier.replaceText( let contentState = Modifier.replaceText(
@ -943,7 +952,7 @@ export default class MessageComposerInput extends React.Component {
RichText.textOffsetsToSelectionState( RichText.textOffsetsToSelectionState(
range, activeEditorState.getCurrentContent().getBlocksAsArray(), range, activeEditorState.getCurrentContent().getBlocksAsArray(),
), ),
completion, mdCompletion || completion,
null, null,
entityKey, entityKey,
); );