submit.tsx 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import { App, Button, Dropdown, Form, Input, message, Modal, Radio, Select } from "antd"
  2. import React, { useEffect, useState } from "react"
  3. import UploadImg from "../../components/materialMould/uploadImg"
  4. import UploadVideo from "../../components/materialMould/uploadVideo"
  5. import { CloseCircleOutlined, MinusOutlined, PlusOutlined } from '@ant-design/icons';
  6. import { useAjax } from "@/Hook/useAjax";
  7. import { createLandingPageApi, editLandingPageApi } from "../../API/miniProgramPages";
  8. interface Props {
  9. groupList: { label: string, value: number }[]
  10. corpList: { corpName: string, corpId: string, corpUserList: { corpUserName: string, corpUserId: string }[] }[]
  11. pageSpecs: TASK_MINI_PAGE_CREATE.PageSpecsProps
  12. visible?: boolean
  13. onChange?: () => void
  14. onClose?: () => void
  15. initialValues?: any
  16. }
  17. const Submit: React.FC<Props> = ({ corpList, visible, pageSpecs, onChange, onClose, groupList, initialValues }) => {
  18. /***********************************/
  19. const { message } = App.useApp();
  20. const [form] = Form.useForm();
  21. const corpId = Form.useWatch('corpId', form)
  22. const [corpUserList, setCorpUserList] = useState<{ corpUserName: string, corpUserId: string }[]>([])
  23. const createLandingPage = useAjax((params) => createLandingPageApi(params))
  24. const editLandingPage = useAjax((params) => editLandingPageApi(params))
  25. /***********************************/
  26. useEffect(() => {
  27. if (corpId) {
  28. setCorpUserList(corpList.find(item => item.corpId === corpId)?.corpUserList || [])
  29. } else {
  30. setCorpUserList([])
  31. }
  32. }, [corpList, corpId])
  33. const handleOk = () => {
  34. form.validateFields().then(valid => {
  35. const { bgColor, globalElementsSpecList, pageElementsSpecList } = pageSpecs
  36. let pageSpecsList = []
  37. let qrCodeFloatList: { siteId: number, urlList: string[] }[] = []
  38. if (globalElementsSpecList?.length > 0) {
  39. pageSpecsList = [...pageElementsSpecList.map(item => {
  40. delete (item as any)?.comptActive
  41. return item
  42. }), ...globalElementsSpecList.map(item => {
  43. delete item.comptActive
  44. return item
  45. })]
  46. const floatButton = globalElementsSpecList?.find(item => item.elementType === 'FLOAT_BUTTON')
  47. if (floatButton) {
  48. qrCodeFloatList = [{
  49. siteId: floatButton.id,
  50. urlList: floatButton.qrCodeFloatList
  51. }]
  52. }
  53. }
  54. const qrCodeList = pageElementsSpecList.filter(item => item.elementType === 'QR_CODE')?.map((item: TASK_MINI_PAGE_CREATE.QrCode) => ({ siteId: item.id, urlList: item.imageList }))
  55. const { pageName, ...v } = valid
  56. const params = {
  57. content: JSON.stringify({
  58. pageName,
  59. bgColor,
  60. elementsSpecList: pageSpecsList
  61. }),
  62. qrCodeFloatList,
  63. qrCodeList,
  64. ...v
  65. }
  66. if (initialValues?.id) {
  67. editLandingPage.run({ ...params, id: initialValues.id }).then(res => {
  68. if (res?.data) {
  69. message.success('修改成功')
  70. onChange?.()
  71. }
  72. })
  73. } else {
  74. createLandingPage.run(params).then(res => {
  75. if (res?.data) {
  76. message.success('新增成功')
  77. onChange?.()
  78. }
  79. })
  80. }
  81. }).catch(err => { })
  82. }
  83. return <Modal
  84. title={<strong>落地页基础配置</strong>}
  85. open={visible}
  86. onCancel={onClose}
  87. onOk={handleOk}
  88. width={750}
  89. confirmLoading={createLandingPage?.loading || editLandingPage?.loading}
  90. maskClosable={false}
  91. >
  92. <Form
  93. form={form}
  94. name="newPageLink"
  95. labelAlign='left'
  96. labelCol={{ span: 5 }}
  97. colon={false}
  98. scrollToFirstError={{
  99. behavior: 'smooth',
  100. block: 'center'
  101. }}
  102. onFinishFailed={({ errorFields }) => {
  103. message.error(errorFields?.[0]?.errors?.[0])
  104. }}
  105. onFinish={handleOk}
  106. initialValues={initialValues}
  107. >
  108. <Form.Item label={<strong>落地页名称</strong>} name="name" rules={[{ required: true, message: '请输入落地页名称!' }]}>
  109. <Input placeholder="请输入落地页名称" />
  110. </Form.Item>
  111. <Form.Item label={<strong>落地页标题</strong>} name="pageName" rules={[{ required: true, message: '请输入落地页标题!' }]}>
  112. <Input placeholder="请输入落地页标题" />
  113. </Form.Item>
  114. <Form.Item label={<strong>落地页备注</strong>} name="remark">
  115. <Input placeholder="请输入落地页备注" />
  116. </Form.Item>
  117. <Form.Item label={<strong>小程序预览AppId</strong>} name="previewAppId">
  118. <Input placeholder="请输入小程序预览AppId" />
  119. </Form.Item>
  120. <Form.Item label={<strong>企微主体</strong>} name="corpId" rules={[{ required: true, message: '请选择主体!' }]}>
  121. <Select
  122. placeholder='请选择主体'
  123. allowClear
  124. options={corpList.map(item => ({ label: item.corpName, value: item.corpId }))}
  125. showSearch
  126. filterOption={(input, option) =>
  127. (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
  128. }
  129. />
  130. </Form.Item>
  131. {corpId && <Form.Item label={<strong>企微客服号</strong>} name="corpUserIdList" rules={[{ required: true, message: '请选择企微客服号!' }]}>
  132. <Select
  133. placeholder='请选择企微客服号'
  134. allowClear
  135. options={corpUserList.map(item => ({ label: item.corpUserName, value: item.corpUserId }))}
  136. showSearch
  137. filterOption={(input, option) =>
  138. (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
  139. }
  140. mode="multiple"
  141. />
  142. </Form.Item>}
  143. <Form.Item label={<strong>书名</strong>} name="bookName">
  144. <Input placeholder="请输入书名名称" />
  145. </Form.Item>
  146. <Form.Item label={<strong>项目组</strong>} name="projectGroupIdList" rules={[{ required: true, message: '请选择项目组!' }]}>
  147. <Select
  148. placeholder='请选择项目组'
  149. allowClear
  150. options={groupList}
  151. showSearch
  152. mode="multiple"
  153. filterOption={(input, option) =>
  154. (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
  155. }
  156. />
  157. </Form.Item>
  158. </Form>
  159. </Modal>
  160. }
  161. export default React.memo(Submit)