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; }