index.tsx 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import { CreateAdProps } from "@/services/launchAdq/createAd"
  2. import { BaseResult } from "@ahooksjs/use-request/lib/types"
  3. import { Col, Select, Space, Spin, Tooltip } from "antd"
  4. import React, { useCallback, useState } from "react"
  5. import { ModalConfig } from "../ad"
  6. import style from '../index.less'
  7. import AdcreativeCol from "../adcreativeCol"
  8. import CreativePup from "./modal"
  9. import Material from "./modal/material"
  10. import Copywriting from "./modal/copywriting"
  11. type Props = {
  12. queryForm: Partial<CreateAdProps>,
  13. setQueryForm: React.Dispatch<React.SetStateAction<Partial<CreateAdProps>>>,
  14. getSysAdcreative: BaseResult<any, any>,
  15. clearData: () => void,
  16. targetKey: string,
  17. }
  18. const CreativeCL: React.FC<Props> = (props) => {
  19. /********************************/
  20. const { queryForm, getSysAdcreative, setQueryForm, clearData, targetKey } = props
  21. const [adModalConfig, setAdModalConfig] = useState<ModalConfig>({//新建广告弹窗
  22. visible: false,
  23. type: 'add'
  24. })
  25. /********************************/
  26. // 设置变量
  27. const handleAdModalConfig = useCallback((arg: ModalConfig) => {
  28. setAdModalConfig({ ...adModalConfig, ...arg })
  29. }, [adModalConfig])
  30. return <>
  31. <Col className={style.conRightBorder}>
  32. <div className={style.top}>创意基本信息</div>
  33. <div className={style.center}>
  34. {
  35. queryForm?.taskMediaMaps?.filter((item, index) => index === 0)?.map((item, index) => {
  36. return <Spin spinning={getSysAdcreative.loading} key={index}>
  37. <div className={style.centerContent}>
  38. {item.sysAdcreative && <AdcreativeCol data={item.sysAdcreative} />}
  39. </div>
  40. </Spin>
  41. })
  42. }
  43. </div>
  44. <div className={style.bottom}>
  45. <Space size={20}>
  46. {queryForm?.sysAdgroup ? <>
  47. <span onClick={() => { handleAdModalConfig(queryForm?.taskMediaMaps && queryForm?.taskMediaMaps[targetKey]?.sysAdcreative ? { visible: true, type: 'edit' } : { visible: true, type: 'add' }) }}>{queryForm?.taskMediaMaps && queryForm?.taskMediaMaps[targetKey]?.sysAdcreative ? '编辑' : '添加'}</span>
  48. </> : <Tooltip title="请先设置广告">
  49. <span>添加</span>
  50. </Tooltip>}
  51. </Space>
  52. </div>
  53. {/* 创建创意 */}
  54. {adModalConfig.visible && <CreativePup visible={adModalConfig.visible} type={adModalConfig.type} PupFn={handleAdModalConfig} callback={(values: any, material: any, textData: any[]) => {
  55. let arr = queryForm.taskMediaMaps || []
  56. let adqPageArr: any = queryForm.adqPageList || []
  57. let pageArr: any = queryForm.pageList || []
  58. adqPageArr[targetKey as string] = null//清除adq落地页
  59. pageArr[targetKey as string] = null//清除本地落地页
  60. arr[targetKey] = { sysAdcreative: values }
  61. setQueryForm({ ...queryForm, taskMediaMaps: arr, adqPageList: adqPageArr, pageList: pageArr, materialData: material, materials: [], textData, texts: [] }); clearData();
  62. handleAdModalConfig({ visible: false, dataInfo: null, type: 'add' })
  63. }} dataInfo={queryForm?.taskMediaMaps && queryForm?.taskMediaMaps[targetKey]?.sysAdcreative} queryForm={queryForm} />}
  64. </Col>
  65. <Col className={style.conRightBorder}>
  66. <div className={style.top}>
  67. <strong style={{ fontSize: 15 }}>创意素材</strong>
  68. <span>已选:{queryForm?.materials?.length || 0}</span>
  69. </div>
  70. <div className={style.center}>
  71. <div className={queryForm?.materialData && queryForm?.materialData[0]?.name === 'image_list' && queryForm?.materialData[0]?.arrayProperty?.minNumber > 1 ? style.imgListGroup : style.otherGroup}>
  72. {queryForm?.materials?.map((item: any, index: number) => {
  73. let keys = Object.keys(item)
  74. if (keys?.includes('imageUrlList')) {
  75. return <div key={index} className={style.group}>
  76. {item?.imageUrlList?.map((url: string, index: number) => <div key={index}><img src={url} /></div>)}
  77. </div>
  78. } else if (keys?.includes('elementStory')) {
  79. return <div key={index} className={style.group}>
  80. {item?.elementStory?.map((item: { imageUrl: string }, index: number) => <div key={index}><img src={item.imageUrl} /></div>)}
  81. </div>
  82. } else {
  83. if (keys?.length > 1) {
  84. return <div key={index} className={style.otherGroup}>
  85. {keys?.includes('imageUrl') && <div className={style.group}><img src={item.imageUrl} /></div>}
  86. {keys?.includes('videoUrl') && <div className={style.group}><video src={item.videoUrl} /></div>}
  87. {keys?.includes('shortVideo1Url') && <div className={style.group}><video src={item.shortVideo1Url} /></div>}
  88. </div>
  89. } else {
  90. if (keys?.includes('imageUrl')) {
  91. return <div key={index} className={style.group}><img src={item.imageUrl} /></div>
  92. } else if (keys?.includes('videoUrl')) {
  93. return <div key={index} className={style.group}><video src={item.videoUrl} /></div>
  94. } else if (keys?.includes('shortVideo1Url')) {
  95. return <div key={index} className={style.group}><video src={item.shortVideo1Url} /></div>
  96. }
  97. }
  98. return null
  99. }
  100. })}
  101. </div>
  102. </div>
  103. <div className={style.bottom}>
  104. <Space size={20}>
  105. {queryForm?.taskMediaMaps && queryForm?.taskMediaMaps?.length > 0 ? <>
  106. <Material
  107. onChange={(data) => {
  108. setQueryForm({ ...queryForm, materials: data })
  109. }}
  110. material={queryForm?.materialData}
  111. value={queryForm?.materials}
  112. sysAdcreative={queryForm?.taskMediaMaps[0]?.sysAdcreative}
  113. />
  114. </> : <Tooltip title="请先设置创意">
  115. <span>添加</span>
  116. </Tooltip>}
  117. </Space>
  118. </div>
  119. {!(queryForm?.materialData && queryForm?.materialData?.length > 0) && <div className={style.noMaterial}>无需配置素材</div>}
  120. </Col>
  121. <Col className={style.conRightBorder} style={{ maxWidth: '25%' }}>
  122. <div className={style.top}>
  123. <strong style={{ fontSize: 15 }}>创意文案</strong>
  124. <span>已选:{queryForm?.texts?.length || 0}</span>
  125. </div>
  126. <div className={style.center}>
  127. <Select style={{ minWidth: 150 }} value={queryForm.model} onChange={(e) => { setQueryForm({ ...queryForm, model: e }) }} dropdownMatchSelectWidth={false}>
  128. <Select.Option value="cross">素材文案叉乘</Select.Option>
  129. <Select.Option value="corres">一一对应</Select.Option>
  130. </Select>
  131. {queryForm?.texts?.some((item: any) => item?.title) && <div className={style.accName} style={{ fontWeight: 800 }}>标题</div>}
  132. {queryForm?.texts?.map((item: any, index: number) => {
  133. if (item?.title) {
  134. return <div className={style.accCon} key={index}><span className={style.title}>{item?.title}</span> </div>
  135. } else {
  136. return null
  137. }
  138. })}
  139. {queryForm?.texts?.some((item: any) => item?.description) && <div className={style.accName} style={{ fontWeight: 800 }}>广告详情</div>}
  140. {queryForm?.texts?.map((item: any, index: number) => {
  141. if (item?.description) {
  142. return <div className={style.accCon} key={index}><span className={style.title}>{item?.description}</span></div>
  143. } else {
  144. return null
  145. }
  146. })}
  147. </div>
  148. <div className={style.bottom}>
  149. <Space size={20}>
  150. {queryForm?.taskMediaMaps && queryForm?.taskMediaMaps?.length > 0 ? <>
  151. <Copywriting
  152. textData={queryForm.textData}
  153. sysAdcreative={queryForm?.taskMediaMaps[0]?.sysAdcreative}
  154. value={queryForm?.texts}
  155. onChange={(data) => {
  156. setQueryForm({ ...queryForm, texts: data })
  157. }}
  158. />
  159. </> : <Tooltip title="请先设置创意">
  160. <span>添加</span>
  161. </Tooltip>}
  162. </Space>
  163. </div>
  164. {!(queryForm?.textData && queryForm.textData?.length > 0) && <div className={style.noMaterial}>无需配置文案</div>}
  165. </Col>
  166. </>
  167. }
  168. export default React.memo(CreativeCL)