"use client" import { useState, useRef, useEffect } from "react" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Copy, RotateCw, ThumbsUp, ThumbsDown, Share2, Download, Edit, MoreVertical, Check, X, FileText, Image, Link2 } from "lucide-react" import type { Message } from "./types" interface MessageActionsProps { message: Message onCopy: (content: string) => void onRegenerate: (messageId: string) => void onFeedback: (messageId: string, type: "like" | "dislike") => void onShare: (message: Message) => void onGeneratePDF?: (messageId: string) => void onGenerateWord?: (messageId: string) => void onEdit?: (message: Message) => void className?: string showFeedback?: boolean compact?: boolean } interface ActionButtonProps { icon: React.ReactNode label: string onClick: () => void variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" className?: string isActive?: boolean } function ActionButton({ icon, label, onClick, variant = "ghost", className, isActive }: ActionButtonProps) { return ( ) } export function MessageActions({ message, onCopy, onRegenerate, onFeedback, onShare, onGeneratePDF, onGenerateWord, onEdit, className, showFeedback = true, compact = false }: MessageActionsProps) { const [hasCopied, setHasCopied] = useState(false) const [showMenu, setShowMenu] = useState(false) const menuRef = useRef(null) useEffect(() => { function handleClickOutside(event: MouseEvent) { if (menuRef.current && !menuRef.current.contains(event.target as Node)) { setShowMenu(false) } } document.addEventListener("mousedown", handleClickOutside) return () => document.removeEventListener("mousedown", handleClickOutside) }, []) const handleCopy = async () => { await onCopy(message.content) setHasCopied(true) setTimeout(() => setHasCopied(false), 2000) setShowMenu(false) } const handleRegenerate = () => { onRegenerate(message.id) setShowMenu(false) } const handleFeedback = (type: "like" | "dislike") => { onFeedback(message.id, type) setShowMenu(false) } const handleShare = () => { onShare(message) setShowMenu(false) } const handleGeneratePDF = () => { onGeneratePDF?.(message.id) setShowMenu(false) } const handleGenerateWord = () => { onGenerateWord?.(message.id) setShowMenu(false) } const handleEdit = () => { onEdit?.(message) setShowMenu(false) } if (message.role === "user") { return (
: } label="Copy" onClick={handleCopy} isActive={hasCopied} /> {onEdit && ( } label="Edit" onClick={handleEdit} /> )}
) } if (compact) { return (
: } label="Copy" onClick={handleCopy} isActive={hasCopied} /> } label="Regenerate" onClick={handleRegenerate} /> {showFeedback && ( <> } label="Like" onClick={() => handleFeedback("like")} isActive={message.feedback_type === "like"} /> } label="Dislike" onClick={() => handleFeedback("dislike")} isActive={message.feedback_type === "dislike"} /> )}
} label="More" onClick={() => setShowMenu(!showMenu)} /> {showMenu && (
{onGeneratePDF && ( )} {onGenerateWord && ( )}
)}
) } return (
: } label="Copy" onClick={handleCopy} isActive={hasCopied} /> } label="Regenerate" onClick={handleRegenerate} /> {showFeedback && ( <> } label="Like" onClick={() => handleFeedback("like")} isActive={message.feedback_type === "like"} /> } label="Dislike" onClick={() => handleFeedback("dislike")} isActive={message.feedback_type === "dislike"} /> )} } label="Share" onClick={handleShare} /> {onGeneratePDF && ( } label="PDF" onClick={handleGeneratePDF} /> )} {onGenerateWord && ( } label="Word" onClick={handleGenerateWord} /> )}
) }