// gomuks - A Matrix client written in Go. // Copyright (C) 2024 Tulir Asokan // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import React from "react" import { getAvatarURL } from "../../api/media.ts" import { RoomStateStore } from "../../api/statestore.ts" import { MemDBEvent, MemberEventContent } from "../../api/types" import EncryptedBody from "./content/EncryptedBody.tsx" import HiddenEvent from "./content/HiddenEvent.tsx" import MessageBody from "./content/MessageBody.tsx" import RedactedBody from "./content/RedactedBody.tsx" import { EventContentProps } from "./content/props.ts" import "./TimelineEvent.css" export interface TimelineEventProps { room: RoomStateStore evt: MemDBEvent } function getBodyType(evt: MemDBEvent): React.FunctionComponent { if (evt.relation_type === "m.replace") { return HiddenEvent } switch (evt.type) { case "m.room.message": case "m.sticker": if (evt.redacted_by) { return RedactedBody } return MessageBody case "m.room.encrypted": if (evt.redacted_by) { return RedactedBody } return EncryptedBody } return HiddenEvent } const fullTimeFormatter = new Intl.DateTimeFormat("en-GB", { dateStyle: "full", timeStyle: "medium" }) const formatShortTime = (time: Date) => `${time.getHours().toString().padStart(2, "0")}:${time.getMinutes().toString().padStart(2, "0")}` const EventReactions = ({ reactions }: { reactions: Record }) => { return
{Object.entries(reactions).map(([reaction, count]) => {reaction} {count} )}
} const TimelineEvent = ({ room, evt }: TimelineEventProps) => { const memberEvt = room.getStateEvent("m.room.member", evt.sender) const memberEvtContent = memberEvt?.content as MemberEventContent | undefined const BodyType = getBodyType(evt) const eventTS = new Date(evt.timestamp) const editEventTS = evt.last_edit ? new Date(evt.last_edit.timestamp) : null return
{memberEvtContent?.displayname ?? evt.sender} {formatShortTime(eventTS)} {editEventTS ? (edited at {formatShortTime(editEventTS)}) : null}
{evt.reactions ? : null}
} export default TimelineEvent