import * as React from "react"; import type { RawMessage } from "../values"; import Text from "@tensamin/markdown/text"; import { AlertTriangle } from "lucide-react"; import { useEffect, useState } from "react"; import type { User } from "@tensamin/user/context"; import { Avatar, AvatarFallback, AvatarImage, cn, Tooltip, TooltipContent, TooltipTrigger, } from "@tensamin/ui"; import MessageContextMenu from "./messageContextMenu"; import Media from "./media"; function MessageComponent({ grouped, message, user, }: { grouped: boolean; message: RawMessage & { failed?: boolean; }; user: User | null; }) { const actuallyFailed = message.failed && message.message_state === "awaiting"; const [hasFadedIn, setHasFadedIn] = useState(false); const opacityClass = !hasFadedIn ? "opacity-0" : actuallyFailed || message.message_state === "awaiting" ? "opacity-50" : "opacity-100"; const [isValidURL, setIsValidURL] = useState(false); useEffect(() => { const timeout = window.setTimeout(() => { setHasFadedIn(true); }, 100); return () => { window.clearTimeout(timeout); }; }, []); useEffect(() => { try { if (message.content.split(" ").length > 1) throw new Error(); new URL(message.content); setIsValidURL(true); } catch { setIsValidURL(false); } }, [message.content]); return (
{user ? ( <> {grouped ? (

{new Date(message.send_time).toLocaleString([], { hour: "2-digit", minute: "2-digit", })}

) : ( {user.display.slice(0, 2).toUpperCase()} )} {message.failed && message.message_state === "awaiting" && (

Failed to send message

} />
)}
{!grouped && (

{user.display}

{new Date(message.send_time).toLocaleString([], { hour: "2-digit", minute: "2-digit", })}

)} {isValidURL ? ( ) : ( )}
) : ( "Loading" )}
); } export default React.memo(MessageComponent, (prev, next) => { return ( prev.message.send_time === next.message.send_time && prev.message.content === next.message.content && prev.message.height === next.message.height && prev.message.sent_by_self === next.message.sent_by_self && prev.message.message_state === next.message.message_state && prev.message.failed === next.message.failed && prev.grouped === next.grouped && prev.user === next.user ); });