diff --git a/src/components/Chat.tsx b/src/components/Chat.tsx index cba8e27..da126c7 100644 --- a/src/components/Chat.tsx +++ b/src/components/Chat.tsx @@ -3,12 +3,13 @@ import { ChatMessageComponent } from './ChatMessage'; import { ChatInput } from './ChatInput'; import { TypingIndicator } from './TypingIndicator'; import type { ChatMessage, ConnectionStatus } from '../types'; -import { Bot, ArrowDown, Loader2, ChevronsDownUp, ChevronsUpDown, Sparkles, Bookmark } from 'lucide-react'; +import { Bot, ArrowDown, Loader2, ChevronsDownUp, ChevronsUpDown, Sparkles, Bookmark, Download } from 'lucide-react'; import { MessageSearch } from './MessageSearch'; import { useT } from '../hooks/useLocale'; import { getLocale, type TranslationKey } from '../lib/i18n'; import { useToolCollapse } from '../hooks/useToolCollapse'; import { useBookmarks } from '../hooks/useBookmarks'; +import { exportAsMarkdown, downloadFile } from '../lib/exportConversation'; interface Props { messages: ChatMessage[]; @@ -208,6 +209,13 @@ export function Chat({ messages, isGenerating, isLoadingHistory, status, session const [showBookmarks, setShowBookmarks] = useState(false); const hasToolCalls = useMemo(() => messages.some(m => m.blocks.some(b => b.type === 'tool_use' || b.type === 'tool_result')), [messages]); + const handleExport = useCallback(() => { + const label = sessionKey?.replace(/^agent:[^:]+:/, '') || 'conversation'; + const md = exportAsMarkdown(messages, label); + const safeLabel = label.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 40); + downloadFile(md, `${safeLabel}-${new Date().toISOString().slice(0, 10)}.md`); + }, [messages, sessionKey]); + // Message search const [searchOpen, setSearchOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(''); @@ -358,7 +366,7 @@ export function Chat({ messages, isGenerating, isLoadingHistory, status, session )} {/* Floating action buttons — sticky to bottom of scroll area */} - {(hasToolCalls || showScrollBtn || newMessageCount > 0) && ( + {(hasToolCalls || messages.length > 0 || showScrollBtn || newMessageCount > 0) && (
{hasToolCalls && ( @@ -382,6 +390,16 @@ export function Chat({ messages, isGenerating, isLoadingHistory, status, session {sessionBookmarks.length} )} + {messages.length > 0 && ( + + )} {(showScrollBtn || newMessageCount > 0) && (