Handle command completions in RTE (#10521)
* pass handleCommand prop down and use it in WysiwygAutocomplete * allow a command to generate a query from buildQuery * port command functionality into the sendMessage util * tidy up comments * remove use of shouldSend and update comments * remove console log * make logic more explicit and amend comment * uncomment replyToEvent block * update util test * remove commented out test * use local text over import from current composer * expand tests * expand tests * handle the FocusAComposer action for the wysiwyg composer * remove TODO comment * remove TODO * test for action dispatch * fix failing tests * tidy up tests * fix TS error and improve typing * fix TS error * amend return types for sendMessage, editMessage * fix null content TS error * fix another null content TS error * use as to correct final TS error * remove undefined argument * try to fix TS errors for editMessage function usage * tidy up * add TODO * improve comments * update comment
This commit is contained in:
parent
7ef7ccb55f
commit
3fa6f8cbf0
10 changed files with 268 additions and 31 deletions
|
@ -15,7 +15,7 @@ limitations under the License.
|
|||
*/
|
||||
|
||||
import { Composer as ComposerEvent } from "@matrix-org/analytics-events/types/typescript/Composer";
|
||||
import { IEventRelation, MatrixEvent } from "matrix-js-sdk/src/models/event";
|
||||
import { IContent, IEventRelation, MatrixEvent } from "matrix-js-sdk/src/models/event";
|
||||
import { ISendEventResponse, MatrixClient } from "matrix-js-sdk/src/matrix";
|
||||
import { THREAD_RELATION_TYPE } from "matrix-js-sdk/src/models/thread";
|
||||
|
||||
|
@ -33,6 +33,11 @@ import { endEditing, cancelPreviousPendingEdit } from "./editing";
|
|||
import EditorStateTransfer from "../../../../../utils/EditorStateTransfer";
|
||||
import { createMessageContent } from "./createMessageContent";
|
||||
import { isContentModified } from "./isContentModified";
|
||||
import { CommandCategories, getCommand } from "../../../../../SlashCommands";
|
||||
import { runSlashCommand, shouldSendAnyway } from "../../../../../editor/commands";
|
||||
import { Action } from "../../../../../dispatcher/actions";
|
||||
import { addReplyToMessageContent } from "../../../../../utils/Reply";
|
||||
import { attachRelation } from "../../SendMessageComposer";
|
||||
|
||||
export interface SendMessageParams {
|
||||
mxClient: MatrixClient;
|
||||
|
@ -47,8 +52,8 @@ export async function sendMessage(
|
|||
message: string,
|
||||
isHTML: boolean,
|
||||
{ roomContext, mxClient, ...params }: SendMessageParams,
|
||||
): Promise<ISendEventResponse> {
|
||||
const { relation, replyToEvent } = params;
|
||||
): Promise<ISendEventResponse | undefined> {
|
||||
const { relation, replyToEvent, permalinkCreator } = params;
|
||||
const { room } = roomContext;
|
||||
const roomId = room?.roomId;
|
||||
|
||||
|
@ -71,9 +76,51 @@ export async function sendMessage(
|
|||
}*/
|
||||
PosthogAnalytics.instance.trackEvent<ComposerEvent>(posthogEvent);
|
||||
|
||||
const content = await createMessageContent(message, isHTML, params);
|
||||
let content: IContent | null = null;
|
||||
|
||||
// TODO slash comment
|
||||
// Functionality here approximates what can be found in SendMessageComposer.sendMessage()
|
||||
if (message.startsWith("/") && !message.startsWith("//")) {
|
||||
const { cmd, args } = getCommand(message);
|
||||
if (cmd) {
|
||||
// TODO handle /me special case separately, see end of SlashCommands.Commands
|
||||
const threadId = relation?.rel_type === THREAD_RELATION_TYPE.name ? relation?.event_id : null;
|
||||
let commandSuccessful: boolean;
|
||||
[content, commandSuccessful] = await runSlashCommand(cmd, args, roomId, threadId ?? null);
|
||||
|
||||
if (!commandSuccessful) {
|
||||
return; // errored
|
||||
}
|
||||
|
||||
if (
|
||||
content &&
|
||||
(cmd.category === CommandCategories.messages || cmd.category === CommandCategories.effects)
|
||||
) {
|
||||
attachRelation(content, relation);
|
||||
if (replyToEvent) {
|
||||
addReplyToMessageContent(content, replyToEvent, {
|
||||
permalinkCreator,
|
||||
// Exclude the legacy fallback for custom event types such as those used by /fireworks
|
||||
includeLegacyFallback: content.msgtype?.startsWith("m.") ?? true,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// instead of setting shouldSend to false as in SendMessageComposer, just return
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
const sendAnyway = await shouldSendAnyway(message);
|
||||
// re-focus the composer after QuestionDialog is closed
|
||||
dis.dispatch({
|
||||
action: Action.FocusAComposer,
|
||||
context: roomContext.timelineRenderingType,
|
||||
});
|
||||
// if !sendAnyway bail to let the user edit the composer and try again
|
||||
if (!sendAnyway) return;
|
||||
}
|
||||
}
|
||||
|
||||
// if content is null, we haven't done any slash command processing, so generate some content
|
||||
content ??= await createMessageContent(message, isHTML, params);
|
||||
|
||||
// TODO replace emotion end of message ?
|
||||
|
||||
|
@ -92,7 +139,7 @@ export async function sendMessage(
|
|||
|
||||
const prom = doMaybeLocalRoomAction(
|
||||
roomId,
|
||||
(actualRoomId: string) => mxClient.sendMessage(actualRoomId, threadId, content),
|
||||
(actualRoomId: string) => mxClient.sendMessage(actualRoomId, threadId, content as IContent),
|
||||
mxClient,
|
||||
);
|
||||
|
||||
|
@ -108,7 +155,7 @@ export async function sendMessage(
|
|||
|
||||
dis.dispatch({ action: "message_sent" });
|
||||
CHAT_EFFECTS.forEach((effect) => {
|
||||
if (containsEmoji(content, effect.emojis)) {
|
||||
if (content && containsEmoji(content, effect.emojis)) {
|
||||
// For initial threads launch, chat effects are disabled
|
||||
// see #19731
|
||||
const isNotThread = relation?.rel_type !== THREAD_RELATION_TYPE.name;
|
||||
|
@ -146,7 +193,7 @@ interface EditMessageParams {
|
|||
export async function editMessage(
|
||||
html: string,
|
||||
{ roomContext, mxClient, editorStateTransfer }: EditMessageParams,
|
||||
): Promise<ISendEventResponse> {
|
||||
): Promise<ISendEventResponse | undefined> {
|
||||
const editedEvent = editorStateTransfer.getEvent();
|
||||
|
||||
PosthogAnalytics.instance.trackEvent<ComposerEvent>({
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue