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