diff --git a/web/src/ui/timeline/content/index.ts b/web/src/ui/timeline/content/index.ts index 221c6bd..6f91230 100644 --- a/web/src/ui/timeline/content/index.ts +++ b/web/src/ui/timeline/content/index.ts @@ -38,62 +38,73 @@ export function getBodyType(evt: MemDBEvent, forReply = false): React.FunctionCo if (evt.relation_type === "m.replace") { return HiddenEvent } - switch (evt.type) { - case "m.room.message": - if (evt.redacted_by) { - return RedactedBody + if (evt.state_key === "") { + // State events which must have an empty state key + switch (evt.type) { + case "m.room.name": + return RoomNameBody + case "m.room.avatar": + return RoomAvatarBody + case "m.room.pinned_events": + return PinnedEventsBody + case "m.room.power_levels": + return PowerLevelBody } - switch (evt.content?.msgtype) { - case "m.text": - case "m.notice": - case "m.emote": - return TextMessageBody - case "m.image": - case "m.video": - case "m.audio": - case "m.file": - if (forReply) { + } else if (evt.state_key !== undefined) { + // State events which must have a non-empty state key + switch (evt.type) { + case "m.room.member": + return MemberBody + case "m.room.server_acl": + return ACLBody + case "m.policy.rule.user": + return PolicyRuleBody + case "m.policy.rule.room": + return PolicyRuleBody + case "m.policy.rule.server": + return PolicyRuleBody + } + } else { + // Non-state events + switch (evt.type) { + case "m.room.message": + if (evt.redacted_by) { + return RedactedBody + } + switch (evt.content?.msgtype) { + case "m.text": + case "m.notice": + case "m.emote": + return TextMessageBody + case "m.image": + case "m.video": + case "m.audio": + case "m.file": + if (forReply) { + return TextMessageBody + } + return MediaMessageBody + case "m.location": + if (forReply) { + return TextMessageBody + } + return LocationMessageBody + default: + return UnknownMessageBody + } + case "m.sticker": + if (evt.redacted_by) { + return RedactedBody + } else if (forReply) { return TextMessageBody } return MediaMessageBody - case "m.location": - if (forReply) { - return TextMessageBody + case "m.room.encrypted": + if (evt.redacted_by) { + return RedactedBody } - return LocationMessageBody - default: - return UnknownMessageBody + return EncryptedBody } - case "m.sticker": - if (evt.redacted_by) { - return RedactedBody - } else if (forReply) { - return TextMessageBody - } - return MediaMessageBody - case "m.room.encrypted": - if (evt.redacted_by) { - return RedactedBody - } - return EncryptedBody - case "m.room.member": - return MemberBody - case "m.room.name": - return RoomNameBody - case "m.room.avatar": - return RoomAvatarBody - case "m.room.server_acl": - return ACLBody - case "m.policy.rule.user": - return PolicyRuleBody - case "m.policy.rule.room": - return PolicyRuleBody - case "m.policy.rule.server": - return PolicyRuleBody - case "m.room.pinned_events": - return PinnedEventsBody - case "m.room.power_levels": - return PowerLevelBody } return HiddenEvent }