/** * ConversationExport - Dropdown button for exporting chat sessions * * Small download icon button with a dropdown offering Markdown, JSON, * and Plain Text export formats. */ import { Download, FileJson, FileText, FileType } from 'lucide-react'; import React, { useCallback } from 'react'; import { useI18n } from '../../application/i18n/I18nProvider'; import type { AISession } from '../../infrastructure/ai/types'; import { Button } from '../ui/button'; import { Dropdown, DropdownContent, DropdownTrigger, } from '../ui/dropdown'; import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'; interface ConversationExportProps { session: AISession | null; onExport: (format: 'md' | 'json' | 'txt') => void; className?: string; } const EXPORT_OPTIONS = [ { format: 'md' as const, labelKey: 'ai.chat.exportMarkdown' as const, icon: FileText }, { format: 'json' as const, labelKey: 'ai.chat.exportJSON' as const, icon: FileJson }, { format: 'txt' as const, labelKey: 'ai.chat.exportPlainText' as const, icon: FileType }, ]; const ConversationExport: React.FC = ({ session, onExport, className, }) => { const { t } = useI18n(); const handleExport = useCallback( (format: 'md' | 'json' | 'txt') => { onExport(format); }, [onExport], ); const hasMessages = session && session.messages.length > 0; return ( {t('ai.chat.exportConversation')}
{t('ai.chat.exportAs')}
{EXPORT_OPTIONS.map(({ format, labelKey, icon: Icon }) => ( ))}
); }; export default React.memo(ConversationExport);