import { useCrypto } from "@tensamin/crypto/context"; import * as React from "react"; import { useChat } from "../context"; import type { RawMessage } from "../values"; import { log } from "@tensamin/shared/log"; import Text from "@tensamin/markdown/text"; import { AlertTriangle, Clock } from "lucide-react"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@tensamin/ui/cmp/tooltip"; import { useIsMobile } from "@tensamin/ui/utils"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@tensamin/ui/cmp/context-menu"; function generateFixedLoadingSize(size: number, height: number) { return size * 3 - (height / 20) * 11; } /** * Executes Message. * @param props Parameter props. * @returns unknown. */ function MessageComponent(props: { message: RawMessage & { failed?: boolean; }; notEncrypted?: boolean; measureRef?: React.Ref; }) { const { sharedSecret } = useChat(); const { decrypt } = useCrypto(); const isMobile = useIsMobile(); const [decodedContent, setDecodedContent] = React.useState(""); const [isReady, setIsReady] = React.useState(false); React.useEffect(() => { if (props.notEncrypted) { setDecodedContent(props.message.content); setIsReady(true); return; } const content = props.message.content; const secret = sharedSecret; let active = true; if (!secret) { setIsReady(false); return; } decrypt(secret, content) .then((value) => { if (!active) { return; } setDecodedContent(value); setIsReady(true); }) .catch((e) => { if (!active) { return; } log(0, "Chat", "red", "Failed to decrypt message", e, { content, secret, }); setDecodedContent("Failed to decrypt"); setIsReady(true); }); return () => { active = false; }; }, [decrypt, props.message.content, props.notEncrypted, sharedSecret]); return (
{props.message.failed && props.message.message_state === "awaiting" && (

Failed to send message

} />
)} {!props.message.failed && props.message.message_state === "awaiting" && ( )} {isReady ? ( ) : (
)}
} />
); } export default React.memo(MessageComponent, (prev, next) => { return ( prev.notEncrypted === next.notEncrypted && prev.measureRef === next.measureRef && prev.message.timestamp === next.message.timestamp && 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 ); });