claude-code-cchui/src/components/features/SummaryGenerator/SummaryButton.tsx
gaoziman 0938f4fbd2 feat(组件): 添加智能摘要 UI 组件
- SummaryButton: 摘要入口按钮,支持已生成状态展示
- SummaryOptions: 摘要选项配置面板 (长度/风格选择)
- SummaryContent: 摘要内容展示组件,支持 Markdown 渲染
- SummaryModal: 摘要模态框,集成选项配置和内容展示
2025-12-28 01:30:47 +08:00

70 lines
1.8 KiB
TypeScript

'use client';
import { useState } from 'react';
import { Sparkles } from 'lucide-react';
import { SummaryModal } from './SummaryModal';
import type { SummaryMessage } from './types';
import { Tooltip } from '@/components/ui/Tooltip';
interface SummaryButtonProps {
conversationId: string;
messages: SummaryMessage[];
hasSummary?: boolean;
existingSummary?: string | null;
onSummaryGenerated?: (summary: string) => void;
className?: string;
}
/**
* 智能摘要触发按钮
* 集成到对话头部
*/
export function SummaryButton({
conversationId,
messages,
hasSummary = false,
existingSummary,
onSummaryGenerated,
className = '',
}: SummaryButtonProps) {
const [isModalOpen, setIsModalOpen] = useState(false);
const handleClick = () => {
setIsModalOpen(true);
};
const handleClose = () => {
setIsModalOpen(false);
};
return (
<>
<Tooltip content="智能摘要" position="bottom">
<button
type="button"
onClick={handleClick}
className={`relative p-2 rounded text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-secondary)] hover:text-[var(--color-primary)] transition-all duration-150 ${className}`}
aria-label="生成智能摘要"
>
<Sparkles size={18} />
{/* 已有摘要指示器 */}
{hasSummary && (
<span className="absolute top-1 right-1 w-2 h-2 bg-[var(--color-primary)] rounded-full border-2 border-[var(--color-bg-primary)] animate-pulse" />
)}
</button>
</Tooltip>
{/* 摘要 Modal */}
<SummaryModal
isOpen={isModalOpen}
onClose={handleClose}
conversationId={conversationId}
messages={messages}
existingSummary={existingSummary}
onSummaryGenerated={onSummaryGenerated}
/>
</>
);
}