Improve types for sendEvent
(#12335)
This commit is contained in:
parent
4941327c78
commit
ef2bd7ae04
26 changed files with 209 additions and 99 deletions
|
@ -16,9 +16,10 @@ limitations under the License.
|
|||
|
||||
import React, { createRef, KeyboardEvent } from "react";
|
||||
import classNames from "classnames";
|
||||
import { EventStatus, IContent, MatrixEvent, Room, MsgType } from "matrix-js-sdk/src/matrix";
|
||||
import { EventStatus, MatrixEvent, Room, MsgType } from "matrix-js-sdk/src/matrix";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { Composer as ComposerEvent } from "@matrix-org/analytics-events/types/typescript/Composer";
|
||||
import { ReplacementEvent, RoomMessageEventContent, RoomMessageTextEventContent } from "matrix-js-sdk/src/types";
|
||||
|
||||
import { _t } from "../../../languageHandler";
|
||||
import dis from "../../../dispatcher/dispatcher";
|
||||
|
@ -70,7 +71,11 @@ function getTextReplyFallback(mxEvent: MatrixEvent): string {
|
|||
}
|
||||
|
||||
// exported for tests
|
||||
export function createEditContent(model: EditorModel, editedEvent: MatrixEvent, replyToEvent?: MatrixEvent): IContent {
|
||||
export function createEditContent(
|
||||
model: EditorModel,
|
||||
editedEvent: MatrixEvent,
|
||||
replyToEvent?: MatrixEvent,
|
||||
): RoomMessageEventContent {
|
||||
const isEmote = containsEmote(model);
|
||||
if (isEmote) {
|
||||
model = stripEmoteCommand(model);
|
||||
|
@ -86,11 +91,11 @@ export function createEditContent(model: EditorModel, editedEvent: MatrixEvent,
|
|||
|
||||
const body = textSerialize(model);
|
||||
|
||||
const newContent: IContent = {
|
||||
const newContent: RoomMessageEventContent = {
|
||||
msgtype: isEmote ? MsgType.Emote : MsgType.Text,
|
||||
body: body,
|
||||
};
|
||||
const contentBody: IContent = {
|
||||
const contentBody: RoomMessageTextEventContent & Omit<ReplacementEvent<RoomMessageEventContent>, "m.relates_to"> = {
|
||||
"msgtype": newContent.msgtype,
|
||||
"body": `${plainPrefix} * ${body}`,
|
||||
"m.new_content": newContent,
|
||||
|
@ -111,7 +116,7 @@ export function createEditContent(model: EditorModel, editedEvent: MatrixEvent,
|
|||
attachMentions(editedEvent.sender!.userId, contentBody, model, replyToEvent, editedEvent.getContent());
|
||||
attachRelation(contentBody, { rel_type: "m.replace", event_id: editedEvent.getId() });
|
||||
|
||||
return contentBody;
|
||||
return contentBody as RoomMessageEventContent;
|
||||
}
|
||||
|
||||
interface IEditMessageComposerProps extends MatrixClientProps {
|
||||
|
@ -142,7 +147,7 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||
|
||||
const editContent = createEditContent(this.model, ev, this.replyToEvent);
|
||||
this.state = {
|
||||
saveDisabled: !isRestored || !this.isContentModified(editContent["m.new_content"]),
|
||||
saveDisabled: !isRestored || !this.isContentModified(editContent["m.new_content"]!),
|
||||
};
|
||||
|
||||
window.addEventListener("beforeunload", this.saveStoredEditorState);
|
||||
|
@ -284,14 +289,16 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||
localStorage.setItem(this.editorStateKey, JSON.stringify(item));
|
||||
};
|
||||
|
||||
private isContentModified(newContent: IContent): boolean {
|
||||
private isContentModified(newContent: RoomMessageEventContent): boolean {
|
||||
// if nothing has changed then bail
|
||||
const oldContent = this.props.editState.getEvent().getContent();
|
||||
const oldContent = this.props.editState.getEvent().getContent<RoomMessageEventContent>();
|
||||
if (
|
||||
oldContent["msgtype"] === newContent["msgtype"] &&
|
||||
oldContent["body"] === newContent["body"] &&
|
||||
oldContent["format"] === newContent["format"] &&
|
||||
oldContent["formatted_body"] === newContent["formatted_body"]
|
||||
(oldContent as RoomMessageTextEventContent)["format"] ===
|
||||
(newContent as RoomMessageTextEventContent)["format"] &&
|
||||
(oldContent as RoomMessageTextEventContent)["formatted_body"] ===
|
||||
(newContent as RoomMessageTextEventContent)["formatted_body"]
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
@ -318,7 +325,7 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||
this.editorRef.current.replaceEmoticon(position, REGEX_EMOTICON);
|
||||
}
|
||||
const editContent = createEditContent(this.model, editedEvent, this.replyToEvent);
|
||||
const newContent = editContent["m.new_content"];
|
||||
const newContent = editContent["m.new_content"]!;
|
||||
|
||||
let shouldSend = true;
|
||||
|
||||
|
@ -352,7 +359,7 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||
}
|
||||
|
||||
if (cmd.category === CommandCategories.messages || cmd.category === CommandCategories.effects) {
|
||||
editContent["m.new_content"] = content;
|
||||
editContent["m.new_content"] = content!;
|
||||
} else {
|
||||
shouldSend = false;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import {
|
|||
import { DebouncedFunc, throttle } from "lodash";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { Composer as ComposerEvent } from "@matrix-org/analytics-events/types/typescript/Composer";
|
||||
import { RoomMessageEventContent } from "matrix-js-sdk/src/types";
|
||||
|
||||
import dis from "../../../dispatcher/dispatcher";
|
||||
import EditorModel from "../../../editor/model";
|
||||
|
@ -183,7 +184,7 @@ export function createMessageContent(
|
|||
relation: IEventRelation | undefined,
|
||||
permalinkCreator?: RoomPermalinkCreator,
|
||||
includeReplyLegacyFallback = true,
|
||||
): IContent {
|
||||
): RoomMessageEventContent {
|
||||
const isEmote = containsEmote(model);
|
||||
if (isEmote) {
|
||||
model = stripEmoteCommand(model);
|
||||
|
@ -195,7 +196,7 @@ export function createMessageContent(
|
|||
|
||||
const body = textSerialize(model);
|
||||
|
||||
const content: IContent = {
|
||||
const content: RoomMessageEventContent = {
|
||||
msgtype: isEmote ? MsgType.Emote : MsgType.Text,
|
||||
body: body,
|
||||
};
|
||||
|
@ -432,7 +433,7 @@ export class SendMessageComposer extends React.Component<ISendMessageComposerPro
|
|||
MatrixClientPeg.safeGet().sendEvent(lastMessage.getRoomId()!, EventType.Reaction, {
|
||||
"m.relates_to": {
|
||||
rel_type: RelationType.Annotation,
|
||||
event_id: lastMessage.getId(),
|
||||
event_id: lastMessage.getId()!,
|
||||
key: reaction,
|
||||
},
|
||||
});
|
||||
|
@ -475,7 +476,7 @@ export class SendMessageComposer extends React.Component<ISendMessageComposerPro
|
|||
|
||||
const replyToEvent = this.props.replyToEvent;
|
||||
let shouldSend = true;
|
||||
let content: IContent | null = null;
|
||||
let content: RoomMessageEventContent | null = null;
|
||||
|
||||
if (!containsEmote(model) && isSlashCommand(this.model)) {
|
||||
const [cmd, args, commandText] = getSlashCommand(this.model);
|
||||
|
|
|
@ -16,6 +16,7 @@ limitations under the License.
|
|||
|
||||
import { richToPlain, plainToRich } from "@matrix-org/matrix-wysiwyg";
|
||||
import { IContent, IEventRelation, MatrixEvent, MsgType } from "matrix-js-sdk/src/matrix";
|
||||
import { ReplacementEvent, RoomMessageEventContent, RoomMessageTextEventContent } from "matrix-js-sdk/src/types";
|
||||
|
||||
import SettingsStore from "../../../../../settings/SettingsStore";
|
||||
import { parsePermalink, RoomPermalinkCreator } from "../../../../../utils/permalinks/Permalinks";
|
||||
|
@ -76,7 +77,7 @@ export async function createMessageContent(
|
|||
includeReplyLegacyFallback = true,
|
||||
editedEvent,
|
||||
}: CreateMessageContentParams,
|
||||
): Promise<IContent> {
|
||||
): Promise<RoomMessageEventContent> {
|
||||
const isEditing = isMatrixEvent(editedEvent);
|
||||
const isReply = isEditing ? Boolean(editedEvent.replyEventId) : isMatrixEvent(replyToEvent);
|
||||
const isReplyAndEditing = isEditing && isReply;
|
||||
|
@ -100,10 +101,10 @@ export async function createMessageContent(
|
|||
const bodyPrefix = (isReplyAndEditing && getTextReplyFallback(editedEvent)) || "";
|
||||
const formattedBodyPrefix = (isReplyAndEditing && getHtmlReplyFallback(editedEvent)) || "";
|
||||
|
||||
const content: IContent = {
|
||||
const content = {
|
||||
msgtype: isEmote ? MsgType.Emote : MsgType.Text,
|
||||
body: isEditing ? `${bodyPrefix} * ${body}` : body,
|
||||
};
|
||||
} as RoomMessageTextEventContent & ReplacementEvent<RoomMessageTextEventContent>;
|
||||
|
||||
// TODO markdown support
|
||||
|
||||
|
|
|
@ -14,18 +14,22 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { IContent } from "matrix-js-sdk/src/matrix";
|
||||
import { RoomMessageEventContent, RoomMessageTextEventContent } from "matrix-js-sdk/src/types";
|
||||
|
||||
import EditorStateTransfer from "../../../../../utils/EditorStateTransfer";
|
||||
|
||||
export function isContentModified(newContent: IContent, editorStateTransfer: EditorStateTransfer): boolean {
|
||||
export function isContentModified(
|
||||
newContent: RoomMessageEventContent,
|
||||
editorStateTransfer: EditorStateTransfer,
|
||||
): boolean {
|
||||
// if nothing has changed then bail
|
||||
const oldContent = editorStateTransfer.getEvent().getContent();
|
||||
const oldContent = editorStateTransfer.getEvent().getContent<RoomMessageEventContent>();
|
||||
if (
|
||||
oldContent["msgtype"] === newContent["msgtype"] &&
|
||||
oldContent["body"] === newContent["body"] &&
|
||||
oldContent["format"] === newContent["format"] &&
|
||||
oldContent["formatted_body"] === newContent["formatted_body"]
|
||||
(<RoomMessageTextEventContent>oldContent)["format"] === (<RoomMessageTextEventContent>newContent)["format"] &&
|
||||
(<RoomMessageTextEventContent>oldContent)["formatted_body"] ===
|
||||
(<RoomMessageTextEventContent>newContent)["formatted_body"]
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -16,13 +16,13 @@ limitations under the License.
|
|||
|
||||
import { Composer as ComposerEvent } from "@matrix-org/analytics-events/types/typescript/Composer";
|
||||
import {
|
||||
IContent,
|
||||
IEventRelation,
|
||||
MatrixEvent,
|
||||
ISendEventResponse,
|
||||
MatrixClient,
|
||||
THREAD_RELATION_TYPE,
|
||||
} from "matrix-js-sdk/src/matrix";
|
||||
import { RoomMessageEventContent } from "matrix-js-sdk/src/types";
|
||||
|
||||
import { PosthogAnalytics } from "../../../../../PosthogAnalytics";
|
||||
import SettingsStore from "../../../../../settings/SettingsStore";
|
||||
|
@ -82,7 +82,7 @@ export async function sendMessage(
|
|||
}*/
|
||||
PosthogAnalytics.instance.trackEvent<ComposerEvent>(posthogEvent);
|
||||
|
||||
let content: IContent | null = null;
|
||||
let content: RoomMessageEventContent | null = null;
|
||||
|
||||
// Slash command handling here approximates what can be found in SendMessageComposer.sendMessage()
|
||||
// but note that the /me and // special cases are handled by the call to createMessageContent
|
||||
|
@ -145,7 +145,7 @@ export async function sendMessage(
|
|||
|
||||
const prom = doMaybeLocalRoomAction(
|
||||
roomId,
|
||||
(actualRoomId: string) => mxClient.sendMessage(actualRoomId, threadId, content as IContent),
|
||||
(actualRoomId: string) => mxClient.sendMessage(actualRoomId, threadId, content!),
|
||||
mxClient,
|
||||
);
|
||||
|
||||
|
@ -218,7 +218,7 @@ export async function editMessage(
|
|||
this.editorRef.current?.replaceEmoticon(position, REGEX_EMOTICON);
|
||||
}*/
|
||||
const editContent = await createMessageContent(html, true, { editedEvent });
|
||||
const newContent = editContent["m.new_content"];
|
||||
const newContent = editContent["m.new_content"]!;
|
||||
|
||||
const shouldSend = true;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue