index.tsx 10 KB

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