"use client" import type React from "react" import { useState, useEffect, use } from "react" import { useRouter } from "next/navigation" import { ChevronLeft, Plus, X, Image as ImageIcon, UploadCloud } from "lucide-react" import { Card } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Textarea } from "@/components/ui/textarea" import { Label } from "@/components/ui/label" import { toast } from "@/components/ui/use-toast" import { api } from "@/lib/api" import { showToast } from "@/lib/toast" import Image from "next/image" interface ApiResponse { code: number msg: string data: T } interface Material { id: number type: string title: string content: string coverImage: string | null resUrls: string[] urls: string[] createTime: string createMomentTime: number time: string wechatId: string friendId: string | null wechatChatroomId: number senderNickname: string location: string | null lat: string lng: string } const isImageUrl = (url: string) => { return /\.(jpg|jpeg|png|gif|webp)$/i.test(url) || url.includes('oss-cn-shenzhen.aliyuncs.com') } export default function EditMaterialPage({ params }: { params: Promise<{ id: string, materialId: string }> }) { const resolvedParams = use(params) const router = useRouter() const [isLoading, setIsLoading] = useState(true) const [content, setContent] = useState("") const [images, setImages] = useState([]) const [previewUrls, setPreviewUrls] = useState([]) const [originalMaterial, setOriginalMaterial] = useState(null) // 获取素材详情 useEffect(() => { const fetchMaterialDetail = async () => { setIsLoading(true) try { const response = await api.get>(`/v1/content/library/get-item-detail?id=${resolvedParams.materialId}`) if (response.code === 200 && response.data) { const material = response.data setOriginalMaterial(material) setContent(material.content) // 处理图片 const imageUrls: string[] = [] // 检查内容本身是否为图片链接 if (isImageUrl(material.content)) { if (!imageUrls.includes(material.content)) { imageUrls.push(material.content) } } // 添加资源URL中的图片 material.resUrls.forEach(url => { if (isImageUrl(url) && !imageUrls.includes(url)) { imageUrls.push(url) } }) setImages(imageUrls) setPreviewUrls(imageUrls) } else { showToast(response.msg || "获取素材详情失败", "error") router.back() } } catch (error: any) { console.error("Failed to fetch material detail:", error) showToast(error?.message || "请检查网络连接", "error") router.back() } finally { setIsLoading(false) } } fetchMaterialDetail() }, [resolvedParams.materialId, router]) // 模拟上传图片 const handleUploadImage = () => { // 这里应该是真实的图片上传逻辑 // 为了演示,这里模拟添加一些示例图片URL const mockImageUrls = [ "https://picsum.photos/id/237/200/300", "https://picsum.photos/id/238/200/300", "https://picsum.photos/id/239/200/300" ] const randomIndex = Math.floor(Math.random() * mockImageUrls.length) const newImage = mockImageUrls[randomIndex] if (!images.includes(newImage)) { setImages([...images, newImage]) setPreviewUrls([...previewUrls, newImage]) } } const handleRemoveImage = (indexToRemove: number) => { setImages(images.filter((_, index) => index !== indexToRemove)) setPreviewUrls(previewUrls.filter((_, index) => index !== indexToRemove)) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!content && images.length === 0) { showToast("请输入素材内容或上传图片", "error") return } const loadingToast = showToast("正在更新素材...", "loading", true) try { const response = await api.post('/v1/content/library/update-item', { id: resolvedParams.materialId, content: content, resUrls: images }) if (response.code === 200) { showToast("素材更新成功", "success") router.push(`/content/${resolvedParams.id}/materials`) } else { showToast(response.msg || "更新失败", "error") } } catch (error: any) { console.error("Failed to update material:", error) showToast(error?.message || "更新失败", "error") } finally { loadingToast.remove && loadingToast.remove() } } if (isLoading) { return (
加载中...
) } return (

编辑素材

{/* 只有当内容不是图片链接时才显示内容编辑区 */} {!isImageUrl(content) && (