import { observer } from "mobx-react-lite"; import { Message as MessageObject } from "revolt.js"; import { useTriggerEvents } from "preact-context-menu"; import { memo } from "preact/compat"; import { useEffect, useState } from "preact/hooks"; import { Category } from "@revoltchat/ui"; import { internalEmit } from "../../../lib/eventEmitter"; import { isTouchscreenDevice } from "../../../lib/isTouchscreenDevice"; import { QueuedMessage } from "../../../mobx/stores/MessageQueue"; import { I18nError } from "../../../context/Locale"; import { modalController } from "../../../controllers/modals/ModalController"; import Markdown from "../../markdown/Markdown"; import UserIcon from "../user/UserIcon"; import { Username } from "../user/UserShort"; import MessageBase, { MessageContent, MessageDetail, MessageInfo, } from "./MessageBase"; import Attachment from "./attachments/Attachment"; import { MessageReply } from "./attachments/MessageReply"; import { Reactions } from "./attachments/Reactions"; import { MessageOverlayBar } from "./bars/MessageOverlayBar"; import Embed from "./embed/Embed"; import InviteList from "./embed/EmbedInvite"; import LinkPreview from "./embed/LinkPreview"; interface Props { attachContext?: boolean; queued?: QueuedMessage; message: MessageObject & { webhook: { name: string; avatar?: string } }; highlight?: boolean; contrast?: boolean; content?: Children; head?: boolean; hideReply?: boolean; } const Message = observer( ({ highlight, attachContext, message, contrast, content: replacement, head: preferHead, queued, hideReply, type_msg, }: Props) => { const client = message.client; const user = message.author; const content = message.content; const head = preferHead || (message.reply_ids && message.reply_ids.length > 0); const userContext = attachContext ? useTriggerEvents("Menu", { user: message.author_id, contextualChannel: message.channel_id, contextualMessage: message._id, // eslint-disable-next-line }) : undefined; const openProfile = () => modalController.push({ type: "user_profile", user_id: message.author_id, }); const handleUserClick = (e: MouseEvent) => { if (e.shiftKey && user?._id) { internalEmit( "MessageBox", "append", `<@${user._id}>`, "mention", ); } else { openProfile(); } }; // ! FIXME(?): animate on hover const [mouseHovering, setAnimate] = useState(false); const [reactionsOpen, setReactionsOpen] = useState(false); useEffect(() => setAnimate(false), [replacement]); return (