Files
ThreadNet-Web/apps/web/src/utils/EventRenderingUtils.ts
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

119 lines
4.5 KiB
TypeScript
Raw Normal View History

2022-03-24 15:54:06 -06:00
/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
2022-03-24 15:54:06 -06:00
Copyright 2022 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
2024-09-09 14:57:16 +01:00
Please see LICENSE files in the repository root for full details.
2022-03-24 15:54:06 -06:00
*/
import {
2025-02-05 13:25:06 +00:00
type MatrixEvent,
type IContent,
type MatrixClient,
EventType,
MsgType,
M_POLL_END,
M_POLL_START,
M_BEACON_INFO,
} from "matrix-js-sdk/src/matrix";
2022-03-24 15:54:06 -06:00
import SettingsStore from "../settings/SettingsStore";
import { haveRendererForEvent, JitsiEventFactory, JSONEventFactory, pickFactory } from "../events/EventTileFactory";
2022-05-10 17:39:28 +02:00
import { getMessageModerationState, isLocationEvent, MessageModerationState } from "./EventUtils";
import { ElementCallEventType } from "../call-types";
2022-12-29 11:03:24 +01:00
const calcIsInfoMessage = (
eventType: EventType | string,
content: IContent,
isBubbleMessage: boolean,
isLeftAlignedBubbleMessage: boolean,
): boolean => {
return (
!isBubbleMessage &&
!isLeftAlignedBubbleMessage &&
eventType !== EventType.RoomMessage &&
eventType !== EventType.RoomMessageEncrypted &&
eventType !== EventType.Sticker &&
eventType !== EventType.RoomCreate &&
eventType !== EventType.RTCNotification &&
2022-12-29 11:03:24 +01:00
!M_POLL_START.matches(eventType) &&
2023-02-08 10:12:39 +13:00
!M_POLL_END.matches(eventType) &&
!M_BEACON_INFO.matches(eventType)
2022-12-29 11:03:24 +01:00
);
};
2022-03-24 15:54:06 -06:00
export function getEventDisplayInfo(
matrixClient: MatrixClient,
mxEvent: MatrixEvent,
showHiddenEvents: boolean,
hideEvent?: boolean,
): {
2022-03-24 15:54:06 -06:00
isInfoMessage: boolean;
hasRenderer: boolean;
isBubbleMessage: boolean;
isLeftAlignedBubbleMessage: boolean;
noBubbleEvent: boolean;
isSeeingThroughMessageHiddenForModeration: boolean;
} {
const content = mxEvent.getContent();
const msgtype = content.msgtype;
const eventType = mxEvent.getType();
let isSeeingThroughMessageHiddenForModeration = false;
if (SettingsStore.getValue("feature_msc3531_hide_messages_pending_moderation")) {
switch (getMessageModerationState(mxEvent, matrixClient)) {
2022-03-24 15:54:06 -06:00
case MessageModerationState.VISIBLE_FOR_ALL:
case MessageModerationState.HIDDEN_TO_CURRENT_USER:
// Nothing specific to do here
break;
case MessageModerationState.SEE_THROUGH_FOR_CURRENT_USER:
// Show message with a marker.
isSeeingThroughMessageHiddenForModeration = true;
break;
}
}
let factory = pickFactory(mxEvent, matrixClient, showHiddenEvents);
2022-03-24 15:54:06 -06:00
// Info messages are basically information about commands processed on a room
let isBubbleMessage =
eventType === EventType.RTCNotification ||
2022-03-24 15:54:06 -06:00
eventType.startsWith("m.key.verification") ||
(eventType === EventType.RoomMessage && msgtype?.startsWith("m.key.verification")) ||
eventType === EventType.RoomCreate ||
eventType === EventType.RoomEncryption ||
factory === JitsiEventFactory;
const isLeftAlignedBubbleMessage =
!isBubbleMessage && (eventType === EventType.CallInvite || ElementCallEventType.matches(eventType));
2022-12-29 11:03:24 +01:00
let isInfoMessage = calcIsInfoMessage(eventType, content, isBubbleMessage, isLeftAlignedBubbleMessage);
2022-03-24 15:54:06 -06:00
// Some non-info messages want to be rendered in the appropriate bubble column but without the bubble background
const noBubbleEvent =
(eventType === EventType.RoomMessage && msgtype === MsgType.Emote) ||
M_POLL_START.matches(eventType) ||
M_BEACON_INFO.matches(eventType) ||
isLocationEvent(mxEvent);
2022-03-24 15:54:06 -06:00
// If we're showing hidden events in the timeline, we should use the
// source tile when there's no regular tile for an event and also for
// replace relations (which otherwise would display as a confusing
// duplicate of the thing they are replacing).
if (hideEvent || !haveRendererForEvent(mxEvent, matrixClient, showHiddenEvents)) {
// forcefully ask for a factory for a hidden event (hidden event setting is checked internally)
factory = pickFactory(mxEvent, matrixClient, showHiddenEvents, true);
2022-03-24 15:54:06 -06:00
if (factory === JSONEventFactory) {
isBubbleMessage = false;
// Reuse info message avatar and sender profile styling
isInfoMessage = true;
}
}
return {
hasRenderer: !!factory,
isInfoMessage,
isBubbleMessage,
isLeftAlignedBubbleMessage,
noBubbleEvent,
isSeeingThroughMessageHiddenForModeration,
};
}