import { useState } from 'react' import { Link } from '@inertiajs/react' import * as Dialog from '@radix-ui/react-dialog' import ComImageStatusTag from './ComImageStatusTag' export default function ComImageShow({ path, image, can_edit, can_approve, isAdmin = false }) { const [isModalOpen, setIsModalOpen] = useState(false) return ( <div className="bg-white shadow overflow-hidden sm:rounded-lg"> <div className="px-4 py-5 sm:px-6 flex justify-between items-center"> <div> <h1 className="text-2xl font-bold text-gray-900">{image.title}</h1> <p className="mt-1 max-w-2xl text-sm text-gray-500"> 由 {image.user.name} 在{' '} {new Date(image.created_at).toLocaleDateString()}{' '}上传 </p> </div> <div className="flex space-x-2"> {can_edit && ( <Link href={`${path}/edit`} className="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" > 编辑 </Link> )} {can_approve && image.status === 'pending' && ( <> <Link href={`${path}/approve`} method="patch" as="button" className="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500" > 批准 </Link> <Link href={`${path}/reject`} method="patch" as="button" className="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-red-600 hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500" > 拒绝 </Link> </> )} {can_approve && ( <Link href={`${path}`} method="delete" as="button" className="inline-flex items-center px-3 py-1.5 border border-gray-300 text-sm font-medium rounded-md shadow-sm text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" onClick={(e) => { if (!confirm('确定要删除这张图片吗?')) { e.preventDefault() } }} > 删除 </Link> )} </div> </div> <div className="border-t border-gray-200"> <div className="flex flex-col md:flex-row"> <div className="md:w-2/3 p-4"> <div className="relative pb-[75%]"> <img src={image.file_url} alt={image.title} className="absolute h-full w-full object-contain cursor-pointer" onClick={() => setIsModalOpen(true)} /> </div> </div> <div className="md:w-1/3 p-4 border-t md:border-t-0 md:border-l border-gray-200"> <div className="mb-4"> <h3 className="text-lg font-medium text-gray-900">审核状态</h3> <ComImageStatusTag image={image} /> </div> <div className="mb-4"> <h3 className="text-lg font-medium text-gray-900">标签</h3> <div className="mt-2 flex flex-wrap gap-1"> {image.tags.length > 0 ? ( image.tags.map((tag) => ( <span key={tag.id} className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-indigo-100 text-indigo-800" > {tag.name} </span> )) ) : ( <p className="text-sm text-gray-500">无标签</p> )} </div> </div> <div className="mb-4"> <h3 className="text-lg font-medium text-gray-900">上传者</h3> <p className="text-sm text-gray-500">{image.user.name}</p> <p className="text-sm text-gray-500"> {image.user.email_address} </p> </div> <div className="mb-4"> <h3 className="text-lg font-medium text-gray-900"> 上传日期 </h3> <p className="text-sm text-gray-500"> {new Date(image.created_at).toLocaleDateString()} </p> </div> </div> </div> </div> {/* 全屏图片模态框 */} <Dialog.Root open={isModalOpen} onOpenChange={setIsModalOpen}> <Dialog.Portal> <Dialog.Overlay className="fixed inset-0 bg-black/50" /> <Dialog.Content className="fixed inset-0 flex items-center justify-center"> <div className="relative w-full h-full max-w-screen-xl max-h-screen p-4"> <img src={image.file_url} alt={image.title} className="w-full h-full object-contain" /> <Dialog.Close asChild> <button className="absolute top-4 right-4 p-2 rounded-full bg-white/80 hover:bg-white text-gray-800" aria-label="关闭" > <svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" > <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" /> </svg> </button> </Dialog.Close> </div> </Dialog.Content> </Dialog.Portal> </Dialog.Root> </div> ) }