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 &&
文字链文案
{linkNamePageType && }
}
}
return null
}, [creativeComponents?.text_link, pageSpec, textLinkShow, creativeTemplateId, automaticSiteEnabled, putInType])
/** 行动按钮 */
const actionButtonContent = useMemo(() => {
// 卡片广告用卡片组件控制
if ([1707, 1708].includes(creativeTemplateId) && !cardType?.includes('action_button')) {
return null
}
let actionButton = creativeComponents?.action_button
if (actionButton) {
let pageSpecPageType = pageSpec?.[0]?.pageType || 'PAGE_TYPE_WECHAT_CANVAS'
let actionButtonRequired, butttonTextEnumeration: { label: string, value: string }[] = [];
let actionButtonPageType, actionButtonPageTypeEnumeration: PULLIN.DataType[] = [];
actionButtonRequired = actionButton.required
let buttonText = actionButton.children.button_text
butttonTextEnumeration = (buttonText.enumProperty.enumeration as { value: string }[]).map(item => ({ label: item.value, value: item.value }))
actionButtonPageType = actionButton?.children?.page_type
if (actionButtonPageType) {
actionButtonPageTypeEnumeration = (actionButtonPageType?.enumProperty?.enumeration as { value: string, description: string }[]).filter(item => item.value === pageSpecPageType).map(item => ({ label: item.description, value: item.value }))
if (pageSpecPageType === 'PAGE_TYPE_OFFICIAL' && actionButtonPageTypeEnumeration.length === 0) {
actionButtonPageTypeEnumeration = (actionButtonPageType?.enumProperty?.enumeration as { value: string, description: string }[]).filter(item => item.value === 'PAGE_TYPE_WECHAT_FOCUS_DAILOG').map(item => ({ label: item.description, value: item.value }))
}
}
return
{![1707, 1708].includes(creativeTemplateId) && }
{(actionButtonShow || cardType?.includes('action_button')) &&
按钮文案
{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 }}
>
按钮文案
: (floatingZoneSwitch && floatingZoneType === 'FLOATING_ZONE_TYPE_SINGLE_IMAGE') ?
{floating_zone_single_image_id?.description}
{
setSelectCloudData({ defaultParams: { sizeQueries: [{ relation: '=', width: floating_zone_single_image_id.restriction.imageRestriction.width, height: floating_zone_single_image_id.restriction.imageRestriction.height }], fileSize: floating_zone_single_image_id.restriction.imageRestriction.fileSize * 1024, materialType: 'image' }, num: 1 })
setMaterialConfig({
...materialConfig,
type: 'floatingZoneSingleImage',
max: 1,
index: 1,
adcreativeTemplateId: creativeTemplateId
})
setTimeout(() => {
setSelectVideoVisible(true)
}, 100)
}}>
{image?.floatingZoneSingleImageUrl ?
: <>
{`推荐尺寸(${floating_zone_single_image_id.restriction.imageRestriction.width} x ${floating_zone_single_image_id.restriction.imageRestriction.height})`}
{`${floating_zone_single_image_id.restriction.imageRestriction.fileFormat?.map((str: any) => str?.replace('IMAGE_TYPE_', ''))};小于 ${floating_zone_single_image_id.restriction.imageRestriction.fileSize}KB`}
>}
: null}
>
}
return null
}, [creativeComponents?.floating_zone, floatingZoneSwitch, floatingZoneType, image])
useEffect(() => {
let data = [
{ label: '不使用', value: 'not', disabled: false },
{ label: '行动按钮', value: 'action_button', disabled: cardType?.some(item => ['chosen_button', 'shop_imag'].includes(item)) },
// { label: '选择按钮', value: 'chosen_button', disabled: cardType?.some(item => ['label', 'action_button', 'shop_imag'].includes(item)) },
// { label: '卖点图', value: 'shop_imag', disabled: cardType?.some(item => ['chosen_button'].includes(item)) },
{ label: '标签', value: 'label', disabled: cardType?.some(item => ['chosen_button', 'count_down'].includes(item)) },
// { label: '倒计时', value: 'count_down', disabled: cardType?.some(item => ['living_desc', 'label'].includes(item)) },
// { label: '轮播文案', value: 'living_desc', disabled: cardType?.some(item => ['count_down'].includes(item)) }
]
if (cardType?.length >= 3) {
setCardData(data.map(item => {
if (cardType.includes(item.value)) {
return { ...item, disabled: false }
} else if (item.value === 'not') {
return { ...item, disabled: false }
} else {
return { ...item, disabled: true }
}
}))
} else {
setCardData(data)
}
}, [cardType])
if (Object.keys(creativeComponents).some(key => ['text_link', 'action_button', 'show_data', 'floating_zone', 'label', 'barrage'].includes(key))) {
return 营销组件}
className="cardResetCss"
>
{/* 卡片广告所需 */}
{[1707, 1708].includes(creativeTemplateId) &&
卡片组件
卡片组件有以下使用条件:
1.卡片组件最多只能使用 3 个
2.倒计时不能与标签、轮播文案同时使用
3.卖点图必须与行动按钮同时使用
4.选择按钮不能与行动按钮、标签、卖点图同时使用
}>
{
if (e.length > 1 && !cardType.includes('not') && e.includes('not')) {
return ['not'];
}
if (e.includes('shop_imag') && !e.includes('action_button')) {
e.push('action_button')
}
return e.length > 0 ? (e.length > 1 && e.includes('not') ? e.filter(item => item !== 'not') : e) : ['not'];
}}
>
{
console.log(e)
}} />
}
{textLinkContent}
{actionButtonContent}
{labelContent}
{barrageContent}
{showDataContent}
{floatingZoneContent}
{/* 选择视频素材 */}
{(selectVideoVisible && selectCloudData) && {
setSelectVideoVisible(false)
setSelectCloudData(undefined)
}}
sliderImgContent={materialConfig.type === 'floatingZoneSingleImage' ? image?.floatingZoneSingleImageUrl ? [{ oss_url: image.floatingZoneSingleImageUrl, id: image.floatingZoneSingleImageId }] : undefined : image?.floatingZoneImageUrl ? [{ oss_url: image.floatingZoneImageUrl, id: image.floatingZoneImageId }] : undefined}
onChange={(content: any) => {
if (content.length > 0) {
if (materialConfig.type === 'floatingZoneSingleImage') {
form.setFieldsValue({
floatingZone: {
...floatingZone,
value: {
...floatingZone?.value,
image: { floatingZoneSingleImageId: content[0]?.id, floatingZoneSingleImageUrl: content[0]?.oss_url, floatingZoneSingleImageMaterialType: 0 }
}
}
})
} else {
form.setFieldsValue({
floatingZone: {
...floatingZone,
value: {
...floatingZone?.value,
image: { floatingZoneImageId: content[0]?.id, floatingZoneImageUrl: content[0]?.oss_url, floatingZoneImageMaterialType: 0 }
}
}
})
}
}
setSelectVideoVisible(false)
}}
/>}
} else {
return null
}
}
export default React.memo(CreativeConversionAssistant)