Cleanup re-dispatching around timelines and composers (#7023)

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Šimon Brandner 2021-10-25 13:43:54 +02:00 committed by GitHub
parent 87dc2e8141
commit c3ad8b4eed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 45 additions and 10 deletions

View file

@ -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>,
); );

View file

@ -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;
} }

View file

@ -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,
}); });
}; };

View file

@ -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,
}); });
}; };

View file

@ -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();
} }
}; };

View file

@ -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}

View file

@ -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) {

View file

@ -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) {

View file

@ -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 {