import TextAideInput from "@/pages/launchSystemV3/components/TextAideInput" import { txtLength } from "@/utils/utils" import { Button, Card, Form, Modal, Popconfirm, Radio, Space, message } from "antd" import React, { useEffect, useState } from "react" import { TextTypeList } from "../../const" import { DeleteOutlined, PlusOutlined } from "@ant-design/icons" import AddTextS from "./addTextS" import style from '../index.less' import styles from '../Material/index.less' import VideoNews from "@/pages/launchSystemNew/components/newsModal/videoNews" interface Props { textData: any, dynamicMaterialDTos: any, mediaType: 0 | 1 | 2, deliveryMode?: string, value?: any, visible?: boolean onClose?: () => void onChange?: (value: any) => void } /** * 创意文案 * @param param0 * @returns */ const NewText: React.FC = ({ visible, onClose, onChange, value, textData, dynamicMaterialDTos, mediaType, deliveryMode }) => { /*************************************/ const [form] = Form.useForm(); const type = Form.useWatch('type', form) const textDto = Form.useWatch('textDto', form) const [textList, setTextList] = useState([]) const [desVisible, setDesVisible] = useState(false) const [addSTitle, setAddStitle] = useState() /*************************************/ const handleOk = (values: any) => { const { type, textDto } = values onChange?.({ type, dynamicCreativesTextDetailDTOList: textDto.map((item: any) => { let data: any = {} Object.keys(item).forEach(key => { data[key] = [item[key]] }) return data }) }) } useEffect(() => { if (value && Object.keys(value).length) { const { type, dynamicCreativesTextDetailDTOList } = value form.setFieldsValue({ type, textDto: dynamicCreativesTextDetailDTOList.map((item: any) => { let data: any = {} Object.keys(item).forEach(key => { data[key] = item[key]?.[0] }) return data }) }) } }, [value]) useEffect(() => { if (textData && Object.keys(textData)) { let data = Object.values(textData).map((item: any) => { let content = item.children.content return { label: content.description, restriction: content.restriction, value: item.name, required: item.required } }) setTextList(data) } }, [textData]) // 一一对应显示素材 const showMaterial = (index: number) => { const dynamicGroup = dynamicMaterialDTos?.dynamicGroup if (dynamicGroup && Object.keys(dynamicGroup).length) { let dynamic = dynamicGroup[index] const keys = Object.keys(dynamic) if (deliveryMode === "DELIVERY_MODE_CUSTOMIZE") { return
{(keys.includes('video_id') || keys.includes('short_video1')) ? <>
{dynamic?.cover_id &&
}
: keys.includes('image_id') ? <>
: (keys.includes('image_list') || keys.includes('element_story')) ? <> {dynamic?.[keys.includes('image_list') ? 'image_list' : 'element_story']?.map((item: { url: string | undefined; }, index: undefined) =>
)} : null}
} else { return
{dynamic?.list?.map((item: any, index: number) => { if (Array.isArray(item)) { let length = item.length return
{item.map((l, i) => )}
} else if (item?.url?.includes('mp4')) { return
} else { return
} })}
} } return null } return 创意文案 {type !== 0 && <> {textList.some(item => item.value === "description") && { setDesVisible(true); setAddStitle(textList.find(item => item.value === "description")?.label) }}>批量添加{textList.find(item => item.value === "description")?.label}} {textList.some(item => item.value === "title") && { setDesVisible(true); setAddStitle(textList.find(item => item.value === "description")?.label) }}>批量添加{textList.find(item => item.value === "description")?.label}} } } visible={visible} onCancel={onClose} footer={null} width={800} className={`modalResetCss`} bodyStyle={{ padding: '0 0 40px', position: 'relative', borderRadius: '0 0 8px 8px' }} maskClosable={false} >
{ message.error(errorFields?.[0]?.errors?.[0]) }} initialValues={{ type: 0, textDto: [{}] }} onFinish={handleOk} > 文案分配规则} style={{ marginBottom: 0 }} rules={[{ required: true, message: '请选择文案分配规则!' }]}> { let value = e.target.value let count = dynamicMaterialDTos.dynamicGroup.length let oldtextDto: PULLIN.TextDtoProps[] = JSON.parse(JSON.stringify(textDto)) let length = oldtextDto.length if (value === 0) { oldtextDto = [textDto[0] || {}] } else if (value === 1) { if (count > length) { oldtextDto = oldtextDto.concat(Array(count - length).fill({})) } else { oldtextDto = oldtextDto.slice(0, count) } } else if (value === 2) { if (count < length) { oldtextDto = oldtextDto.slice(0, count) } } form.setFieldsValue({ textDto: oldtextDto }) }}> {TextTypeList.filter(item => mediaType !== 1 ? item.value !== 4 : true).map(item => {item.label})} {(fields, { add, remove }) => (<> {fields.map(({ key, name, ...restField }, num) => ( {type === 1 ? 创意组{num + 1} : type === 0 ? null : 文案组{num + 1}} {type === 1 && showMaterial(num)} } className="cardResetCss" style={{ marginTop: 10, width: '100%' }} key={key} extra={([3, 2, 4].includes(type) && textDto?.length > 1) && remove(name)} > } >
{textList.map(item => { return {item.label}} name={[name, item.value]} key={key} style={{ marginBottom: 0, width: '100%' }} rules={[{ required: item.required, message: '请输入正确的' + item.label, validator: (rule, value) => { if (!value) { return Promise.reject() } else if (!value.match(RegExp(item.restriction.textRestriction.textPattern))) { return Promise.reject() } else if (txtLength(value) > item.restriction.textRestriction.maxLength) { return Promise.reject() } return Promise.resolve() } }]} > })}
))} {[3, 2, 4].includes(type) && !(type === 2 && textDto.length >= dynamicMaterialDTos.dynamicGroup.length) && } )}
{/* 批量添加 */} {desVisible && { setDesVisible(false) setAddStitle(undefined) }} onChange={(value) => { if (value) { let valList = value .split(/\r?\n/) // 按换行符分割字符串 .map(line => line.trim()) // 去除每行的首尾空白 .filter(line => line !== ''); // 过滤掉空行 let fieldData = textList.find(item => item.label === addSTitle) let count = dynamicMaterialDTos.dynamicGroup.length if (type === 1) { let len = 0 const newTextDto = textDto.map((item: { [x: string]: any }) => { if (fieldData?.value && !item?.[fieldData?.value] && valList.length >= len + 1) { return { ...item, [fieldData.value]: valList[len++] } } return item }) form.setFieldsValue({ textDto: newTextDto }) } else if (type === 2) { let len = 0 const newTextDto = textDto.map((item: { [x: string]: any }) => { if (fieldData?.value && !item?.[fieldData?.value] && valList.length >= len + 1) { return { ...item, [fieldData.value]: valList[len++] } } return item }) let diffTextDto: any[] = [] if (newTextDto.length < count && len < valList.length) { let diffCount = count - newTextDto.length let diffTextCount = valList.length - len let diff = 0 if (diffCount >= diffTextCount) { diff = diffTextCount } else { diff = diffCount } diffTextDto = Array(diff).fill('').map((item: { [x: string]: any }) => { if (fieldData?.value) { return { ...item, [fieldData.value]: valList[len++] } } return item }) } form.setFieldsValue({ textDto: [...newTextDto, ...diffTextDto] }) } else if ([3, 4].includes(type)) { let len = 0 const newTextDto = textDto.map((item: { [x: string]: any }) => { if (fieldData?.value && !item?.[fieldData?.value] && valList.length >= len + 1) { return { ...item, [fieldData.value]: valList[len++] } } return item }) let diffTextDto: any[] = [] if (len < valList.length) { let diff = valList.length - len diffTextDto = Array(diff).fill('').map((item: { [x: string]: any }) => { if (fieldData?.value) { return { ...item, [fieldData.value]: valList[len++] } } return item }) } form.setFieldsValue({ textDto: [...newTextDto, ...diffTextDto] }) } } setDesVisible(false) setAddStitle(undefined) }} />}
} export default React.memo(NewText)