import { Checkbox } from "antd"; import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useState, } from "react"; import { CheckboxValueType } from "antd/es/checkbox/Group"; import { DAGE_FILE_CHECKBOX_OPTIONS } from "./constants"; import { DageFileCheckboxMethods, DageFileCheckboxProps } from "./types"; import { DageFileResponseType, DageUpload, DageUploadType, } from "../DageUpload"; import { FileCheckboxItem } from "./style"; export const DageFileCheckbox = forwardRef< DageFileCheckboxMethods, DageFileCheckboxProps >( ( { value, action, disabled, hasMobileModel, maxAudioCount = 1, maxImgCount = 9, maxMobileModelCount = 1, maxModelCount = 1, maxVideoCount = 1, onChange, onFileChange, }, ref ) => { const checkboxVal = useMemo(() => (value ? value.split(",") : []), [value]); const [modelFiles, setModelFiles] = useState([]); const [mobileModelFiles, setMobileModelFiles] = useState< DageFileResponseType[] >([]); const [imgFiles, setImgFiles] = useState([]); const [videoFiles, setVideoFiles] = useState([]); const [audioFiles, setAudioFiles] = useState([]); const hasModel = useMemo( () => checkboxVal.includes(DageUploadType.MODEL), [checkboxVal] ); const hasImg = useMemo( () => checkboxVal.includes(DageUploadType.IMG), [checkboxVal] ); const hasAudio = useMemo( () => checkboxVal.includes(DageUploadType.AUDIO), [checkboxVal] ); const hasVideo = useMemo( () => checkboxVal.includes(DageUploadType.VIDEO), [checkboxVal] ); useImperativeHandle(ref, () => ({ validate(rule, val, callback) { if (!val) { callback("请选择文件类型"); } else if ( hasModel && (!modelFiles.length || !modelFiles.some((i) => i.status === "done")) ) { callback("PC端模型文件不能为空"); } else if ( hasModel && hasMobileModel && (!mobileModelFiles.length || !mobileModelFiles.some((i) => i.status === "done")) ) { callback("移动端模型文件不能为空"); } else if ( hasImg && (!imgFiles.length || !imgFiles.some((i) => i.status === "done")) ) { callback("图片文件不能为空"); } else if ( hasVideo && (!videoFiles.length || !videoFiles.some((i) => i.status === "done")) ) { callback("视频文件不能为空"); } else if ( hasAudio && (!audioFiles.length || !audioFiles.some((i) => i.status === "done")) ) { callback("音频文件不能为空"); } callback(); }, setFileList(list) { const stack: Record = { [DageUploadType.MODEL]: [], [DageUploadType.MOBILE_MODEL]: [], [DageUploadType.IMG]: [], [DageUploadType.AUDIO]: [], [DageUploadType.VIDEO]: [], }; list.forEach((item) => { stack[item.dType].push(item); }); Object.keys(stack).forEach((key) => { const list = stack[key]; if (!list.length) return; switch (key) { case DageUploadType.MODEL: setModelFiles(list); break; case DageUploadType.MOBILE_MODEL: setMobileModelFiles(list); break; case DageUploadType.IMG: setImgFiles(list); break; case DageUploadType.AUDIO: setAudioFiles(list); break; case DageUploadType.VIDEO: setVideoFiles(list); break; } }); }, })); const handleCheckbox = useCallback( (val: CheckboxValueType[]) => { onChange?.(val.join(",")); }, [onChange] ); const handleFileChange = useCallback( ( method: (v: DageFileResponseType[]) => void, list: DageFileResponseType[] ) => { method(list); }, [] ); useEffect(() => { if (!onFileChange) return; onFileChange([ ...(hasModel ? modelFiles : []), ...(hasModel && hasMobileModel ? mobileModelFiles : []), ...(hasImg ? imgFiles : []), ...(hasVideo ? videoFiles : []), ...(hasAudio ? audioFiles : []), ]); }, [ hasMobileModel, modelFiles, mobileModelFiles, imgFiles, videoFiles, audioFiles, hasModel, hasImg, hasVideo, hasAudio, onFileChange, ]); return (
{hasModel && ( <>

PC端模型:

{hasMobileModel && (

移动端模型:

)} )} {hasImg && (

图片:

)} {hasAudio && (

音频:

)} {hasVideo && (

视频:

)}
); } ); export * from "./types"; export * from "./constants";