index.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. const { Title } = Typography;
  11. /**
  12. * 定向
  13. * @returns
  14. */
  15. const Target: React.FC = () => {
  16. /***************************************/
  17. const { geoLocationList, modelList } = useModel('useLaunchV3.useTargeting')
  18. const { addelivery, setAddelivery, clearData } = useContext(DispatchAddelivery)!;
  19. const { targeting, adgroups } = addelivery
  20. const [addVisible, setAddVisible] = useState<boolean>(false)
  21. const [addTemVisible, setAddTemVisible] = useState<boolean>(false)
  22. const [modifyDta, setModifyDta] = useState<any>()
  23. const [modifyLength, setModifyLength] = useState<number>()
  24. /***************************************/
  25. return <>
  26. <div className={`${style.settingsBody_content_row} ${style.row2}`}>
  27. <div className={style.title}>
  28. <span>定向 <span className={style.selected}>已选 {targeting?.length || 0}</span></span>
  29. {targeting?.length > 0 && <Button type="link" size="small" style={{ fontSize: 11, padding: 0 }} onClick={() => setAddelivery({ ...addelivery, targeting: [] })}><RedoOutlined />清空</Button>}
  30. </div>
  31. <div className={style.detail}>
  32. <div className={style.detail_body}>
  33. {targeting?.length > 0 && <>
  34. <Title level={5} style={{ fontSize: 12 }}>全部相同</Title>
  35. {targeting?.map((item: { targetingName: any; targeting: any, id?: number }, index: number) => <div key={index}>
  36. <DataItem
  37. geoLocationList={geoLocationList}
  38. modelList={modelList}
  39. key={index}
  40. targeting={{ targetingName: item.targetingName, ...item.targeting }}
  41. onClear={() => {
  42. let newTargeting: any[] = JSON.parse(JSON.stringify(targeting))
  43. setAddelivery({ ...addelivery, targeting: newTargeting.filter((_, i) => index !== i) })
  44. }}
  45. onModify={() => {
  46. setModifyLength(index)
  47. setModifyDta({ targetingName: item?.id ? ('修_' + item.targetingName) : item.targetingName, ...item.targeting })
  48. setAddTemVisible(true)
  49. }}
  50. />
  51. </div>)}
  52. </>}
  53. </div>
  54. <div className={style.detail_footer}>
  55. <Button
  56. type="link"
  57. icon={<PlusOutlined />}
  58. style={{ padding: 0, fontSize: 12 }}
  59. onClick={() => {
  60. setModifyDta(undefined)
  61. setAddTemVisible(true)
  62. setModifyLength(undefined)
  63. }}
  64. disabled={!(adgroups && Object.keys(adgroups)?.length > 0)}
  65. >
  66. 新增
  67. </Button>
  68. <Button disabled={!(adgroups && Object.keys(adgroups)?.length > 0)} type="link" icon={<PlusCircleOutlined />} style={{ padding: 0, fontSize: 12 }} onClick={() => setAddVisible(true)}>添加</Button>
  69. </div>
  70. </div>
  71. </div>
  72. {/* 添加定向 */}
  73. {addVisible && <SelectTarget
  74. value={targeting?.filter(item => item?.id)}
  75. visible={addVisible}
  76. onClose={() => {
  77. setAddVisible(false)
  78. }}
  79. onChange={(target) => {
  80. // 获取当前新增的,不是模板复制的全是当前和模板没关系
  81. let currentTarget = targeting?.filter((item: { id: any }) => !item?.id) || []
  82. setAddelivery({ ...addelivery, targeting: [...target, ...currentTarget] })
  83. setAddVisible(false)
  84. }}
  85. />}
  86. {/* 新增修改定向模板 */}
  87. {addTemVisible && <AddTarget
  88. value={modifyDta}
  89. isBackVal={true}
  90. visible={addTemVisible}
  91. onClose={() => {
  92. setAddTemVisible(false)
  93. setModifyDta(undefined)
  94. }}
  95. onChange={(newTargeting) => {
  96. setAddTemVisible(false)
  97. setModifyDta(undefined)
  98. let newTarget: any[] = JSON.parse(JSON.stringify(targeting || []))
  99. if (modifyLength !== undefined) {
  100. newTarget[modifyLength] = newTargeting
  101. } else {
  102. newTarget.push(newTargeting)
  103. }
  104. setModifyLength(undefined)
  105. setAddelivery({ ...addelivery, targeting: newTarget })
  106. clearData()
  107. }}
  108. />}
  109. </>
  110. }
  111. export default React.memo(Target)