import React, { useCallback, useEffect, useMemo, useState } from 'react' import { Modal, Form, Input, Divider, Select, Radio, Switch, Spin, List } from 'antd' import { SiteSetEnum, PromotedObjectType } from '@/services/launchAdq/enum' import { ModalConfig } from '.' import styles from './index.less' import { outAdcreativeTemplateIdFun } from '../adenum'; import { useAjax } from '@/Hook/useAjax' import { getText, get_adcreative_template, get_adcreative_template_list } from '@/services/launchAdq/global' import { AdcreativeTemplate, AdcreativeTemplateList } from '@/services/launchAdq' import { mySet } from '@/utils/arrFn' import SelectCloud from '@/pages/launchSystemNew/components/selectCloud' import { useModel } from '@/.umi/plugin-model/useModel' interface Props { title?: string, visible: boolean, PupFn: (arg: ModalConfig) => void, callback: (params: any) => void, confirmLoading: boolean, type?: 'add' | 'look' | 'edit',//新增,查看,编辑 dataInfo?: any } /**创意模板*/ function CreativeModal(props: Props) { let { visible, confirmLoading, PupFn, callback ,type,dataInfo} = props const { init } = useModel('useLaunchAdq.useBdMediaPup') let arg = type === 'look' ? { footer: null } : {} // 请求 const getAdcreativeTemplate = useAjax((params) => get_adcreative_template(params)) const getAdcreativeTemplateList = useAjax((params) => get_adcreative_template_list(params)) const getTextLsit = useAjax((params) => getText(params)) // 变量 const [adcreative_template, set_adcreative_template] = useState() const [adcreative_template_list, set_adcreative_template_list] = useState([]) const [selectImgVisible, set_selectImgVisible] = useState(false) const [descriptionShow, setdescriptionshow] = useState(false) const [endPageDescShow, setendPageDescnshow] = useState(false) const [titleShow, settitleshow] = useState(false) const [login,setlogin]=useState(true) const [form] = Form.useForm(); const [pupState, setPupState] = useState({ kp_show: false, xd_show: false, sj_show: false, bq_show: false, sp_show: false }) 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 [conversionList, setConversionList] = useState(null) let pageType = Form.useWatch('pageType', form) let adcreativeTemplateId = Form.useWatch('adcreativeTemplateId', form) let actionBtn = Form.useWatch('actionBtn', form) let siteSet = Form.useWatch('siteSet', form) let promotedObjectType = Form.useWatch('promotedObjectType', form) let adcreativeElementsType = Form.useWatch('adcreativeElementsType', form) let dataShow = Form.useWatch('dataShow', form) let conversionDataType = Form.useWatch('conversionDataType', form) let titles = Form.useWatch('title', form) let description = Form.useWatch('description', form) let videoOver = Form.useWatch('videoOver', form) let endPageDesc = Form.useWatch('endPageDesc', form) // 确定事件 const handleOk = useCallback(() => { form.validateFields().then(values => { console.log('values=>1', values) let newValues = JSON.parse(JSON.stringify(values)) for (let key in newValues) { switch (key) { case 'image'://图素材 newValues.adcreativeElements = { ...newValues.adcreativeElements, imageUrl: materialConfig.list[0].url, } delete newValues[key] break; case 'video'://视频素材 newValues.adcreativeElements = { ...newValues.adcreativeElements, videoUrl: materialConfig.list[0].url, } delete newValues[key] break; case 'image_list'://图素材 newValues.adcreativeElements = { imageUrlList: materialConfig.list?.map(item=>item.url), description: newValues.description, } delete newValues[key] break; case 'short_video1'://视频素材 // newValues.adcreativeElements = { // video: materialConfig.list[0].url, // description: newValues.description, // } // delete newValues[key] break; case 'description'://文案 newValues.adcreativeElements = { ...newValues.adcreativeElements, description: newValues.description } break; case 'title'://文案 newValues.adcreativeElements = { ...newValues.adcreativeElements, title: newValues.title } break; } } delete newValues.description //删除外层文案 delete newValues.title //删除外层文案 delete newValues.adcreativeElementsType //删除创意形式 delete newValues.dataShow //删除数据开关 delete newValues.actionBtn //删除行动开关 console.log('newValues=>2', newValues) callback(newValues) }) // PupFn({ visible: false }) }, [form, materialConfig]) // 获取创意形式列表 useEffect(() => { if (siteSet?.length > 0 && promotedObjectType) { getAdcreativeTemplateList.run({ siteSet, promotedObjectType, campaignType: 'CAMPAIGN_TYPE_NORMAL', }).then(res => { let newArr: any = [] // 过滤掉相同的和即将下线的 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) }) } }, [siteSet, promotedObjectType, form]) // 获取创意形式详情 useEffect(() => { // CAMPAIGN_TYPE_NORMAL if (siteSet?.length > 0 && promotedObjectType && adcreativeTemplateId) { if (adcreativeTemplateId) { getAdcreativeTemplate.run({ siteSet, promotedObjectType, adcreativeTemplateId }).then(res => { if (res?.length > 0) { set_adcreative_template(res[0]) } }) } } }, [siteSet, promotedObjectType, adcreativeTemplateId]) // 获取对应落地页按钮 const pageTypeList = useMemo(() => { if (adcreativeTemplateId) { let arr: any = adcreative_template?.landingPageConfig?.supportPageTypeList return arr } return null }, [adcreativeTemplateId, adcreative_template]) // 获取对应行动按钮数据 const linkNameList = useMemo(() => { if (pageType) { let arr = (pageTypeList?.filter((item: { pageType: any; }) => item.pageType === pageType)[0] as any)?.supportLinkNameType?.list return arr } return null }, [pageType, pageTypeList]) // 跳转落地页 const linkPageList = useMemo(() => { if (pageType) { let arr = (pageTypeList?.filter((item: { pageType: any; }) => item.pageType === pageType)[0] as any)?.supportLinkPageType?.list return arr } return null }, [pageType, pageTypeList]) // 切换创意形式默认选中第一个 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]) //每次选中创意设置该展示的界面 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 } values = { ...values, conversionDataType: newObj.conversion_data_type[0].value, 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]) // 文案助手 const textList = useCallback((arg: { maxTextLength: number, keyword?: string }) => { let { maxTextLength, keyword } = arg getTextLsit.run({ keyword: keyword || titles || description, maxTextLength }) }, [titles, description]) // 监听点击取消文案助手弹窗 useEffect(() => { let modal = document.querySelector('.myModal') let onBiurdescription = (e: any) => { let d = document.querySelector('.my_description') let t = document.querySelector('.my_title') let p = document.querySelector('.my_endPageDesc') if (!d?.contains(e.target)) { setdescriptionshow(false) } if (!t?.contains(e.target)) { settitleshow(false) } if (!p?.contains(e.target)) { setendPageDescnshow(false) } } modal?.addEventListener('click', onBiurdescription) return () => { modal?.removeEventListener('click', onBiurdescription) } }, []) // 数据回填 useEffect(()=>{ if(dataInfo && adcreative_template_list?.length >0 && adcreative_template){ let {adcreativeName,adcreativeTemplateId,conversionDataType,conversionTargetType,linkNameType,linkPageType,pageType,promotedObjectType,siteSet,adcreativeElements} = dataInfo let {description,imageUrl,title,videoUrl,imageUrlList} = adcreativeElements let obj:any={ adcreativeName, siteSet, promotedObjectType, adcreativeTemplateId, } if([720,721,618,1708].some(n=>n === adcreativeTemplateId)){ obj={...obj,adcreativeElementsType:'视频'} }else{ obj={...obj,adcreativeElementsType:'图片'} } if(conversionDataType){ obj={...obj,conversionDataType,dataShow:true} } if(conversionTargetType){ obj={...obj,conversionTargetType,dataShow:true} } if(linkNameType){ obj={...obj,linkNameType,actionBtn:true} } if(linkPageType){ obj={...obj,linkPageType,actionBtn:true} } if(pageType){ obj={...obj,pageType} } if(description){ obj={...obj,description} } if(title){ obj={...obj,title} } if(videoUrl){ setMaterialConfig({ cloudSize:[], list:[{url:videoUrl}], max:1, type:'video', adcreativeTemplateId }) } if(imageUrl){ setMaterialConfig({ cloudSize:[], list:[{url:imageUrl}], max:1, type:'image', adcreativeTemplateId }) } if(imageUrlList){ setMaterialConfig({ cloudSize:[], list:imageUrlList?.map((url: any)=>({url})), max:imageUrlList.length, type:'image_list', adcreativeTemplateId }) } form.setFieldsValue(obj) } },[dataInfo,adcreative_template_list,adcreative_template]) return { PupFn({ visible: false,dataInfo:null,type:'add' }) }} onOk={handleOk} width={1200} confirmLoading={confirmLoading} className='myModal' {...arg} >
{/* ============================================================基本信息============================================================= */} 基本信息 {/* ============================================================创意名称============================================================= */} 创意名称} name='adcreativeName' rules={[{ required: true, message: '请输入广告名称!' }]}> {/* ============================================================推广目标类型============================================================= */} 推广目标类型} name='promotedObjectType' rules={[{ required: true, message: '请选择推广告推广目标类型!' }]}> {/* ============================================================投放版位============================================================= */} 投放版位} name='siteSet' rules={[{ required: true, message: '请输入选择广告版位!' }]}> {/* ============================================================创意形式============================================================= */} 创意形式 {/* ============================================================创意形式============================================================= */} 创意形式} name='adcreativeElementsType'> 视频 图片 { getAdcreativeTemplateList?.loading ? : <> { 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.description}} rules={[{ required: true, message: '请选择素材!' }]} key={item.name} name={item.name}> {/* 视频 */} { (item.name === 'short_video1' || item.name === 'video') &&
{ init({ mediaType: 'VIDEO', cloudSize: [[{ relation: '=', width: item.restriction.videoRestriction.minWidth, height: item.restriction.videoRestriction.minHeight }]] }) 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 }]] }) 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 ? styles.image_list : styles.image}`} onClick={() => { init({ mediaType: 'IMG', num: item.arrayProperty.maxNumber, cloudSize: [[{ relation: '=', width: item.restriction.imageRestriction.width, height: item.restriction.imageRestriction.height }]] }) 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.name === 'title').map(item => { return
{item.description}(选填)} className={'my_title'} > { settitleshow(true) textList({ maxTextLength: item.restriction.textRestriction.maxLength }) }} onChange={(e) => { let value = e.target.value textList({ maxTextLength: item.restriction.textRestriction.maxLength, keyword: value }) }} /> {`${titles?.length ?? 0}/${item.restriction.textRestriction.maxLength}`} { titleShow && { form.setFieldsValue({ title: item.text }) settitleshow(false) }}>{item.text}{item.tag && {'CTR 高'}}} /> }
}) } {//过滤了不必传和品牌名称,品牌标识图(外部传)短视频结构(组装使用) adcreative_template?.adcreativeElements?.filter(item => item.required && item.name === 'description').map(item => { return
{item.description}} className={'my_description'}> { setdescriptionshow(true) textList({ maxTextLength: item.restriction.textRestriction.maxLength }) }} onChange={(e) => { let value = e.target.value textList({ maxTextLength: item.restriction.textRestriction.maxLength, keyword: value }) }} allowClear /> {`${description?.length ?? 0}/${item.restriction.textRestriction.maxLength}`} { descriptionShow && { form.setFieldsValue({ description: item.text }) setdescriptionshow(false) }}>{item.text}{item.tag && {'CTR 高'}}} /> }
}) } {/* ============================================================落地页============================================================= */} 落地页} name='pageType'> { pageTypeList?.map((item: any) => { return {item.description.includes('微信原生推广页') ? '微信原生推广页' : item.description} }) } {/* ============================================================行动按钮============================================================= */} { pupState.xd_show && 行动按钮} name='actionBtn' valuePropName="checked"> } { actionBtn && <>

按钮文案

跳转落地页

{ linkPageList?.map((item: { linkPageType: string; description: string; }, index: number) => { return {item.description} }) }
} {/* ============================================================数据展示============================================================= */} {pupState.sj_show && 数据展示} name='dataShow' valuePropName="checked"> } { dataShow && <>

数据类型

{ conversionList?.conversion_data_type?.map((item: { value: string; description: string; }, index: number) => { return {item.description} }) }
{conversionDataType === 'CONVERSION_DATA_ADMETRIC' &&

转化行为

{ conversionList?.conversion_target_type?.map((item: { value: string; description: string; }, index: number) => { return {item.description} }) }
} } {/* ============================================================视频结束页============================================================= */} {pupState.sp_show && 视频结束页} name='videoOver' valuePropName="checked"> } { videoOver && <>

视频结束页类型

{ adcreative_template?.adcreativeElements?.filter(item => item.name === 'end_page_type')[0]?.enumProperty?.enumeration?.map((item) => { return {item.description} }) }

结束文案

\\&'\\\"\\/\\x08\\x09\\x0A\\x0D\\\\]{1,12}$"), message: '请输入正确的结束页文案' }]} style={{ marginBottom: 0, marginRight: 10 }}> { setendPageDescnshow(true) textList({ maxTextLength: 12 }) }} onChange={(e) => { let value = e.target.value textList({ maxTextLength: 12, keyword: value }) }} allowClear /> {endPageDesc?.length || 0}/12
{ endPageDescShow && { form.setFieldsValue({ endPageDesc: item.text }) setendPageDescnshow(false) }}>{item.text}{item.tag && {'CTR 高'}}} /> }
} }
{/* 选择素材 */} { 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 CreativeModal