index.tsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import { CreateAdProps } from "@/services/launchAdq/createAd"
  2. import { BaseResult } from "@ahooksjs/use-request/lib/types"
  3. import { CloseOutlined } from "@ant-design/icons"
  4. import { Button, Col, Empty, Popover, Space, Spin, Tooltip } from "antd"
  5. import React, { useCallback, useState } from "react"
  6. import TargetingModal from "../../../components/targetingModal"
  7. import TargetingPup from "./modal"
  8. import TargetingTooltip from "../../../components/targetingTooltip"
  9. import CrowdPackModal from "../../../components/crowdPackModal"
  10. import style from '../index.less'
  11. import { ModalConfig } from "./modal"
  12. type Props = {
  13. queryForm: Partial<CreateAdProps>,
  14. setQueryForm: React.Dispatch<React.SetStateAction<Partial<CreateAdProps>>>,
  15. setAccountCreateLogs: React.Dispatch<React.SetStateAction<{
  16. adAccountId: number;
  17. id: number;
  18. userActionSetsList?: number | undefined;
  19. productList?: any;
  20. conversionList?: any;
  21. customAudienceList?: any;
  22. excludedCustomAudienceList?: any;
  23. pageList?: any;
  24. }[]>>,
  25. getSysAdgroups: BaseResult<any, any>,
  26. getsysTargeting: BaseResult<any, any>,
  27. accountCreateLogs: any[],
  28. geoLocationList: any[],
  29. modelList: any[],
  30. clearData: () => void,
  31. cpDel: (index: number, num: number, key: string) => void,
  32. }
  33. function TargetIng(props: Props) {
  34. let { queryForm, getSysAdgroups, getsysTargeting, accountCreateLogs, geoLocationList, modelList, setQueryForm, clearData, cpDel, setAccountCreateLogs } = props
  35. const [adModalConfig, setAdModalConfig] = useState<ModalConfig>({//新建广告弹窗
  36. visible: false,
  37. type: 'add'
  38. })
  39. const [dxVisible, setDxVisible] = useState<boolean>(false) // 选择定向弹窗控制
  40. const [cpVisible, setCpVisible] = useState<boolean>(false) // 选择设置名称弹窗控制
  41. // 设置变量
  42. const handleAdModalConfig = useCallback((arg: ModalConfig) => {
  43. setAdModalConfig({ ...adModalConfig, ...arg })
  44. }, [adModalConfig])
  45. // 获取定向详情
  46. const getInfo = useCallback((sysTargetingId) => {
  47. getsysTargeting.run(sysTargetingId).then(res=>{
  48. setQueryForm({ ...queryForm, sysTargetingId: sysTargetingId,sysTargeting:{...res,isTemplate:false} });
  49. setDxVisible(false);
  50. clearData()
  51. })
  52. }, [queryForm])
  53. return <Col className={style.conRightBorder}>
  54. <div className={style.top}>
  55. 定向
  56. {getSysAdgroups?.data?.bidMode === 'BID_MODE_CPM' && <>{accountCreateLogs?.length > 0 && queryForm?.sysTargetingId ? <Button type="link" style={{ fontSize: 12, padding: 0 }} onClick={() => setCpVisible(true)}>选择定向包</Button> : <Tooltip title={accountCreateLogs?.length > 0 ? `请先添加定向` : `请先选择媒体账户`}>
  57. <Button type="link" style={{ fontSize: 12, padding: 0 }}>选择定向包</Button>
  58. </Tooltip>}</>}
  59. {queryForm.sysTargeting && <a onClick={() => {
  60. setQueryForm({ ...queryForm, sysTargeting: undefined, sysTargetingId: undefined})
  61. setAccountCreateLogs([])
  62. }}>清空</a>}
  63. </div>
  64. <div className={style.center}>
  65. <Spin spinning={getsysTargeting.loading}>
  66. <div className={style.centerContent}>
  67. {queryForm?.sysTargetingId ? <>
  68. {accountCreateLogs?.some((item: any) => item?.customAudienceList?.length > 0) ? <>
  69. {queryForm.sysTargeting && <Popover
  70. content={<div className={style.popover}>
  71. <TargetingTooltip data={queryForm.sysTargeting} geoLocationList={geoLocationList} modelList={modelList} />
  72. </div>}
  73. trigger="hover"
  74. placement="right"
  75. >
  76. <div className={style.popoverContent}>
  77. <div>定向名称: <span>{queryForm?.sysTargeting?.targetingName}</span></div>
  78. <div>定向描述: <span>{queryForm?.sysTargeting?.description || '<空>'}</span></div>
  79. </div>
  80. </Popover>}
  81. {accountCreateLogs?.map((item: any, index: number) => {
  82. if (item?.customAudienceList) {
  83. return <div className={style.acc} key={index}>
  84. <div className={style.accName} style={{ fontWeight: 800 }}>{item.adAccountId}</div>
  85. {item?.customAudienceList?.length > 0 && <>
  86. <div className={style.accName}>定向用户群</div>
  87. {
  88. item?.customAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
  89. return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
  90. cpDel(index, index1, 'customAudienceList')
  91. }} /></div>
  92. })
  93. }
  94. </>}
  95. {item?.excludedCustomAudienceList?.length > 0 && <>
  96. <div className={style.accName} style={{ marginTop: 5 }}>排除用户群</div>
  97. {
  98. item?.excludedCustomAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
  99. return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
  100. cpDel(index, index1, 'excludedCustomAudienceList')
  101. }} /></div>
  102. })
  103. }
  104. </>}
  105. </div>
  106. } else {
  107. return null
  108. }
  109. })}
  110. </> : <>
  111. <div>定向名称: <span>{queryForm?.sysTargeting?.targetingName}</span></div>
  112. <div>定向描述: <span>{queryForm?.sysTargeting?.description || '<空>'}</span></div>
  113. <TargetingTooltip data={queryForm?.sysTargeting} geoLocationList={geoLocationList} modelList={modelList} />
  114. </>}
  115. </> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
  116. </div>
  117. </Spin>
  118. </div>
  119. <div className={style.bottom}>
  120. <Space size={20}>
  121. <span onClick={() => { setDxVisible(true) }}>{queryForm?.sysTargeting ? '重选定向' : '选择定向'}</span>
  122. <span onClick={() => {handleAdModalConfig(queryForm?.sysTargeting ? { visible: true,type: 'edit' }:{ visible: true ,type: 'add'}) }}>{queryForm?.sysTargeting ? '编辑定向' : '新建定向'}</span>
  123. </Space>
  124. </div>
  125. {/* 选择定向 */}
  126. {dxVisible && <TargetingModal visible={dxVisible} onClose={() => setDxVisible(false)} onChange={getInfo} sysTargetingId={queryForm?.sysTargetingId} />}
  127. {/* 选择定向包 */}
  128. {cpVisible && <CrowdPackModal visible={cpVisible} data={accountCreateLogs} onClose={() => setCpVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setCpVisible(false); clearData() }} />}
  129. {/* 新建定向包 */}
  130. {adModalConfig.visible && <TargetingPup visible={adModalConfig.visible} PupFn={handleAdModalConfig} callback={(values: any) => {
  131. setQueryForm({ ...queryForm, sysTargeting: values, }); setDxVisible(false); clearData();
  132. handleAdModalConfig({ visible: false, dataInfo: null, type: 'add' })
  133. }} type={adModalConfig.type} dataInfo={queryForm.sysTargeting} />}
  134. </Col>
  135. }
  136. export default TargetIng