mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-16 13:14:58 +08:00
Cleanup re-dispatching around timelines and composers (#7023)
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
parent
87dc2e8141
commit
c3ad8b4eed
@ -196,6 +196,7 @@ interface IReadReceiptForUser {
|
|||||||
@replaceableComponent("structures.MessagePanel")
|
@replaceableComponent("structures.MessagePanel")
|
||||||
export default class MessagePanel extends React.Component<IProps, IState> {
|
export default class MessagePanel extends React.Component<IProps, IState> {
|
||||||
static contextType = RoomContext;
|
static contextType = RoomContext;
|
||||||
|
public context!: React.ContextType<typeof RoomContext>;
|
||||||
|
|
||||||
// opaque readreceipt info for each userId; used by ReadReceiptMarker
|
// opaque readreceipt info for each userId; used by ReadReceiptMarker
|
||||||
// to manage its animations
|
// to manage its animations
|
||||||
@ -787,6 +788,7 @@ export default class MessagePanel extends React.Component<IProps, IState> {
|
|||||||
showReadReceipts={this.props.showReadReceipts}
|
showReadReceipts={this.props.showReadReceipts}
|
||||||
callEventGrouper={callEventGrouper}
|
callEventGrouper={callEventGrouper}
|
||||||
hideSender={this.membersCount <= 2 && this.props.layout === Layout.Bubble}
|
hideSender={this.membersCount <= 2 && this.props.layout === Layout.Bubble}
|
||||||
|
timelineRenderingType={this.context.timelineRenderingType}
|
||||||
/>
|
/>
|
||||||
</TileErrorBoundary>,
|
</TileErrorBoundary>,
|
||||||
);
|
);
|
||||||
|
@ -94,6 +94,7 @@ import { logger } from "matrix-js-sdk/src/logger";
|
|||||||
import { EventTimeline } from 'matrix-js-sdk/src/models/event-timeline';
|
import { EventTimeline } from 'matrix-js-sdk/src/models/event-timeline';
|
||||||
import { dispatchShowThreadEvent } from '../../dispatcher/dispatch-actions/threads';
|
import { dispatchShowThreadEvent } from '../../dispatcher/dispatch-actions/threads';
|
||||||
import { fetchInitialEvent } from "../../utils/EventUtils";
|
import { fetchInitialEvent } from "../../utils/EventUtils";
|
||||||
|
import { ComposerType } from "../../dispatcher/payloads/ComposerInsertPayload";
|
||||||
|
|
||||||
const DEBUG = false;
|
const DEBUG = false;
|
||||||
let debuglog = function(msg: string) {};
|
let debuglog = function(msg: string) {};
|
||||||
@ -864,10 +865,11 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case Action.ComposerInsert: {
|
case Action.ComposerInsert: {
|
||||||
|
if (payload.composerType) break;
|
||||||
// re-dispatch to the correct composer
|
// re-dispatch to the correct composer
|
||||||
dis.dispatch({
|
dis.dispatch({
|
||||||
...payload,
|
...payload,
|
||||||
action: this.state.editState ? "edit_composer_insert" : "send_composer_insert",
|
composerType: this.state.editState ? ComposerType.Edit : ComposerType.Send,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@ import MessageEditHistoryDialog from "../dialogs/MessageEditHistoryDialog";
|
|||||||
import EditMessageComposer from '../rooms/EditMessageComposer';
|
import EditMessageComposer from '../rooms/EditMessageComposer';
|
||||||
import LinkPreviewGroup from '../rooms/LinkPreviewGroup';
|
import LinkPreviewGroup from '../rooms/LinkPreviewGroup';
|
||||||
import { IBodyProps } from "./IBodyProps";
|
import { IBodyProps } from "./IBodyProps";
|
||||||
|
import RoomContext from "../../../contexts/RoomContext";
|
||||||
|
|
||||||
const MAX_HIGHLIGHT_LENGTH = 4096;
|
const MAX_HIGHLIGHT_LENGTH = 4096;
|
||||||
|
|
||||||
@ -62,6 +63,9 @@ export default class TextualBody extends React.Component<IBodyProps, IState> {
|
|||||||
private unmounted = false;
|
private unmounted = false;
|
||||||
private pills: Element[] = [];
|
private pills: Element[] = [];
|
||||||
|
|
||||||
|
static contextType = RoomContext;
|
||||||
|
public context!: React.ContextType<typeof RoomContext>;
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
@ -406,6 +410,7 @@ export default class TextualBody extends React.Component<IBodyProps, IState> {
|
|||||||
dis.dispatch<ComposerInsertPayload>({
|
dis.dispatch<ComposerInsertPayload>({
|
||||||
action: Action.ComposerInsert,
|
action: Action.ComposerInsert,
|
||||||
userId: mxEvent.getSender(),
|
userId: mxEvent.getSender(),
|
||||||
|
timelineRenderingType: this.context.timelineRenderingType,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -76,6 +76,7 @@ import { bulkSpaceBehaviour } from "../../../utils/space";
|
|||||||
import { logger } from "matrix-js-sdk/src/logger";
|
import { logger } from "matrix-js-sdk/src/logger";
|
||||||
import { shouldShowComponent } from "../../../customisations/helpers/UIComponents";
|
import { shouldShowComponent } from "../../../customisations/helpers/UIComponents";
|
||||||
import { UIComponent } from "../../../settings/UIFeature";
|
import { UIComponent } from "../../../settings/UIFeature";
|
||||||
|
import { TimelineRenderingType } from "../../../contexts/RoomContext";
|
||||||
|
|
||||||
export interface IDevice {
|
export interface IDevice {
|
||||||
deviceId: string;
|
deviceId: string;
|
||||||
@ -378,6 +379,7 @@ const UserOptionsSection: React.FC<{
|
|||||||
dis.dispatch<ComposerInsertPayload>({
|
dis.dispatch<ComposerInsertPayload>({
|
||||||
action: Action.ComposerInsert,
|
action: Action.ComposerInsert,
|
||||||
userId: member.userId,
|
userId: member.userId,
|
||||||
|
timelineRenderingType: TimelineRenderingType.Room,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ import SettingsStore from "../../../settings/SettingsStore";
|
|||||||
import { logger } from "matrix-js-sdk/src/logger";
|
import { logger } from "matrix-js-sdk/src/logger";
|
||||||
import { withMatrixClientHOC, MatrixClientProps } from '../../../contexts/MatrixClientContext';
|
import { withMatrixClientHOC, MatrixClientProps } from '../../../contexts/MatrixClientContext';
|
||||||
import RoomContext from '../../../contexts/RoomContext';
|
import RoomContext from '../../../contexts/RoomContext';
|
||||||
|
import { ComposerType } from "../../../dispatcher/payloads/ComposerInsertPayload";
|
||||||
|
|
||||||
function getHtmlReplyFallback(mxEvent: MatrixEvent): string {
|
function getHtmlReplyFallback(mxEvent: MatrixEvent): string {
|
||||||
const html = mxEvent.getContent().formatted_body;
|
const html = mxEvent.getContent().formatted_body;
|
||||||
@ -499,7 +500,12 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||||||
};
|
};
|
||||||
|
|
||||||
private onAction = (payload: ActionPayload) => {
|
private onAction = (payload: ActionPayload) => {
|
||||||
if (payload.action === "edit_composer_insert" && this.editorRef.current) {
|
if (!this.editorRef.current) return;
|
||||||
|
|
||||||
|
if (payload.action === Action.ComposerInsert) {
|
||||||
|
if (payload.timelineRenderingType !== this.context.timelineRenderingType) return;
|
||||||
|
if (payload.composerType !== ComposerType.Edit) return;
|
||||||
|
|
||||||
if (payload.userId) {
|
if (payload.userId) {
|
||||||
this.editorRef.current?.insertMention(payload.userId);
|
this.editorRef.current?.insertMention(payload.userId);
|
||||||
} else if (payload.event) {
|
} else if (payload.event) {
|
||||||
@ -507,7 +513,7 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||||||
} else if (payload.text) {
|
} else if (payload.text) {
|
||||||
this.editorRef.current?.insertPlaintext(payload.text);
|
this.editorRef.current?.insertPlaintext(payload.text);
|
||||||
}
|
}
|
||||||
} else if (payload.action === Action.FocusEditMessageComposer && this.editorRef.current) {
|
} else if (payload.action === Action.FocusEditMessageComposer) {
|
||||||
this.editorRef.current.focus();
|
this.editorRef.current.focus();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -62,6 +62,7 @@ import { dispatchShowThreadEvent } from '../../../dispatcher/dispatch-actions/th
|
|||||||
import { MessagePreviewStore } from '../../../stores/room-list/MessagePreviewStore';
|
import { MessagePreviewStore } from '../../../stores/room-list/MessagePreviewStore';
|
||||||
|
|
||||||
import { logger } from "matrix-js-sdk/src/logger";
|
import { logger } from "matrix-js-sdk/src/logger";
|
||||||
|
import { TimelineRenderingType } from "../../../contexts/RoomContext";
|
||||||
|
|
||||||
const eventTileTypes = {
|
const eventTileTypes = {
|
||||||
[EventType.RoomMessage]: 'messages.MessageEvent',
|
[EventType.RoomMessage]: 'messages.MessageEvent',
|
||||||
@ -313,6 +314,8 @@ interface IProps {
|
|||||||
|
|
||||||
// whether or not to display thread info
|
// whether or not to display thread info
|
||||||
showThreadInfo?: boolean;
|
showThreadInfo?: boolean;
|
||||||
|
|
||||||
|
timelineRenderingType?: TimelineRenderingType;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IState {
|
interface IState {
|
||||||
@ -855,10 +858,11 @@ export default class EventTile extends React.Component<IProps, IState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onSenderProfileClick = () => {
|
onSenderProfileClick = () => {
|
||||||
const mxEvent = this.props.mxEvent;
|
if (!this.props.timelineRenderingType) return;
|
||||||
dis.dispatch<ComposerInsertPayload>({
|
dis.dispatch<ComposerInsertPayload>({
|
||||||
action: Action.ComposerInsert,
|
action: Action.ComposerInsert,
|
||||||
userId: mxEvent.getSender(),
|
userId: this.props.mxEvent.getSender(),
|
||||||
|
timelineRenderingType: this.props.timelineRenderingType,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1091,7 +1095,7 @@ export default class EventTile extends React.Component<IProps, IState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (needsSenderProfile && this.props.hideSender !== true) {
|
if (needsSenderProfile && this.props.hideSender !== true) {
|
||||||
if (!this.props.tileShape) {
|
if (!this.props.tileShape || this.props.tileShape === TileShape.Thread) {
|
||||||
sender = <SenderProfile onClick={this.onSenderProfileClick}
|
sender = <SenderProfile onClick={this.onSenderProfileClick}
|
||||||
mxEvent={this.props.mxEvent}
|
mxEvent={this.props.mxEvent}
|
||||||
enableFlair={this.props.enableFlair}
|
enableFlair={this.props.enableFlair}
|
||||||
|
@ -252,7 +252,8 @@ export default class MessageComposer extends React.Component<IProps, IState> {
|
|||||||
private ref: React.RefObject<HTMLDivElement> = createRef();
|
private ref: React.RefObject<HTMLDivElement> = createRef();
|
||||||
private instanceId: number;
|
private instanceId: number;
|
||||||
|
|
||||||
public static contextType = RoomContext;
|
static contextType = RoomContext;
|
||||||
|
public context!: React.ContextType<typeof RoomContext>;
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
compact: false,
|
compact: false,
|
||||||
@ -398,13 +399,14 @@ export default class MessageComposer extends React.Component<IProps, IState> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private addEmoji(emoji: string): boolean {
|
private addEmoji = (emoji: string): boolean => {
|
||||||
dis.dispatch<ComposerInsertPayload>({
|
dis.dispatch<ComposerInsertPayload>({
|
||||||
action: Action.ComposerInsert,
|
action: Action.ComposerInsert,
|
||||||
text: emoji,
|
text: emoji,
|
||||||
|
timelineRenderingType: this.context.timelineRenderingType,
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
};
|
||||||
|
|
||||||
private sendMessage = async () => {
|
private sendMessage = async () => {
|
||||||
if (this.state.haveRecording && this.voiceRecordingButton.current) {
|
if (this.state.haveRecording && this.voiceRecordingButton.current) {
|
||||||
|
@ -58,6 +58,7 @@ import { ActionPayload } from "../../../dispatcher/payloads";
|
|||||||
import { decorateStartSendingTime, sendRoundTripMetric } from "../../../sendTimePerformanceMetrics";
|
import { decorateStartSendingTime, sendRoundTripMetric } from "../../../sendTimePerformanceMetrics";
|
||||||
import RoomContext from '../../../contexts/RoomContext';
|
import RoomContext from '../../../contexts/RoomContext';
|
||||||
import DocumentPosition from "../../../editor/position";
|
import DocumentPosition from "../../../editor/position";
|
||||||
|
import { ComposerType } from "../../../dispatcher/payloads/ComposerInsertPayload";
|
||||||
|
|
||||||
function addReplyToMessageContent(
|
function addReplyToMessageContent(
|
||||||
content: IContent,
|
content: IContent,
|
||||||
@ -591,7 +592,10 @@ export class SendMessageComposer extends React.Component<ISendMessageComposerPro
|
|||||||
this.editorRef.current?.focus();
|
this.editorRef.current?.focus();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "send_composer_insert":
|
case Action.ComposerInsert:
|
||||||
|
if (payload.timelineRenderingType !== this.context.timelineRenderingType) break;
|
||||||
|
if (payload.composerType !== ComposerType.Send) break;
|
||||||
|
|
||||||
if (payload.userId) {
|
if (payload.userId) {
|
||||||
this.editorRef.current?.insertMention(payload.userId);
|
this.editorRef.current?.insertMention(payload.userId);
|
||||||
} else if (payload.event) {
|
} else if (payload.event) {
|
||||||
|
@ -18,9 +18,17 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event";
|
|||||||
|
|
||||||
import { ActionPayload } from "../payloads";
|
import { ActionPayload } from "../payloads";
|
||||||
import { Action } from "../actions";
|
import { Action } from "../actions";
|
||||||
|
import { TimelineRenderingType } from "../../contexts/RoomContext";
|
||||||
|
|
||||||
|
export enum ComposerType {
|
||||||
|
Send = "send",
|
||||||
|
Edit = "edit",
|
||||||
|
}
|
||||||
|
|
||||||
interface IBaseComposerInsertPayload extends ActionPayload {
|
interface IBaseComposerInsertPayload extends ActionPayload {
|
||||||
action: Action.ComposerInsert;
|
action: Action.ComposerInsert;
|
||||||
|
timelineRenderingType: TimelineRenderingType;
|
||||||
|
composerType?: ComposerType; // falsey if should be re-dispatched to the correct composer
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IComposerInsertMentionPayload extends IBaseComposerInsertPayload {
|
interface IComposerInsertMentionPayload extends IBaseComposerInsertPayload {
|
||||||
|
Loading…
Reference in New Issue
Block a user