From 62966473f07748e4aa98ee0b9557029c4babdc09 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Fri, 28 Nov 2025 17:37:30 +0100 Subject: [PATCH] Add support for more file formats --- matrixgw_frontend/src/api/WsApi.ts | 3 +- .../src/api/matrix/MatrixApiEvent.ts | 10 +++- .../src/utils/RoomEventsManager.ts | 7 ++- .../src/widgets/messages/RoomMessagesList.tsx | 54 +++++++++++++++++-- 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/matrixgw_frontend/src/api/WsApi.ts b/matrixgw_frontend/src/api/WsApi.ts index 04889be..23eb2f3 100644 --- a/matrixgw_frontend/src/api/WsApi.ts +++ b/matrixgw_frontend/src/api/WsApi.ts @@ -1,4 +1,5 @@ import { APIClient } from "./ApiClient"; +import type { MessageType } from "./matrix/MatrixApiEvent"; interface BaseRoomEvent { time: number; @@ -8,8 +9,6 @@ interface BaseRoomEvent { origin_server_ts: number; } -type MessageType = "m.text" | "m.image" | string; - export interface RoomMessageEvent extends BaseRoomEvent { type: "RoomMessageEvent"; data: { diff --git a/matrixgw_frontend/src/api/matrix/MatrixApiEvent.ts b/matrixgw_frontend/src/api/matrix/MatrixApiEvent.ts index 98d5404..f3d81f9 100644 --- a/matrixgw_frontend/src/api/matrix/MatrixApiEvent.ts +++ b/matrixgw_frontend/src/api/matrix/MatrixApiEvent.ts @@ -1,11 +1,19 @@ import { APIClient } from "../ApiClient"; import type { Room } from "./MatrixApiRoom"; +export type MessageType = + | "m.text" + | "m.image" + | "m.audio" + | "m.file" + | "m.video" + | "_OTHER_"; + export interface MatrixRoomMessage { type: "m.room.message"; content: { body: string; - msgtype: "m.text" | "m.image" | string; + msgtype: MessageType; "m.relates_to"?: { event_id: string; rel_type: "m.replace" | string; diff --git a/matrixgw_frontend/src/utils/RoomEventsManager.ts b/matrixgw_frontend/src/utils/RoomEventsManager.ts index 62db024..1598c95 100644 --- a/matrixgw_frontend/src/utils/RoomEventsManager.ts +++ b/matrixgw_frontend/src/utils/RoomEventsManager.ts @@ -3,6 +3,7 @@ import type { MatrixEvent, MatrixEventData, MatrixEventsList, + MessageType, } from "../api/matrix/MatrixApiEvent"; import type { Room } from "../api/matrix/MatrixApiRoom"; import type { WsMessage } from "../api/WsApi"; @@ -21,7 +22,8 @@ export interface Message { modified: boolean; reactions: Map; content: string; - image?: string; + type: MessageType; + file?: string; } export class RoomEventsManager { @@ -141,7 +143,8 @@ export class RoomEventsManager { reactions: new Map(), time_sent: evt.time, time_sent_dayjs: dayjs.unix(evt.time / 1000), - image: data.content.file?.url ?? data.content.url, + type: data.content.msgtype, + file: data.content.file?.url ?? data.content.url, content: data.content.body, }); } diff --git a/matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx b/matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx index d7b0b0f..7658c2f 100644 --- a/matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx +++ b/matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx @@ -1,6 +1,7 @@ import AddReactionIcon from "@mui/icons-material/AddReaction"; import DeleteIcon from "@mui/icons-material/Delete"; import EditIcon from "@mui/icons-material/Edit"; +import DownloadIcon from "@mui/icons-material/Download"; import { Box, Button, @@ -220,7 +221,8 @@ function RoomMessage(p: { {/** Message itself */}
- {p.message.image ? ( + {/* Image */} + {p.message.type === "m.image" && ( setShowImageFullScreen(true)} src={MatrixApiEvent.GetEventFileURL( @@ -232,9 +234,53 @@ function RoomMessage(p: { maxWidth: "200px", }} /> - ) : ( - p.message.content )} + + {/* Audio */} + {p.message.type === "m.audio" && ( + + )} + + {/* Video */} + {p.message.type === "m.video" && ( + + )} + + {/* File */} + {p.message.type === "m.file" && ( + + + + )} + + {/* Text message */} + {p.message.type === "m.text" && p.message.content}
{/* Edit text message */} {p.message.account === user.info.matrix_user_id && - !p.message.image && ( + !p.message.file && (