Skip to content

Commit ffceb1c

Browse files
feat: #637 Live updates supports markdown (#684)
1 parent f1915b2 commit ffceb1c

File tree

9 files changed

+79
-44
lines changed

9 files changed

+79
-44
lines changed

packages/ragbits-chat/CHANGELOG.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
- Live updates support markdown (#684)
56
- Added custom styling for multiline and inline-code (#668)
67
- Changed toggling darkmode for tailwind class selector (#668)
78
- Loading indicator, delayed message buttons, integrated abort controller (#641)
@@ -140,7 +141,6 @@
140141

141142
## 0.9.0 (2025-02-25)
142143

143-
144144
### Changed
145145

146146
- ragbits-core updated to version v0.9.0
@@ -162,4 +162,3 @@
162162

163163
- Initial release of the package (#271).
164164
- Added last message recontextualization (#271).
165-

packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-B2jE9w2w.js renamed to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/FeedbackForm-CNnmBvHx.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import{aE as a,aF as e,aG as t}from"./index-fG0lDAUt.js";const n={renderer:t,...e,...a};var o=n;export{o as default};

packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-uZ3FrnOp.js renamed to packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-fG0lDAUt.js

Lines changed: 30 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/ragbits-chat/src/ragbits/chat/ui-build/assets/index-usobDMOl.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

packages/ragbits-chat/src/ragbits/chat/ui-build/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<link rel="icon" type="image/svg+xml" href="/assets/ragbits-9U4hpuUb.svg" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<title>Ragbits</title>
8-
<script type="module" crossorigin src="/assets/index-uZ3FrnOp.js"></script>
8+
<script type="module" crossorigin src="/assets/index-fG0lDAUt.js"></script>
99
<link rel="stylesheet" crossorigin href="/assets/index-Sq7Wkmt7.css">
1010
</head>
1111

typescript/ui/src/core/components/ChatMessage.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export type ChatMessageProps = {
1616
wrapper?: string;
1717
innerWrapper?: string;
1818
content?: string;
19+
liveUpdates?: string;
1920
};
2021
chatMessage: ChatMessageType;
2122
isLoading: boolean;
@@ -88,14 +89,17 @@ const ChatMessage = forwardRef<HTMLDivElement, ChatMessageProps>(
8889
<LiveUpdates
8990
isLoading={isLoading}
9091
liveUpdates={liveUpdates}
92+
classNames={{ liveUpdates: classNames?.liveUpdates }}
9193
/>
9294
{isLoading && !liveUpdates && (
9395
<>
9496
<Icon
9597
icon="heroicons:arrow-path"
9698
className="animate-spin"
9799
/>
98-
<span>Thinking...</span>
100+
<span>
101+
{content.length > 0 ? "Generating..." : "Thinking..."}
102+
</span>
99103
</>
100104
)}
101105
</div>

typescript/ui/src/core/components/LiveUpdates.tsx

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
import { useCallback, useState } from "react";
2-
import { ChatMessage } from "../../types/history";
3-
import { motion } from "framer-motion";
42
import { Icon } from "@iconify/react";
53
import { Button, cn } from "@heroui/react";
4+
import { motion } from "framer-motion";
5+
import Markdown from "react-markdown";
6+
import remarkGfm from "remark-gfm";
7+
8+
import { ChatMessage } from "../../types/history";
69
import ShimmerText from "./ShimmerText";
710

811
interface LiveUpdatesProps {
912
isLoading: boolean;
1013
liveUpdates: ChatMessage["liveUpdates"];
14+
classNames?: {
15+
liveUpdates?: string;
16+
};
1117
}
1218

1319
export default function LiveUpdates({
1420
isLoading,
1521
liveUpdates,
22+
classNames,
1623
}: LiveUpdatesProps) {
1724
const [isExpanded, setIsExpanded] = useState(false);
1825
const updates = liveUpdates ? Array.from(liveUpdates.values()) : null;
@@ -55,9 +62,15 @@ export default function LiveUpdates({
5562
style={{ pointerEvents: isExpanded ? "auto" : "none" }}
5663
>
5764
<div className="text-default-500">{update.label}</div>
58-
<div className="text-sm text-default-400">
65+
<Markdown
66+
className={cn(
67+
"markdown-container prose max-w-full text-sm text-default-400 dark:prose-invert",
68+
classNames?.liveUpdates,
69+
)}
70+
remarkPlugins={[remarkGfm]}
71+
>
5972
{update.description}
60-
</div>
73+
</Markdown>
6174
</motion.div>
6275
))}
6376
</div>
@@ -68,14 +81,28 @@ export default function LiveUpdates({
6881
{isLoading ? (
6982
<ShimmerText duration={shimmerDuration}>
7083
<div>{lastUpdate.label}</div>
71-
<div className="text-sm">{lastUpdate.description}</div>
84+
<Markdown
85+
className={cn(
86+
"markdown-container prose max-w-full text-sm text-transparent dark:prose-invert",
87+
classNames?.liveUpdates,
88+
)}
89+
remarkPlugins={[remarkGfm]}
90+
>
91+
{lastUpdate.description}
92+
</Markdown>
7293
</ShimmerText>
7394
) : (
7495
<>
7596
<div className="text-default-500">{lastUpdate.label}</div>
76-
<div className="text-sm text-default-400">
97+
<Markdown
98+
className={cn(
99+
"markdown-container prose max-w-full text-sm text-default-400 dark:prose-invert",
100+
classNames?.liveUpdates,
101+
)}
102+
remarkPlugins={[remarkGfm]}
103+
>
77104
{lastUpdate.description}
78-
</div>
105+
</Markdown>
79106
</>
80107
)}
81108
</div>

typescript/ui/src/core/components/ShimmerText.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* Note: Children components should have `text-transparent` class applied for
3+
* the shimmer effect to be displayed correctly.
4+
*/
5+
16
import { cn } from "@heroui/react";
27
import { motion } from "framer-motion";
38
import { PropsWithChildren } from "react";

0 commit comments

Comments
 (0)