'use client' import React, { useMemo, type CSSProperties } from 'react' import { useThemeStyles, cn } from '@/lib/ui-styles' interface BasicMaterial { id: string isLiked?: boolean isPremium?: boolean isFavorited?: boolean } interface MaterialActionButtonsProps { material: BasicMaterial layout?: 'card' | 'modal' className?: string themeColor: string onEdit?: () => void onDelete?: () => void onShare?: () => void onLike?: () => void onFavorite?: () => void onDownload?: () => void onTogglePremium?: (nextState: boolean) => void canEdit?: boolean canDelete?: boolean canTogglePremium?: boolean showShare?: boolean isDownloading?: boolean downloadProgress?: number isFavorited?: boolean inlineLikeButton?: boolean } const ICON_BUTTON_BASE_SIZE = 40 // 约等于编辑/删除按钮的外框尺寸 const DOWNLOAD_SIZE_MULTIPLIER = 1.5 const DOWNLOAD_MIN_WIDTH = 120 const HeartIcon = ({ filled }: { filled: boolean }) => ( ) const DownloadIcon = () => ( ) const EditIcon = () => ( ) const DeleteIcon = () => ( ) const ShareIcon = () => ( ) const PremiumIcon = () => ( ) const FavoriteIcon = ({ filled }: { filled: boolean }) => ( ) export default function MaterialActionButtons({ material, layout = 'card', className, themeColor: _themeColor, onEdit, onDelete, onShare, onLike, onFavorite, onDownload, onTogglePremium, canEdit, canDelete, canTogglePremium, showShare = true, isDownloading, downloadProgress = 0, isFavorited, inlineLikeButton = true, }: MaterialActionButtonsProps) { const styles = useThemeStyles() const isModal = layout === 'modal' const showDeleteButton = Boolean(canDelete && onDelete) const containerClasses = cn( 'flex items-center gap-1.5 w-full', isModal && 'flex-wrap', className ) const likeActive = Boolean(material.isLiked) const premiumActive = Boolean(material.isPremium) const downloadButtonStyle = useMemo(() => { const widthBase = ICON_BUTTON_BASE_SIZE * DOWNLOAD_SIZE_MULTIPLIER * 2 const targetWidth = Math.max(widthBase, DOWNLOAD_MIN_WIDTH) const shouldLockWidth = showDeleteButton && !isModal return { minWidth: `${targetWidth}px`, width: shouldLockWidth ? `${targetWidth}px` : undefined, flexGrow: shouldLockWidth ? 0 : 1, } }, [isModal, showDeleteButton]) const downloadButtonBaseClasses = 'px-3 text-sm font-semibold flex items-center justify-center gap-1.5 relative overflow-hidden transition-colors disabled:opacity-60 disabled:cursor-not-allowed rounded-xl border bg-white dark:bg-slate-900 text-slate-700 dark:text-slate-100 border-slate-200 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800' return ( {canEdit && onEdit && ( )} {canDelete && onDelete && ( )} {showShare && onShare && ( )} {canTogglePremium && onTogglePremium && ( onTogglePremium(!premiumActive)} className={cn( 'px-2.5 py-2 rounded-xl border transition-colors flex items-center gap-1 text-sm font-semibold w-[90px] justify-center flex-shrink-0', premiumActive ? 'border-amber-500 bg-amber-500 text-white' : 'border-amber-200 dark:border-amber-600 text-amber-600 dark:text-amber-200 hover:bg-amber-50 dark:hover:bg-amber-900/30' )} title={premiumActive ? '取消精品' : '加精'} > {premiumActive ? '精品' : '加精'} )} {onFavorite && layout === 'modal' && ( )} {onLike && inlineLikeButton && ( )} {onDownload && ( {isDownloading ? ( <> {downloadProgress}% > ) : ( <> 下载 > )} )} ) }