"use client"; import React, { useEffect, useState } from "react"; import { DotLoading, Image, Toast, ImageViewer, Modal } from "antd-mobile"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faAdd, faClose, faPlay } from "@fortawesome/free-solid-svg-icons"; export default function UploadImgs({ assets, getImgs, accept = "image/png, image/jpeg, image/jpg", existImages = [], type = 1, videoSrc = null, getVideoCover, }) { const maxCount = 6; const [loading, setLoading] = useState(false); const [filesUrls, setFilesUrls] = useState([...existImages]); const [videoUrl, setVideoUrl] = useState(null); const [frameImage, setFrameImage] = useState({ src: null, h: 0, w: 0 }); useEffect(() => { if (existImages.length > 0) { setFilesUrls(existImages.map((it) => it.url)); // setFrameImage({...frameImage,src:existImages}); getImgs(existImages); } if (videoSrc) { setVideoUrl(videoSrc); } }, [existImages]); useEffect(() => { getVideoCover && getVideoCover(frameImage); }, [frameImage]); const handleUploadImage = async (e) => { let file = e.target.files[0]; if (!file) return; var videoUrl = URL.createObjectURL(file); var videoObj = document.createElement("video"); let newFilesUrls = [...filesUrls]; const eles = Array.from(e.target.files); if (type == 1) { eles.forEach((element) => { newFilesUrls = [...newFilesUrls, URL.createObjectURL(element)]; }); setFilesUrls(newFilesUrls); } else { videoObj.onloadedmetadata = function (evt) { URL.revokeObjectURL(videoUrl); const target = evt.target; setFrameImage({ src: videoUrl, w: target.videoWidth, h: target.videoHeight, }); setLoading(true); // let newFilesUrls = [...filesUrls]; if (type == 2) { if (typeof window == "undefined") return; // newFiles = [...assets, file]; // setFileList(newAssets); creatVideoCanvas(file); setVideoUrl(URL.createObjectURL(file)); } // setFileList(newFiles); setLoading(false); }; videoObj.src = videoUrl; videoObj.load(); } getImgs([...assets, ...eles]); }; const handleRemoveItem = (index) => { let newArr = [...filesUrls]; let newAssets = [...assets]; newArr.splice(index, 1); newAssets.splice(index, 1); setFilesUrls(newArr); getImgs(newAssets); }; const showPhotos = (images, index) => { const file = images[0]; const urls = type == 2 ? [frameImage.src] : images; if (type == 1) { ImageViewer.Multi.show({ images: urls, defaultIndex: index, }); } else { Modal.show({ content: ( ), closeOnMaskClick: true, bodyStyle: { background: "none", maxHeight: "100vh", }, }); } }; const creatVideoCanvas = (file) => { if (typeof window == "undefined") return; const videoD = document.getElementById("videoD"); const url = URL.createObjectURL(file); videoD.src = url; videoD.addEventListener("loadeddata", function () { videoD.currentTime = 0; videoD.pause(); // 可选:确保视频在重置后不会自动播放 const canvas = document.createElement("canvas"); canvas.width = videoD.videoWidth; canvas.height = videoD.videoHeight; canvas .getContext("2d") .drawImage(videoD, 0, 0, canvas.width, canvas.height); const canvasImg = canvas.toDataURL(); setFrameImage((old) => ({ ...old, src: canvasImg })); setFilesUrls([canvasImg]); // 释放URL对象 URL.revokeObjectURL(url); }); }; return (
{filesUrls.map((item, index) => { return (
showPhotos(filesUrls, index)} style={{ height: "calc(25vw - 0.75rem)" }} >
handleRemoveItem(index)} >
{type == 2 && (
showPhotos(filesUrls)} >
)}
); })} {loading && (

上传中

)} {type == 2 && filesUrls.length > 0 ? null : ( <> )}
); }