diff --git a/packages/chat/src/components/message.tsx b/packages/chat/src/components/message.tsx index e85d890..1bb0b43 100644 --- a/packages/chat/src/components/message.tsx +++ b/packages/chat/src/components/message.tsx @@ -3,54 +3,97 @@ import type { RawMessage } from "../values"; import Text from "@tensamin/markdown/text"; import { AlertTriangle } from "lucide-react"; -import { cn, Tooltip, TooltipContent, TooltipTrigger } from "@tensamin/ui"; -import { useIsMobile } from "@tensamin/ui"; +import { + Avatar, + AvatarFallback, + AvatarImage, + cn, + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@tensamin/ui"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@tensamin/ui"; +import Wrapper from "@tensamin/user/wrapper"; +import { useChat } from "../context"; function MessageComponent({ + grouped, message, }: { + grouped: boolean; message: RawMessage & { failed?: boolean; }; }) { - const isMobile = useIsMobile(); + const { userId } = useChat(); const actuallyFailed = message.failed && message.message_state === "awaiting"; return (
- {message.failed && message.message_state === "awaiting" && ( - - -

Failed to send message

-
- } /> -
- )} - + ( + <> + {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", + })} +

+
+ )} + +
+ + )} + />
} /> diff --git a/packages/chat/src/screen.tsx b/packages/chat/src/screen.tsx index a23760d..fe69542 100644 --- a/packages/chat/src/screen.tsx +++ b/packages/chat/src/screen.tsx @@ -435,7 +435,7 @@ export default function Screen() {
-
- This is the start of your conversation with{" "} +
+ Conversation start
@@ -481,6 +481,13 @@ export default function Screen() { return null; } + const lastMessage = messages[messageIndex - 1]; + const isGrouped = + lastMessage && + lastMessage.sent_by_self === message.sent_by_self && + Math.round(lastMessage.send_time / 10000) === + Math.round(message.send_time / 10000); + return (
- +
); })} @@ -509,17 +515,25 @@ export default function Screen() { className="pointer-events-none absolute left-0 top-0 -z-10 overflow-hidden opacity-0" style={{ width: scrollWidth > 0 ? `${scrollWidth}px` : "100%" }} > - {messages.map((message) => ( -
{ - setMeasurementRef(message.send_time, element); - }} - style={{ padding: "4px 0" }} - > - -
- ))} + {messages.map((message, messageIndex) => { + const lastMessage = messages[messageIndex - 1]; + const isGrouped = + lastMessage && + lastMessage.sent_by_self === message.sent_by_self && + Math.round(lastMessage.send_time / 10000) === + Math.round(message.send_time / 10000); + + return ( +
{ + setMeasurementRef(message.send_time, element); + }} + > + +
+ ); + })}
); diff --git a/packages/markdown/src/markdown.tsx b/packages/markdown/src/markdown.tsx index 59d0a6a..46ebb92 100644 --- a/packages/markdown/src/markdown.tsx +++ b/packages/markdown/src/markdown.tsx @@ -560,7 +560,7 @@ export function renderBlocks(blocks: MarkdownBlock[]): React.ReactElement { } return ( -

+

{block.text.split("\n").map((line, lineIndex) => ( {lineIndex > 0 ?
: null} @@ -645,7 +645,6 @@ export const markdownStyles = ` .tm-md-h4 { font-size: 1.1rem; } .tm-md-h5 { font-size: 1rem; } .tm-md-h6 { font-size: 0.95rem; opacity: 0.9; } -.tm-md-p { margin: 0.25rem 0; } .tm-md-blockquote { margin: 0.45rem 0; padding-left: 0.75rem; opacity: 0.95; } .tm-md-blockquote p { margin: 0.2rem 0; } .tm-md-pre { margin: 0.45rem 0; padding: 0.65rem 0.75rem; border-radius: 0.5rem; background: hsl(var(--muted)); overflow-x: auto; }