"use client"; import React, { useEffect, useState } from "react"; import { DotLoading, Image, List, ImageViewer, Modal } from "antd-mobile"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faAdd, faClose, faPlay } from "@fortawesome/free-solid-svg-icons"; import { getVideoBase64 } from "@/utils/tools"; import { DragDropContext, Draggable, Droppable } from "@hello-pangea/dnd"; 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([]); const [videoUrl, setVideoUrl] = useState(null); const [frameImage, setFrameImage] = useState({ src: null, h: 0, w: 0 }); useEffect(() => { if (existImages.length > 0) { setFilesUrls( existImages.map((it, index) => ({ url: it.url, id: `${index}` })) ); } 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"); const eles = Array.from(e.target.files); if (type == 1) { const newFils = eles.map((it, index) => ({ url: URL.createObjectURL(it), id: "new" + index, })); setFilesUrls((old) => [...old, ...newFils]); } 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("video_upload"); const url = URL.createObjectURL(file); // videoD.src = url; getVideoBase64(url).then((src) => { setFrameImage((old) => ({ ...old, src })); setFilesUrls([{ url: src, id: "0" }]); }); }; const reorder = (list, startIndex, endIndex) => { const result = Array.from(list); const [removed] = result.splice(startIndex, 1); result.splice(endIndex, 0, removed); return result; }; const onDragEnd = (result) => { if (!result.destination) return; const newList = reorder( assets, result.source.index, result.destination.index ); getImgs([...newList]); // const newArr=newList.map((it,index)=>({...it,url:it.url||URL.createObjectURL(it)})) const newArr = newList.map((it, index) => { if (it.url) { return { url: it.url, id: `${index}` }; } else { return { url: URL.createObjectURL(it), id: `${index}` }; } }); setFilesUrls(newArr); }; return (
上传中