creativeTemplateContent.tsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import { Button, Card, Form, Radio, Space, Tooltip } from "antd"
  2. import React, { useContext, useMemo } from "react"
  3. import { DispatchDynamic } from "./newDynamic";
  4. import New1Radio from "@/pages/launchSystemV3/components/New1Radio";
  5. import { MinusCircleOutlined, PlusOutlined } from "@ant-design/icons";
  6. import BrandImage from "@/pages/launchSystemV3/components/BrandImage";
  7. import { SelectProfiles } from "@/pages/launchSystemV3/tencenTasset/profiles";
  8. import { PAGE_TYPE_ENUM } from "../../const";
  9. /**
  10. * 创意内容
  11. * @returns
  12. */
  13. const CreativeTemplateContent: React.FC<{ automaticSiteEnabled: boolean, putInType?: 'NOVEL' | 'GAME' }> = ({ automaticSiteEnabled, putInType }) => {
  14. /******************************************/
  15. const { creativeComponents, form, adgroups: { siteSet } } = useContext(DispatchDynamic)!;
  16. const pageType = Form.useWatch(['jumpInfo', 'pageType'], form)
  17. const pageSpec = Form.useWatch('pageSpec', form)
  18. const deliveryMode = Form.useWatch('deliveryMode', form)
  19. const creativeTemplateId = Form.useWatch('creativeTemplateId', form)
  20. const linkNameTypeOld = Form.useWatch(['textLink', 'value', 'linkNameType'], form)
  21. const buttonTextOld = Form.useWatch(['actionButton', 'value', 'buttonText'], form)
  22. /******************************************/
  23. const content = useMemo(() => {
  24. let brand;
  25. let enumeration: PULLIN.DataType[] = []
  26. let pageTypeList: PULLIN.DataType[] = []
  27. let jumpInfoNumber = 1
  28. Object.keys(creativeComponents).forEach(key => {
  29. switch (key) {
  30. case 'brand':
  31. brand = creativeComponents[key]
  32. let page_type = brand.children.page_type
  33. let typeList = ["PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL", "PAGE_TYPE_H5_PROFILE", "PAGE_TYPE_NOT_USED", "PAGE_TYPE_WECHAT_CHANNELS_PROFILE"]
  34. enumeration = (page_type.enumProperty.enumeration as { value: string, description: string }[]).filter((item: { value: string; }) => typeList.includes(item.value)).map(item => ({ label: item.value === 'PAGE_TYPE_NOT_USED' ? '品牌形象' : item.description, value: item.value }))
  35. break
  36. case 'jump_info':
  37. let jump_info = creativeComponents[key]
  38. jumpInfoNumber = jump_info?.arrayProperty?.maxNumber || 1
  39. let jumpInfoPageType = jump_info.children.page_type
  40. pageTypeList = (jumpInfoPageType.enumProperty.enumeration as { value: string, description: string }[]).filter(item => !["PAGE_TYPE_WECHAT_CANVAS_MINI_PROGRAM", "PAGE_TYPE_H5", "PAGE_TYPE_WECHAT_SIMPLE_CANVAS", "PAGE_TYPE_APP_DEEP_LINK"].includes(item.value)).map(item => ({ label: item.description, value: item.value, disabled: !["PAGE_TYPE_WECHAT_CANVAS", "PAGE_TYPE_OFFICIAL", "PAGE_TYPE_WECHAT_MINI_PROGRAM", "PAGE_TYPE_WECHAT_MINI_GAME"].includes(item.value) }))
  41. break
  42. }
  43. })
  44. if (!pageTypeList.some(item => item.value === "PAGE_TYPE_OFFICIAL") && creativeTemplateId !== 910 && putInType !== 'GAME') {
  45. pageTypeList.push({ label: "灵鹊落地页", value: "PAGE_TYPE_OFFICIAL", disabled: false })
  46. }
  47. return <>
  48. {brand && <Form.Item style={{ marginBottom: 0 }}>
  49. <Form.Item name={['jumpInfo', 'pageType']} label={<strong>品牌形象跳转</strong>} rules={[{ required: true, message: '请选择品牌形象跳转!' }]} tooltip="品牌形象将在各流量版位下广告外层创意展示。此外,朋友圈广告在此基础上支持跳转,点击品牌形象可跳转到品牌简介页或搜一搜品牌主页">
  50. <New1Radio data={enumeration} onChange={() => form.setFieldsValue({ brand: undefined, creativeFirstReplyDTO: undefined })} />
  51. </Form.Item>
  52. {['PAGE_TYPE_H5_PROFILE'].includes(pageType) ? <div style={{ margin: '0 0 10px', backgroundColor: '#fafafb', padding: '8px 16px 8px', borderRadius: 8 }}>
  53. <Form.Item name='brand' style={{ marginBottom: 0 }} rules={[{ required: true, message: '请选择一个头像及昵称跳转页,与广告创意一起展示' }]}>
  54. <SelectProfiles />
  55. </Form.Item>
  56. </div> : ["PAGE_TYPE_NOT_USED"].includes(pageType) && <div style={{ margin: '0 0 10px', backgroundColor: '#fafafb', padding: '8px 16px 8px', borderRadius: 8 }}>
  57. <Form.Item name='brand' style={{ marginBottom: 0 }} rules={[{ required: true, message: '请选择一个品牌形象,与广告创意一起展示' }]}>
  58. <BrandImage />
  59. </Form.Item>
  60. </div>}
  61. </Form.Item>}
  62. <Form.Item style={{ marginBottom: 0 }} label={<strong>跳转类型({pageSpec?.length || 1}/{jumpInfoNumber})</strong>}>
  63. <Form.List name="pageSpec">
  64. {(fields, { add, remove }) => (
  65. <>
  66. {fields.map(({ key, name, ...restField }, index) => (
  67. <Space key={key} style={{ display: 'flex', marginBottom: 8, width: '100%' }} align="baseline">
  68. <Space direction="vertical" style={{ width: '100%' }}>
  69. <Form.Item
  70. {...restField}
  71. name={[name, 'pageType']}
  72. style={{ marginBottom: 0 }}
  73. rules={[{ required: true, message: '请选择跳转类型!' }]}
  74. help={'注意"灵鹊落地页(官方落地页)"该类型需要申请权限'}
  75. validateStatus="warning"
  76. >
  77. <New1Radio
  78. data={pageTypeList}
  79. onChange={(pageType) => {
  80. let pageSpecNew: any = []
  81. if (pageType === 'PAGE_TYPE_WECHAT_CANVAS') {
  82. pageSpecNew = pageSpec.map(() => ({ pageType, overrideCanvasHeadOption: 'OPTION_CREATIVE_OVERRIDE_CANVAS' }))
  83. } else {
  84. pageSpecNew = pageSpec.map(() => ({ pageType }))
  85. }
  86. form.setFieldsValue({ pageSpec: pageSpecNew })
  87. let values: any = {}
  88. Object.keys(creativeComponents).forEach(key => {
  89. switch (key) {
  90. case 'text_link':// 朋友圈文字链
  91. let textLink = creativeComponents[key]
  92. let linkNameType = textLink?.children?.link_name_type
  93. let linkNameEnumeration = (linkNameType?.enumProperty?.enumeration as { value: string, description: string }[]).map(item => ({ label: item.description, value: item.value }))
  94. values.textLink = {
  95. value: {
  96. linkNameType: linkNameTypeOld || linkNameEnumeration?.[0]?.value,
  97. jumpInfo: {
  98. pageType: pageType
  99. }
  100. }
  101. }
  102. break
  103. case 'action_button':
  104. let actionButton = creativeComponents[key]
  105. let buttonText = actionButton.children.button_text
  106. let butttonTextEnumeration = (buttonText.enumProperty.enumeration as { value: string }[]).map(item => ({ label: item.value, value: item.value }))
  107. let enumeration = actionButton.children?.page_type?.enumProperty?.enumeration
  108. let jumpInfo: any = {}
  109. if (enumeration) {
  110. if (enumeration.some((item: { value: any; }) => item.value === pageType)) {
  111. jumpInfo = {
  112. pageType: pageType
  113. }
  114. } else {
  115. jumpInfo = {
  116. pageType: 'PAGE_TYPE_WECHAT_FOCUS_DAILOG'
  117. }
  118. }
  119. }
  120. values.actionButton = {
  121. value: {
  122. buttonText: buttonTextOld || butttonTextEnumeration?.[0]?.value,
  123. jumpInfo
  124. }
  125. }
  126. if (actionButton.required) {
  127. values.actionButtonShow = true
  128. }
  129. break
  130. }
  131. })
  132. form.setFieldsValue(values)
  133. }}
  134. />
  135. </Form.Item>
  136. {(((deliveryMode === 'DELIVERY_MODE_CUSTOMIZE' ? siteSet?.some((name: string) => name === 'SITE_SET_MOMENTS') : true) || automaticSiteEnabled) && pageSpec?.[index]?.pageType === 'PAGE_TYPE_WECHAT_CANVAS') && <div style={{ margin: 0, backgroundColor: '#fafafb', padding: '8px 16px 8px', borderRadius: 8 }}>
  137. <Form.Item
  138. name={[name, 'overrideCanvasHeadOption']}
  139. style={{ marginBottom: 0 }}
  140. >
  141. <Radio.Group>
  142. {/* {deliveryMode === 'DELIVERY_MODE_CUSTOMIZE' && <Radio value="OPTION_KEEP_DIFFERENT">不替换原生推广页顶部素材</Radio>}
  143. <Radio disabled={deliveryMode === 'DELIVERY_MODE_COMPONENT'} value="OPTION_CREATIVE_OVERRIDE_CANVAS">使用外层创意素材替换原生推广页顶部素材</Radio> */}
  144. <Radio value="OPTION_KEEP_DIFFERENT">不替换原生推广页顶部素材</Radio>
  145. <Radio value="OPTION_CREATIVE_OVERRIDE_CANVAS">使用外层创意素材替换原生推广页顶部素材</Radio>
  146. </Radio.Group>
  147. </Form.Item>
  148. </div>}
  149. </Space>
  150. {pageSpec?.length > 1 && <MinusCircleOutlined onClick={() => remove(name)} />}
  151. </Space>
  152. ))}
  153. {pageSpec?.length < jumpInfoNumber && <Form.Item>
  154. {pageSpec?.[0]?.pageType === "PAGE_TYPE_WECHAT_MINI_GAME" ? <Tooltip placement="top" title={`「${PAGE_TYPE_ENUM[pageSpec?.[0]?.pageType as keyof typeof PAGE_TYPE_ENUM]}」仅支持单独使用,如需添加多组,请修改跳转类型。`}>
  155. <Button type="dashed" disabled block icon={<PlusOutlined />}>
  156. 还可以添加 {jumpInfoNumber - pageSpec?.length} 组
  157. </Button>
  158. </Tooltip> : <Button type="dashed" onClick={() => add({ pageId: null, pageType: pageSpec?.[0]?.pageType || 'PAGE_TYPE_WECHAT_CANVAS', overrideCanvasHeadOption: pageSpec?.[0]?.overrideCanvasHeadOption || 'OPTION_CREATIVE_OVERRIDE_CANVAS' })} block icon={<PlusOutlined />}>
  159. 还可以添加 {jumpInfoNumber - pageSpec?.length} 组
  160. </Button>}
  161. </Form.Item>}
  162. </>
  163. )}
  164. </Form.List>
  165. </Form.Item>
  166. </>
  167. }, [creativeComponents, pageType, pageSpec, siteSet, creativeTemplateId, putInType])
  168. return <Card
  169. title={<strong style={{ fontSize: 18 }}>创意内容</strong>}
  170. className="cardResetCss"
  171. >
  172. {content}
  173. </Card>
  174. }
  175. export default React.memo(CreativeTemplateContent)