import { useAjax } from "@/Hook/useAjax"; import { AdcreativeTemplate, AdcreativeTemplateList } from "@/services/launchAdq"; import { get_adcreative_template, get_adcreative_template_list } from "@/services/launchAdq/global"; import { mySet } from "@/utils/arrFn"; import { DeleteOutlined, DownOutlined, UpOutlined } from "@ant-design/icons"; import { Button, Form, Popconfirm, Radio, Spin } from "antd" import React, { forwardRef, useEffect, useImperativeHandle, useState } from "react" import { useModel } from "umi"; import SelectCloud from "../../components/selectCloud"; import TextAideInput from "../../components/textAideInput"; import { outAdcreativeTemplateIdFun } from "../localAd/adenum"; import style from './index.less' interface Props { template: { siteSet: string[], promotedObjectType: string }, index: number, isDel: boolean, delOri?: () => void data?: any } /** * 批量Form * @returns */ const CreativeForm = forwardRef((props: Props, ref) => { /**************************/ const { data, template, index, delOri, isDel } = props const [form] = Form.useForm(); let adcreativeElementsType = Form.useWatch('adcreativeElementsType', form) let adcreativeTemplateId = Form.useWatch('adcreativeTemplateId', form) const [adcreative_template_list, set_adcreative_template_list] = useState([]) const [adcreative_template, set_adcreative_template] = useState() const [conversionList, setConversionList] = useState(null) const [materialConfig, setMaterialConfig] = useState<{ adcreativeTemplateId?: number, type: string, cloudSize: { relation: string, width: number, height: number }[], list: any[], max: number }>({ type: '',//类型 cloudSize: [],//素材搜索条件 list: [],//素材 max: 1,//素材数量 })//素材配置 const [pupState, setPupState] = useState({ kp_show: false, xd_show: false, sj_show: false, bq_show: false, sp_show: false }) const [isOpen, setIsOpen] = useState(true) const [isErr, setIsErr] = useState(false) const [selectImgVisible, set_selectImgVisible] = useState(false) const { init } = useModel('useLaunchAdq.useBdMediaPup') const getAdcreativeTemplateList = useAjax((params) => get_adcreative_template_list(params)) const getAdcreativeTemplate = useAjax((params) => get_adcreative_template(params)) /**************************/ //子组件暴露方法 useImperativeHandle(ref, () => ({ handleOk })); const handleOk = () => { return new Promise((resolve: (value: unknown) => void, reject: (reason?: any) => void) => { form.validateFields().then(values => { setIsErr(false) resolve(values) }).catch(err => { setIsErr(true) reject(err) }) }) } // 获取创意形式列表 useEffect(() => { if (template && template?.siteSet?.length > 0 && template?.promotedObjectType) { getAdcreativeTemplateList.run({ siteSet: template?.siteSet, promotedObjectType: template?.promotedObjectType, campaignType: 'CAMPAIGN_TYPE_NORMAL', }).then(res => { let newArr: any = [] // 过滤掉相同的和即将下线的 if (!res) { return } Object.values(res)?.forEach((arr: any) => { Array.isArray(arr) && arr?.forEach((item: any) => { if (newArr.length > 0) { if (outAdcreativeTemplateIdFun(item.adcreativeTemplateId) && newArr.every((i: { adcreativeTemplateId: any }) => i.adcreativeTemplateId !== item.adcreativeTemplateId)) { newArr.push(item) } else { // 找出通用创意 newArr = newArr?.map((arr: { adcreativeTemplateId: any }) => { if (arr.adcreativeTemplateId === item.adcreativeTemplateId) { return { ...arr, isGeneral: true } } return arr }) } } else { if (outAdcreativeTemplateIdFun(item.adcreativeTemplateId)) { newArr.push(item) } } }) }) set_adcreative_template_list(newArr) }) } }, [template, form]) // 获取创意形式详情 useEffect(() => { // CAMPAIGN_TYPE_NORMAL if (template?.siteSet?.length > 0 && template?.promotedObjectType && adcreativeTemplateId) { if (adcreativeTemplateId) { getAdcreativeTemplate.run({ siteSet: template?.siteSet, promotedObjectType: template?.promotedObjectType, adcreativeTemplateId }).then(res => { if (res?.length > 0) { set_adcreative_template(res[0]) } }) } } }, [template?.siteSet, template?.promotedObjectType, adcreativeTemplateId]) //每次选中创意设置该展示的界面 useEffect(() => { let states = { kp_show: false, xd_show: true, sj_show: false, bq_show: false, sp_show: false } let values: any = { pageType: 'PAGE_TYPE_CANVAS_WECHAT', } if (adcreative_template) { let pageList = adcreative_template?.landingPageConfig?.supportPageTypeList let pageType = pageList?.length ? pageList[0]?.pageType : null //数据展示组件 if (adcreative_template.adcreativeAttributes.some(item => item.name === 'conversion_data_type' || item.name === 'conversion_target_type')) { let arr = adcreative_template.adcreativeAttributes?.filter((item: { name: string; }) => item.name === 'conversion_data_type' || item.name === 'conversion_target_type') let newObj: any = {} arr.forEach((item) => { let arr: any[] = mySet(item.propertyDetail.enumDetail.enumeration) newObj[item.name] = arr }) setConversionList(newObj) states = { ...states, sj_show: true } if (newObj.conversion_data_type) { values = { ...values, conversionDataType: newObj.conversion_data_type[0].value } } if (newObj.conversion_target_type) { values = { ...values, conversionTargetType: newObj.conversion_target_type[0].value } } } //行动按钮组件存在 if (states.xd_show) { let linkNameList = (pageList?.filter((item: { pageType: any; }) => item.pageType === pageType)[0] as any)?.supportLinkNameType?.list let linkPageList = (pageList?.filter((item: { pageType: any; }) => item.pageType === pageType)[0] as any)?.supportLinkPageType?.list if (linkNameList) { let linkNameType = linkNameList[0]?.linkNameType let linkPageType = linkPageList[0]?.linkPageType values = { ...values, linkNameType, linkPageType } } else { states = { ...states, xd_show: false } } } // 视频结束页 end_page if (adcreative_template.adcreativeElements.some(item => item.name === 'end_page')) { // let endPageType =adcreative_template?.adcreativeElements?.filter(item=>item.name === 'end_page_type')[0]?.enumProperty?.enumeration values = { ...values, endPageType: 'END_PAGE_AVATAR_NICKNAME_HIGHLIGHT' } states = { ...states, sp_show: true } } setPupState(states) form.setFieldsValue(values) } }, [adcreative_template]) // 版位改变清空数据 useEffect(() => { if (materialConfig.adcreativeTemplateId && adcreativeTemplateId !== materialConfig.adcreativeTemplateId) { setMaterialConfig({ ...materialConfig, adcreativeTemplateId: undefined, list: [] }) } }, [adcreativeTemplateId, materialConfig]) // 切换创意形式默认选中第一个 useEffect(() => { // 设置默认选中第一个 if (adcreativeElementsType && adcreative_template_list?.length > 0) { let adcreativeTemplateIdArr = adcreative_template_list?.filter(item => item.adcreativeTemplateStyle === adcreativeElementsType) form.setFieldsValue({ adcreativeTemplateId: adcreativeTemplateIdArr[0].adcreativeTemplateId }) } }, [adcreativeElementsType, adcreative_template_list]) return
{ setIsOpen(!isOpen) }}>
创意{index}
{isDel && { e?.stopPropagation(); delOri && delOri() }} okText="Yes" cancelText="No"> }
视频 图片 {adcreative_template_list?.filter(item => item.adcreativeTemplateStyle === adcreativeElementsType)?.map((item: any) => { return
{item.isGeneral && 所选版位通投} {item.adcreativeTemplateAppellation} {item.adcreativeTemplateId}
})}
{/* 优先展示视频或图片 */} {adcreative_template?.adcreativeElements?.filter(item => item.required && item.name === 'image_list' || item.name === 'short_video1' || item.name === 'video' || item.name === 'image').map(item => { return {/* 视频 */} { (item.name === 'short_video1' || item.name === 'video') &&
{ init({ mediaType: 'VIDEO', cloudSize: adcreativeTemplateId === 1708 ? [[{ relation: '=', width: 1280, height: 720 }]] : [[{ relation: '=', width: item.restriction.videoRestriction.minWidth, height: item.restriction.videoRestriction.minHeight }]], maxSize: item.restriction.videoRestriction.fileSize * 1024 }) setTimeout(() => { set_selectImgVisible(true) setMaterialConfig({ ...materialConfig, type: item.name, max: 1, adcreativeTemplateId }) }, 100) }}>

{ materialConfig?.list[0] ?

} {/* 单图 */} { item.name === 'image' &&
{ init({ mediaType: 'IMG', cloudSize: [[{ relation: '=', width: item.restriction.imageRestriction.width, height: item.restriction.imageRestriction.height }]], maxSize: item.restriction.imageRestriction.fileSize * 1024 }) setTimeout(() => { set_selectImgVisible(true) setMaterialConfig({ ...materialConfig, type: item.name, max: 1, adcreativeTemplateId }) }, 100) }}>

{materialConfig?.list[0] ? : <> {`推荐尺寸(${item.restriction.imageRestriction.width} x ${item.restriction.imageRestriction.height})`} {`${item.restriction.imageRestriction.fileFormat?.map(str => str?.replace('IMAGE_TYPE_', ''))};小于 ${item.restriction.imageRestriction.fileSize}KB`} }

} {/* 多图 */} { item.name === 'image_list' &&
= 3 ? style.image_list : style.image}`} onClick={() => { init({ mediaType: 'IMG', num: item.arrayProperty.maxNumber, cloudSize: [[{ relation: '=', width: item.restriction.imageRestriction.width, height: item.restriction.imageRestriction.height }]], maxSize: item.restriction.imageRestriction.fileSize * 1024 }) setTimeout(() => { set_selectImgVisible(true) setMaterialConfig({ ...materialConfig, type: item.name, max: item.arrayProperty.maxNumber, adcreativeTemplateId }) }, 100) }}> { Array(item.arrayProperty.maxNumber).fill('').map((arr, index) => { return

{ materialConfig?.list[index] ? : <> {`推荐尺寸(${item.restriction.imageRestriction.width} x ${item.restriction.imageRestriction.height})`} {`${item.restriction.imageRestriction.fileFormat?.map(str => str?.replace('IMAGE_TYPE_', ''))};小于 ${item.restriction.imageRestriction.fileSize}KB`} }

}) }
}
})} {/* 过滤了不必传和品牌名称,品牌标识图(外部传)短视频结构(组装使用) */} {adcreative_template?.adcreativeElements?.filter(item => item.required && item.name === 'description').map(item => { let maxNum = adcreativeTemplateId === 1708 ? pupState.xd_show ? 10 : item.restriction.textRestriction.maxLength : item.restriction.textRestriction.maxLength return
})}
{/* 选择素材 */} {selectImgVisible && set_selectImgVisible(false)} sliderImgContent={materialConfig.list} onChange={(content) => { if (content.length > 0) { form.setFieldsValue({ [materialConfig.type]: materialConfig.type }) } setMaterialConfig({ ...materialConfig, list: content }) set_selectImgVisible(false) console.log(content) }} /> }
}) export default React.memo(CreativeForm)