index.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import React, { useContext, useState } from "react"
  2. import style from '../index.less'
  3. import { Button, Typography } from "antd"
  4. import { PlusCircleOutlined, PlusOutlined, RedoOutlined } from "@ant-design/icons"
  5. import SelectTarget from "./selectTarget"
  6. import { DispatchAddelivery } from ".."
  7. import { useModel } from "umi"
  8. import DataItem from "./dataItem"
  9. import AddTarget from "./addTarget"
  10. import GenerateTarget from "./generateTarget"
  11. const { Title } = Typography;
  12. /**
  13. * 定向
  14. * @returns
  15. */
  16. const Target: React.FC = () => {
  17. /***************************************/
  18. const { geoLocationList, modelList } = useModel('useLaunchV3.useTargeting')
  19. const { addelivery, setAddelivery, clearData, putInType, setIsDqSubmit } = useContext(DispatchAddelivery)!;
  20. const { targeting, adgroups } = addelivery
  21. const [addVisible, setAddVisible] = useState<boolean>(false)
  22. const [addTemVisible, setAddTemVisible] = useState<boolean>(false)
  23. const [modifyDta, setModifyDta] = useState<any>()
  24. const [modifyLength, setModifyLength] = useState<number>()
  25. const [copyDta, setCopyDta] = useState<any>()
  26. const [copyVisible, setCopyVisible] = useState<boolean>(false)
  27. /***************************************/
  28. return <>
  29. <div className={`${style.settingsBody_content_row} ${style.row2}`}>
  30. <div className={style.title}>
  31. <span>定向 <span className={style.selected}>已选 {targeting?.length || 0}</span></span>
  32. {targeting?.length > 0 && <Button
  33. type="link"
  34. size="small"
  35. style={{ fontSize: 11, padding: 0 }}
  36. onClick={() => {
  37. setAddelivery({ ...addelivery, targeting: [] })
  38. setIsDqSubmit?.(false)
  39. }}
  40. ><RedoOutlined />清空</Button>}
  41. </div>
  42. <div className={style.detail}>
  43. <div className={style.detail_body}>
  44. {targeting?.length > 0 && <>
  45. <Title level={5} style={{ fontSize: 12 }}>全部相同</Title>
  46. {targeting?.map((item: { targetingName: any; targeting: any, taskType: 'NOVEL' | 'GAME', id?: number }, index: number) => <div key={index}>
  47. <DataItem
  48. geoLocationList={geoLocationList}
  49. modelList={modelList}
  50. key={index}
  51. taksType={item.taskType || putInType}
  52. targeting={{ targetingName: item.targetingName, ...item.targeting }}
  53. onClear={() => {
  54. let newTargeting: any[] = JSON.parse(JSON.stringify(targeting))
  55. setIsDqSubmit?.(false)
  56. setAddelivery({ ...addelivery, targeting: newTargeting.filter((_, i) => index !== i) })
  57. }}
  58. onModify={() => {
  59. setModifyLength(index)
  60. setModifyDta({ targetingName: item?.id ? ('修_' + item.targetingName) : item.targetingName, ...item.targeting })
  61. setAddTemVisible(true)
  62. }}
  63. onCopy={() => {
  64. setCopyDta(item)
  65. setCopyVisible(true)
  66. }}
  67. />
  68. </div>)}
  69. </>}
  70. </div>
  71. <div className={style.detail_footer}>
  72. <Button
  73. type="link"
  74. icon={<PlusOutlined />}
  75. style={{ padding: 0, fontSize: 12 }}
  76. onClick={() => {
  77. setModifyDta(undefined)
  78. setAddTemVisible(true)
  79. setModifyLength(undefined)
  80. }}
  81. disabled={!(adgroups && Object.keys(adgroups)?.length > 0)}
  82. >
  83. 新增
  84. </Button>
  85. <Button disabled={!(adgroups && Object.keys(adgroups)?.length > 0)} type="link" icon={<PlusCircleOutlined />} style={{ padding: 0, fontSize: 12 }} onClick={() => setAddVisible(true)}>添加</Button>
  86. </div>
  87. </div>
  88. </div>
  89. {/* 添加定向 */}
  90. {addVisible && <SelectTarget
  91. value={targeting?.filter(item => item?.id)}
  92. visible={addVisible}
  93. putInType={putInType}
  94. onClose={() => {
  95. setAddVisible(false)
  96. }}
  97. onChange={(target) => {
  98. // 获取当前新增的,不是模板复制的全是当前和模板没关系
  99. let currentTarget = targeting?.filter((item: { id: any }) => !item?.id) || []
  100. setAddelivery({ ...addelivery, targeting: [...target, ...currentTarget] })
  101. setAddVisible(false)
  102. clearData()
  103. setIsDqSubmit?.(false)
  104. }}
  105. />}
  106. {/* 新增修改定向模板 */}
  107. {addTemVisible && <AddTarget
  108. value={modifyDta}
  109. isBackVal={true}
  110. putInType={putInType}
  111. visible={addTemVisible}
  112. onClose={() => {
  113. setAddTemVisible(false)
  114. setModifyDta(undefined)
  115. }}
  116. onChange={(newTargeting) => {
  117. console.log('----->', newTargeting)
  118. setAddTemVisible(false)
  119. setModifyDta(undefined)
  120. let newTarget: any[] = JSON.parse(JSON.stringify(targeting || []))
  121. if (modifyLength !== undefined) {
  122. newTarget[modifyLength] = newTargeting
  123. } else {
  124. newTarget.push(newTargeting)
  125. }
  126. setModifyLength(undefined)
  127. setAddelivery({ ...addelivery, targeting: newTarget })
  128. clearData()
  129. setIsDqSubmit?.(false)
  130. }}
  131. />}
  132. {/* 一键生成 */}
  133. {copyVisible && <GenerateTarget
  134. target={copyDta}
  135. visible={copyVisible}
  136. onClose={() => {
  137. setCopyDta(undefined)
  138. setCopyVisible(false)
  139. }}
  140. onChange={(value) => {
  141. let newTarget: any[] = JSON.parse(JSON.stringify(targeting || []))
  142. newTarget = newTarget.concat(value)
  143. setCopyDta(undefined)
  144. setCopyVisible(false)
  145. setAddelivery({ ...addelivery, targeting: newTarget })
  146. clearData()
  147. setIsDqSubmit?.(false)
  148. }}
  149. />}
  150. </>
  151. }
  152. export default React.memo(Target)