BuyModel.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import React, { useEffect, useState } from 'react'
  2. import useRequest from '@ahooksjs/use-request'
  3. import { Button, Form, Input, message, Row, Modal, Upload } from 'antd'
  4. import { LoadingOutlined, PlusOutlined } from '@ant-design/icons'
  5. import type { UploadChangeParam } from 'antd/es/upload'
  6. import type { UploadFile, UploadProps } from 'antd/es/upload/interface'
  7. import CheckboxSvg from 'assets/checkbox.svg'
  8. import CheckedSvg from 'assets/checked.svg'
  9. import NButton from 'components/NButton/NButton'
  10. import { IGoodsListItem, MaterialService } from '../Material.service'
  11. import { useLogin2p } from 'Login2p/Login2pContext'
  12. import { ITryType } from './NoPermission'
  13. import styles from '../css/NoPermission.module.scss'
  14. export enum PayType {
  15. Card = 1, // 畅销卡
  16. Single = 2 // 单场活动
  17. }
  18. interface IBuyModelProps {
  19. visible: boolean
  20. detailID?: number
  21. tryType?: ITryType
  22. payType?: PayType
  23. handleClose: () => void
  24. }
  25. /**
  26. * 付费报名弹框(畅销卡与单场活动购买)
  27. */
  28. const BuyModel: React.FC<IBuyModelProps> = props => {
  29. const { visible, detailID, tryType, payType = PayType.Card, handleClose } = props
  30. const login2p = useLogin2p()
  31. const [form] = Form.useForm()
  32. const [loading, setLoading] = useState(false)
  33. const [imageUrl, setImageUrl] = useState<string>()
  34. const [buyType, setBuyType] = useState<number>(1)
  35. const uploadButton = (
  36. <div>
  37. {loading ? <LoadingOutlined /> : <PlusOutlined />}
  38. <div style={{ marginTop: 8 }}>上传名片</div>
  39. </div>
  40. )
  41. const { run } = useRequest(MaterialService.postApplyTry, {
  42. manual: true,
  43. onSuccess: res => {
  44. res.data.Ret === 200 ? message.success('已提交给您的对口销售,请耐心等待。') : message.info(res.data.Msg)
  45. handleToClose()
  46. setImageUrl(undefined)
  47. }
  48. })
  49. const { run: uploadImg } = useRequest(MaterialService.postUploadImage, {
  50. manual: true,
  51. onSuccess: res => {
  52. message.info(res.data.Msg)
  53. setImageUrl(res.data?.Data?.ResourceUrl)
  54. setLoading(false)
  55. }
  56. })
  57. useEffect(() => {
  58. return () => {
  59. form.resetFields()
  60. }
  61. // eslint-disable-next-line react-hooks/exhaustive-deps
  62. }, [form])
  63. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  64. const handleFinish = (value: any) => {
  65. if (!imageUrl) {
  66. message.error('请上传名片')
  67. return
  68. }
  69. // 上传名片时,ApplyMethod为2,否则为1
  70. run({
  71. ApplyMethod: 2,
  72. BusinessCardUrl: imageUrl,
  73. CompanyName: value.CompanyName,
  74. DetailId: detailID,
  75. RealName: value.RealName,
  76. TryType: tryType
  77. })
  78. }
  79. const uploadProps: UploadProps = {
  80. name: 'file',
  81. multiple: false,
  82. listType: 'picture-card',
  83. showUploadList: false,
  84. withCredentials: true,
  85. customRequest: option => {
  86. uploadImg(option.file)
  87. },
  88. onChange: (info: UploadChangeParam<UploadFile>) => {
  89. if (info.file.status === 'uploading') {
  90. setLoading(true)
  91. return
  92. }
  93. }
  94. }
  95. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  96. const normFile = (e: any) => {
  97. if (Array.isArray(e)) {
  98. return e
  99. }
  100. return e && e.fileList
  101. }
  102. const handleToClose = () => {
  103. // 关闭前把名片给清除了
  104. setImageUrl(undefined)
  105. handleClose()
  106. }
  107. const handleBackClose = () => {
  108. //
  109. handleClose()
  110. }
  111. const cardList: IGoodsListItem[] = [
  112. { CurrentPrice: '0.01', GoodsId: 1, GoodsName: '日卡', PopupPriceMsg: '¥99/日,', Price: '99.00' },
  113. {
  114. CurrentPrice: '0.01',
  115. GoodsId: 2,
  116. GoodsName: '月卡',
  117. PopupPriceMsg: '¥999/月',
  118. Price: '399.00'
  119. }
  120. ]
  121. return (
  122. <Modal
  123. open={visible}
  124. centered={true}
  125. onCancel={handleToClose}
  126. destroyOnClose={true}
  127. maskClosable={false}
  128. title="付费报名"
  129. footer={null}
  130. >
  131. <div
  132. className={styles['buymodel-content-wrapper']}
  133. style={{ textAlign: payType === PayType.Single ? 'center' : 'initial' }}
  134. >
  135. <div className="buymodel-card-wrapper">
  136. {cardList.map(item => (
  137. <div
  138. className={`buymodel-card-item ${buyType === item.GoodsId ? 'buymodel-card-act' : ''}`}
  139. key={item.GoodsId}
  140. >
  141. <span>{item.GoodsName}</span>
  142. <span className="buymodel-price-current">&nbsp;¥{item.CurrentPrice}</span>
  143. <span className="buymodel-price-undeline">&nbsp;¥{item.Price}</span>
  144. </div>
  145. ))}
  146. </div>
  147. <div className="buymodel-price-text" style={{ textAlign: payType === PayType.Single ? 'center' : 'initial' }}>
  148. <span>应付金额:</span>
  149. <span className="price-red">&nbsp;¥1299&nbsp;</span>
  150. <span className="price-undeline">¥1999.00</span>
  151. </div>
  152. <div className="buymodel-checkbox-wrapper m-t-md">
  153. <img src={CheckboxSvg} alt="图标" className="buymodel-icon" />
  154. <img src={CheckedSvg} alt="图标" className="buymodel-icon" />
  155. <span>我已阅读并同意</span>
  156. <span className="buymodel-text-orange">《研选平台服务协议》</span>
  157. <span className="buymodel-text-orange">《研选平台隐私政策》</span>
  158. </div>
  159. </div>
  160. <div className={styles['paymodel-footer-wrapper']}>
  161. {payType === PayType.Card ? (
  162. <NButton type="white" onClick={handleBackClose} size="large" className="pay-btn m-r-md">
  163. 取消
  164. </NButton>
  165. ) : (
  166. <NButton type="white" onClick={handleBackClose} size="large" className="pay-btn m-r-md">
  167. 申请试用
  168. </NButton>
  169. )}
  170. <NButton type="primary" onClick={handleBackClose} size="large" className="pay-btn" disabled>
  171. 确认支付
  172. </NButton>
  173. </div>
  174. </Modal>
  175. )
  176. }
  177. export default BuyModel