import { Card, Checkbox, Form, Radio, Select, Space, Switch, Tooltip } from "antd" import React, { useContext, useEffect, useMemo, useState } from "react" import { DispatchDynamic } from "./newDynamic"; import style from '../index.less' import New1Radio from "@/pages/launchSystemV3/components/New1Radio"; import { useUpdateEffect } from "ahooks"; import { QuestionCircleFilled } from "@ant-design/icons"; import { txtLength } from "@/utils/utils"; import TextAideInput from "@/pages/launchSystemV3/components/TextAideInput"; import styles from '../Material/index.less' import SelectLabel from "./SelectLable" import SelectCloudNew from "@/pages/launchSystemV3/material/cloudNew/selectCloudNew"; import SelectBarrage from "./SelectBarrage"; /** * 营销组件 * @returns */ const CreativeConversionAssistant: React.FC<{ automaticSiteEnabled?: boolean, putInType?: 'NOVEL' | 'GAME' }> = ({ automaticSiteEnabled, putInType }) => { /**************************************/ const { creativeComponents, form, isUpdate, setIsUpdate } = useContext(DispatchDynamic)!; const textLinkShow = Form.useWatch('textLinkShow', form) const actionButtonShow = Form.useWatch('actionButtonShow', form) const showDataShow = Form.useWatch('showDataShow', form) const pageSpec = Form.useWatch('pageSpec', form) const linkNameType = Form.useWatch(['textLink', 'value', 'linkNameType'], form) const conversionDataType = Form.useWatch(['showData', 'value', 'conversionDataType'], form) const conversionTargetType = Form.useWatch(['showData', 'value', 'conversionTargetType'], form) const floatingZone = Form.useWatch('floatingZone', form) const floatingZoneSwitch = Form.useWatch(['floatingZone', 'value', 'floatingZoneSwitch'], form) const floatingZoneType = Form.useWatch(['floatingZone', 'value', 'floatingZoneType'], form) const image = Form.useWatch(['floatingZone', 'value', 'image'], form) const creativeTemplateId = Form.useWatch('creativeTemplateId', form) const cardType: string[] = Form.useWatch('cardType', form) const [cardData, setCardData] = useState<{ label: string, value: string, disabled?: boolean }[]>([]) const [materialConfig, setMaterialConfig] = useState<{ adcreativeTemplateId?: number, type: string, cloudSize: { relation: string, width: number, height: number }[], list: any[], index: number, max: number, sliderImgContent: any, isGroup?: boolean }>({ type: '',//类型 cloudSize: [],//素材搜索条件 list: [],//素材 index: 0, // 素材组下标 max: 1,//素材数量 sliderImgContent: undefined })//图片素材配置 const [selectCloudData, setSelectCloudData] = useState<{ defaultParams: { sizeQueries?: { width: number, height: number, relation: string }[], materialType: 'image' | 'video' fileSize: number } num: number }>() const [selectVideoVisible, setSelectVideoVisible] = useState(false) /**************************************/ useUpdateEffect(() => { if (isUpdate) { setDefaultShouData() } }, [linkNameType, conversionDataType, conversionTargetType, showDataShow, creativeComponents?.show_data, isUpdate]) const setDefaultShouData = () => { setIsUpdate(false) if (showDataShow && creativeComponents?.show_data) { let showData = creativeComponents?.show_data; let link_name_type = linkNameType || '' let conversionDataTypeData = showData?.children?.conversion_data_type let values: any = {} if (conversionDataTypeData) { let conversionDataTypeEnumeration = (conversionDataTypeData.enumProperty.enumeration as { value: string, category: string, description: string }[]) .filter(item => item.category === link_name_type) .map(item => item.value) if (conversionDataTypeEnumeration.length === 0) { conversionDataTypeEnumeration = (conversionDataTypeData.enumProperty.enumeration as { value: string, category: string, description: string }[]) .filter(item => item.category === '') .map(item => item.value) } if (!conversionDataTypeEnumeration.includes(conversionDataType)) { values.conversionDataType = conversionDataTypeEnumeration?.[0] } } let conversionTargetTypeData = showData?.children?.conversion_target_type if (conversionTargetTypeData) { let conversionTargetTypeEnumeration = (conversionTargetTypeData.enumProperty.enumeration as { value: string, category: string, description: string }[]) .filter(item => item.category === link_name_type) .map(item => item.value) if (conversionTargetTypeEnumeration.length === 0) { conversionTargetTypeEnumeration = (conversionTargetTypeData.enumProperty.enumeration as { value: string, category: string, description: string }[]) .filter(item => item.category === '') .map(item => item.value) } if (!conversionTargetTypeEnumeration.includes(conversionTargetType)) { values.conversionTargetType = conversionTargetTypeEnumeration?.[0] } } let valueKeys = Object.keys(values) if (valueKeys.length > 0) { if (!valueKeys.includes('conversionTargetType')) { values.conversionTargetType = conversionTargetType } if (!valueKeys.includes('conversionDataType')) { values.conversionDataType = conversionDataType } console.log('values--->', values) form.setFieldsValue({ showData: { value: values } }) } } } /** 微信文字链 */ const textLinkContent = useMemo(() => { let textLink = creativeComponents?.text_link if (textLink && ![1707, 1708].includes(creativeTemplateId) && !automaticSiteEnabled) { let pageSpecPageType = pageSpec?.[0]?.pageType || 'PAGE_TYPE_WECHAT_CANVAS' let textLinkRequired, linkNameEnumeration: { label: string, value: string }[] = []; let linkNamePageType, linkNamePageTypeEnumeration: PULLIN.DataType[] = []; textLinkRequired = textLink.required let linkNameType = textLink.children.link_name_type linkNameEnumeration = (linkNameType.enumProperty.enumeration as { value: string, description: string }[]).map(item => ({ label: item.description, value: item.value })) linkNamePageType = textLink?.children?.page_type if (linkNamePageType) { linkNamePageTypeEnumeration = (linkNamePageType?.enumProperty?.enumeration as { value: string, description: string }[]).filter(item => item.value === pageSpecPageType || item.value === 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL').map(item => ({ label: item.description, value: item.value })) } if (putInType === 'GAME') { let jumpInfoPageType = creativeComponents?.jump_info?.children?.page_type?.enumProperty?.enumeration if (jumpInfoPageType?.length && jumpInfoPageType?.length !== linkNamePageType?.enumProperty?.enumeration?.length) { return } } return
朋友圈文字链
setIsUpdate(true)} />
{textLinkShow &&
文字链文案
(option?.label ?? '').toLowerCase().includes(input.toLowerCase()) } options={butttonTextEnumeration} />
{actionButtonPageType &&
跳转落地页
}
}
} return null }, [creativeComponents?.action_button, pageSpec, actionButtonShow, cardType, creativeTemplateId]) /** 标签 */ const labelContent = useMemo(() => { // 卡片广告用卡片组件控制 if ([1707, 1708].includes(creativeTemplateId) && !cardType?.includes('label')) { return null } let label = creativeComponents?.label; if (label) { const list = label.children.list return    标签{label.required ? '' : '(选填)'}}> } return null }, [creativeComponents?.label, cardType, putInType]) /** 弹幕 */ const barrageContent = useMemo(() => { let barrage = creativeComponents?.barrage; if (barrage) { return    弹幕{barrage.required ? '' : '(选填)'}} rules={[ { required: barrage.required, validator(_, value) { if (value && (value?.length < 3 || value?.length > 20)) { return Promise.reject('弹幕数量须为3-20条') } return Promise.resolve() } } ]} > } return null }, [creativeComponents?.barrage, putInType]) /** 数据外显 */ const showDataContent = useMemo(() => { let showData = creativeComponents?.show_data; if (showData) { let conversionDataTypeEnumeration: PULLIN.DataType[] = []; let conversionTargetTypeEnumeration: PULLIN.DataType[] = []; let link_name_type = linkNameType || '' let showDataRequired = showData?.required let conversionDataType = showData?.children?.conversion_data_type if (conversionDataType) { conversionDataTypeEnumeration = (conversionDataType.enumProperty.enumeration as { value: string, category: string, description: string }[]) .filter(item => item.category === link_name_type) .map(item => ({ label: item.description, value: item.value })) if (conversionDataTypeEnumeration.length === 0) { conversionDataTypeEnumeration = (conversionDataType.enumProperty.enumeration as { value: string, category: string, description: string }[]) .filter(item => item.category === '') .map(item => ({ label: item.description, value: item.value })) } } let conversionTargetType = showData?.children?.conversion_target_type if (conversionTargetType) { conversionTargetTypeEnumeration = (conversionTargetType.enumProperty.enumeration as { value: string, category: string, description: string }[]) .filter(item => item.category === link_name_type) .map(item => ({ label: item.description, value: item.value })) if (conversionTargetTypeEnumeration.length === 0) { conversionTargetTypeEnumeration = (conversionTargetType.enumProperty.enumeration as { value: string, category: string, description: string }[]) .filter(item => item.category === '') .map(item => ({ label: item.description, value: item.value })) } } // 卡片广告去掉商品数据 if ([1707, 1708].includes(creativeTemplateId)) { conversionDataTypeEnumeration = conversionDataTypeEnumeration.filter(item => item.value !== "CONVERSION_DATA_PRODUCT_DATA") } return
数据外显
setIsUpdate(true)} />
{showDataShow &&
数据类型
转化行为
}
} return null }, [creativeComponents?.show_data, linkNameType, showDataShow, creativeTemplateId]) /** 浮层卡片 */ const floatingZoneContent = useMemo(() => { let floatingZone = creativeComponents?.floating_zone; if (floatingZone) { let required = floatingZone?.required let children = floatingZone.children const { floating_zone_type, floating_zone_image_id, floating_zone_single_image_id, floating_zone_name, floating_zone_desc, floating_zone_button_text } = children const floatingZoneTypeList: PULLIN.DataType[] = [] if (floating_zone_image_id) { floatingZoneTypeList.push({ label: "图文复合类型", value: "FLOATING_ZONE_TYPE_IMAGE_TEXT" }) } if (floating_zone_single_image_id) { floatingZoneTypeList.push({ label: "单图类型", value: "FLOATING_ZONE_TYPE_SINGLE_IMAGE" }) } let floatingZoneButtonTextEnumeration: { label: string, value: string }[] = []; if (floating_zone_button_text) { floatingZoneButtonTextEnumeration = (floating_zone_button_text.enumProperty.enumeration as { value: string, description: string }[]).map(item => ({ label: item.value, value: item.value })) } return <>
浮层卡片
{ if (e) { let floatingZoneData: any = { value: { floatingZoneSwitch: true, floatingZoneType: 'FLOATING_ZONE_TYPE_IMAGE_TEXT', floatingZoneButtonText: '了解更多' } } if (floating_zone_image_id && floating_zone_button_text) { floatingZoneData.value.floatingZoneButtonText = floatingZone.children.floating_zone_button_text?.enumProperty?.enumeration[0]?.value } form.setFieldsValue({ floatingZone: floatingZoneData }) } }} />
{floatingZoneSwitch && }
{(floatingZoneSwitch && floatingZoneType === 'FLOATING_ZONE_TYPE_IMAGE_TEXT') ?
{floating_zone_image_id?.description}
{ setSelectCloudData({ defaultParams: { sizeQueries: [{ relation: '=', width: floating_zone_image_id.restriction.imageRestriction.width, height: floating_zone_image_id.restriction.imageRestriction.height }], fileSize: floating_zone_image_id.restriction.imageRestriction.fileSize * 1024, materialType: 'image' }, num: 1 }) setMaterialConfig({ ...materialConfig, type: 'floatingZoneImage', max: 1, index: 1, adcreativeTemplateId: creativeTemplateId }) setTimeout(() => { setSelectVideoVisible(true) }, 100) }}>

{image?.floatingZoneImageUrl ? : <> {`推荐尺寸(${floating_zone_image_id.restriction.imageRestriction.width} x ${floating_zone_image_id.restriction.imageRestriction.height})`} {`${floating_zone_image_id.restriction.imageRestriction.fileFormat?.map((str: any) => str?.replace('IMAGE_TYPE_', ''))};小于 ${floating_zone_image_id.restriction.imageRestriction.fileSize}KB`} }

{floating_zone_name?.description}
{ if (!value) { return Promise.reject() } else if (!value.match(RegExp(floating_zone_name.restriction.textRestriction.textPattern))) { return Promise.reject() } else if (txtLength(value) > floating_zone_name.restriction.textRestriction.maxLength) { return Promise.reject() } return Promise.resolve() } }]} style={{ marginBottom: 0 }} >
{floating_zone_desc?.description}
{ if (!value) { return Promise.reject() } else if (!value.match(RegExp(floating_zone_desc.restriction.textRestriction.textPattern))) { return Promise.reject() } else if (txtLength(value) > floating_zone_desc.restriction.textRestriction.maxLength) { return Promise.reject() } return Promise.resolve() } }]} style={{ marginBottom: 0 }} >
按钮文案