);
const handleReplyClick: MouseEventHandler<HTMLButtonElement> = useCallback(
- (evt) => {
+ (evt, startThread = false) => {
const replyId = evt.currentTarget.getAttribute('data-event-id');
if (!replyId) {
console.warn('Button should have "data-event-id" attribute!');
const editedReply = getEditedEvent(replyId, replyEvt, room.getUnfilteredTimelineSet());
const content: IContent = editedReply?.getContent()['m.new_content'] ?? replyEvt.getContent();
const { body, formatted_body: formattedBody } = content;
- const { 'm.relates_to': relation } = replyEvt.getWireContent();
+ const { 'm.relates_to': relation } = startThread
+ ? { 'm.relates_to': { rel_type: 'm.thread', event_id: replyId } }
+ : replyEvt.getWireContent();
const senderId = replyEvt.getSender();
if (senderId && typeof body === 'string') {
setReplyDraft({
messageSpacing: MessageSpacing;
onUserClick: MouseEventHandler<HTMLButtonElement>;
onUsernameClick: MouseEventHandler<HTMLButtonElement>;
- onReplyClick: MouseEventHandler<HTMLButtonElement>;
+ onReplyClick: (
+ ev: Parameters<MouseEventHandler<HTMLButtonElement>>[0],
+ startThread?: boolean
+ ) => void;
onEditId?: (eventId?: string) => void;
onReactionToggle: (targetEventId: string, key: string, shortcode?: string) => void;
reply?: ReactNode;
}, 100);
};
+ const isThreadedMessage = mEvent.threadRootId !== undefined;
+
return (
<MessageBase
className={classNames(css.MessageBase, className)}
>
<Icon src={Icons.ReplyArrow} size="100" />
</IconButton>
+ {!isThreadedMessage && (
+ <IconButton
+ onClick={(ev) => onReplyClick(ev, true)}
+ data-event-id={mEvent.getId()}
+ variant="SurfaceVariant"
+ size="300"
+ radii="300"
+ >
+ <Icon src={Icons.ThreadPlus} size="100" />
+ </IconButton>
+ )}
{canEditEvent(mx, mEvent) && onEditId && (
<IconButton
onClick={() => onEditId(mEvent.getId())}
Reply
</Text>
</MenuItem>
+ {!isThreadedMessage && (
+ <MenuItem
+ size="300"
+ after={<Icon src={Icons.ThreadPlus} size="100" />}
+ radii="300"
+ data-event-id={mEvent.getId()}
+ onClick={(evt: any) => {
+ onReplyClick(evt, true);
+ closeMenu();
+ }}
+ >
+ <Text
+ className={css.MessageMenuItemText}
+ as="span"
+ size="T300"
+ truncate
+ >
+ Reply in Thread
+ </Text>
+ </MenuItem>
+ )}
{canEditEvent(mx, mEvent) && onEditId && (
<MenuItem
size="300"