Start to display messages list
This commit is contained in:
@@ -12,7 +12,8 @@ export interface MessageReaction {
|
|||||||
|
|
||||||
export interface Message {
|
export interface Message {
|
||||||
event_id: string;
|
event_id: string;
|
||||||
sent: number;
|
account: string;
|
||||||
|
time_sent: number;
|
||||||
modified: boolean;
|
modified: boolean;
|
||||||
reactions: MessageReaction[];
|
reactions: MessageReaction[];
|
||||||
content: string;
|
content: string;
|
||||||
@@ -75,9 +76,10 @@ export class RoomEventsManager {
|
|||||||
|
|
||||||
this.messages.push({
|
this.messages.push({
|
||||||
event_id: evt.id,
|
event_id: evt.id,
|
||||||
|
account: evt.sender,
|
||||||
modified: false,
|
modified: false,
|
||||||
reactions: [],
|
reactions: [],
|
||||||
sent: evt.time,
|
time_sent: evt.time,
|
||||||
image: data.content.file?.url,
|
image: data.content.file?.url,
|
||||||
content: data.content.body,
|
content: data.content.body,
|
||||||
});
|
});
|
||||||
|
|||||||
15
matrixgw_frontend/src/widgets/messages/AccountIcon.tsx
Normal file
15
matrixgw_frontend/src/widgets/messages/AccountIcon.tsx
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { Avatar } from "@mui/material";
|
||||||
|
import type { UserProfile } from "../../api/matrix/MatrixApiProfile";
|
||||||
|
import { MatrixApiMedia } from "../../api/matrix/MatrixApiMedia";
|
||||||
|
|
||||||
|
export function AccountIcon(p: { user: UserProfile }): React.ReactElement {
|
||||||
|
return (
|
||||||
|
<Avatar
|
||||||
|
src={
|
||||||
|
p.user.avatar ? MatrixApiMedia.MediaURL(p.user.avatar, true) : undefined
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{p.user.display_name?.slice(0, 1)}
|
||||||
|
</Avatar>
|
||||||
|
);
|
||||||
|
}
|
||||||
61
matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx
Normal file
61
matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import dayjs from "dayjs";
|
||||||
|
import type { UsersMap } from "../../api/matrix/MatrixApiProfile";
|
||||||
|
import type { Message, RoomEventsManager } from "../../utils/RoomEventsManager";
|
||||||
|
import { AccountIcon } from "./AccountIcon";
|
||||||
|
import { MatrixApiMedia } from "../../api/matrix/MatrixApiMedia";
|
||||||
|
|
||||||
|
export function RoomMessagesList(p: {
|
||||||
|
users: UsersMap;
|
||||||
|
mgr: RoomEventsManager;
|
||||||
|
}): React.ReactElement {
|
||||||
|
return (
|
||||||
|
<div style={{ flex: 1, width: "100%" }}>
|
||||||
|
{p.mgr.messages.map((m, idx) => (
|
||||||
|
<RoomMessage
|
||||||
|
key={m.event_id}
|
||||||
|
{...p}
|
||||||
|
message={m}
|
||||||
|
previousFromSamePerson={
|
||||||
|
idx > 0 &&
|
||||||
|
p.mgr.messages[idx - 1].account === m.account &&
|
||||||
|
m.time_sent - p.mgr.messages[idx - 1].time_sent < 60 * 3 * 1000
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function RoomMessage(p: {
|
||||||
|
users: UsersMap;
|
||||||
|
message: Message;
|
||||||
|
previousFromSamePerson: boolean;
|
||||||
|
}): React.ReactElement {
|
||||||
|
const user = p.users.get(p.message.account);
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{!p.previousFromSamePerson && user && (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "row",
|
||||||
|
alignItems: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<AccountIcon user={user} />
|
||||||
|
|
||||||
|
{user.display_name}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{dayjs.unix(p.message.time_sent / 1000).format("HH:mm")}{" "}
|
||||||
|
{p.message.image ? (
|
||||||
|
<img src={MatrixApiMedia.MediaURL(p.message.image, true)} />
|
||||||
|
) : (
|
||||||
|
p.message.content
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import type { UsersMap } from "../../api/matrix/MatrixApiProfile";
|
|||||||
import type { Room } from "../../api/matrix/MatrixApiRoom";
|
import type { Room } from "../../api/matrix/MatrixApiRoom";
|
||||||
import { RoomEventsManager } from "../../utils/RoomEventsManager";
|
import { RoomEventsManager } from "../../utils/RoomEventsManager";
|
||||||
import { AsyncWidget } from "../AsyncWidget";
|
import { AsyncWidget } from "../AsyncWidget";
|
||||||
|
import { RoomMessagesList } from "./RoomMessagesList";
|
||||||
|
|
||||||
export function RoomWidget(p: {
|
export function RoomWidget(p: {
|
||||||
room: Room;
|
room: Room;
|
||||||
@@ -24,7 +25,12 @@ export function RoomWidget(p: {
|
|||||||
ready={!!roomMgr}
|
ready={!!roomMgr}
|
||||||
load={load}
|
load={load}
|
||||||
errMsg="Failed to load room!"
|
errMsg="Failed to load room!"
|
||||||
build={() => <>room</>}
|
build={() => (
|
||||||
|
<div style={{ display: "flex", flexDirection: "column", flex: 1 }}>
|
||||||
|
<RoomMessagesList mgr={roomMgr!} {...p} />
|
||||||
|
<div>Send message form</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user