+ { _t("Reply to an ongoing thread or use “%(replyInThread)s” "
+ + "when hovering over a message to start a new one.", {
+ replyInThread: _t("Reply in thread"),
+ }) }
+
+
+ { /* Always display that paragraph to prevent layout shift when hiding the button */ }
+ { (filterOption === ThreadFilterType.My)
+ ?
+ : <> >
+ }
+
+ >;
+ } else {
+ body = <>
+
{ _t("Threads help keep your conversations on-topic and easy to track.") }
+
+ { _t('Tip: Use "Reply in thread" when hovering over a message.', {}, {
+ b: sub => { sub },
+ }) }
+
+ >;
+ }
+
return ;
};
@@ -276,6 +295,7 @@ const ThreadPanel: React.FC = ({
timelineSet={timelineSet}
showUrlPreview={false} // No URL previews at the threads list level
empty={ 0}
filterOption={filterOption}
showAllThreadsCallback={() => setFilterOption(ThreadFilterType.All)}
/>}
diff --git a/src/components/views/context_menus/MessageContextMenu.tsx b/src/components/views/context_menus/MessageContextMenu.tsx
index 8899c13a606..e0b1b7c9a8d 100644
--- a/src/components/views/context_menus/MessageContextMenu.tsx
+++ b/src/components/views/context_menus/MessageContextMenu.tsx
@@ -44,7 +44,6 @@ import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks";
import { ChevronFace, IPosition } from '../../structures/ContextMenu';
import RoomContext, { TimelineRenderingType } from '../../../contexts/RoomContext';
import { ComposerInsertPayload } from "../../../dispatcher/payloads/ComposerInsertPayload";
-import { WidgetLayoutStore } from '../../../stores/widgets/WidgetLayoutStore';
import EndPollDialog from '../dialogs/EndPollDialog';
import { isPollEnded } from '../messages/MPollBody';
import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload";
@@ -472,14 +471,11 @@ export default class MessageContextMenu extends React.Component
timelineRenderingType === TimelineRenderingType.Thread ||
timelineRenderingType === TimelineRenderingType.ThreadsList
);
- const isThreadRootEvent = isThread && this.props.mxEvent?.getThread()?.rootEvent === this.props.mxEvent;
+ const isThreadRootEvent = isThread && this.props.mxEvent.isThreadRoot;
- const isMainSplitTimelineShown = !WidgetLayoutStore.instance.hasMaximisedWidget(
- MatrixClientPeg.get().getRoom(mxEvent.getRoomId()),
- );
const commonItemsList = (
- { (isThreadRootEvent && isMainSplitTimelineShown) && {
}
const isDm = DMRoomMap.shared().getUserIdForRoomId(room.roomId);
- const isVideoRoom = useFeatureEnabled("feature_video_rooms") && room.isCallRoom();
+ const isVideoRoom = useFeatureEnabled("feature_video_rooms") && room.isElementVideoRoom();
let inviteOption: JSX.Element;
if (room.canInvite(cli.getUserId()) && !isDm) {
diff --git a/src/components/views/dialogs/CreateRoomDialog.tsx b/src/components/views/dialogs/CreateRoomDialog.tsx
index feec3443137..ffb28719a7e 100644
--- a/src/components/views/dialogs/CreateRoomDialog.tsx
+++ b/src/components/views/dialogs/CreateRoomDialog.tsx
@@ -221,7 +221,7 @@ export default class CreateRoomDialog extends React.Component {
});
render() {
- const isVideoRoom = this.props.type === RoomType.UnstableCall;
+ const isVideoRoom = this.props.type === RoomType.ElementVideo;
let aliasField;
if (this.state.joinRule === JoinRule.Public) {
diff --git a/src/components/views/messages/TextualBody.tsx b/src/components/views/messages/TextualBody.tsx
index 9ec9980fb83..cbc0ad4f5df 100644
--- a/src/components/views/messages/TextualBody.tsx
+++ b/src/components/views/messages/TextualBody.tsx
@@ -607,9 +607,14 @@ export default class TextualBody extends React.Component {
if (this.props.highlightLink) {
body = { body };
} else if (content.data && typeof content.data["org.matrix.neb.starter_link"] === "string") {
- body = { body };
+ body = (
+
+ { body }
+
+ );
}
let widgets;
@@ -651,9 +656,7 @@ export default class TextualBody extends React.Component {
);
}
return (
-