import Taro from '@tarojs/taro'; import { Dialog } from '@taroify/core'; import { useCallback, useEffect, useRef, useState } from 'react'; import { DialogStatus, PREFIX } from '@/components/product-dialog/const'; import JobBuy from '@/components/product-dialog/steps-ui/job-buy'; import ContactCustomerService from '@/components/product-dialog/steps-ui/job-contact-customer'; import ContactDirect from '@/components/product-dialog/steps-ui/job-contact-direct'; import UnableUnlockContent from '@/components/product-dialog/steps-ui/job-unable'; import { DeclarationType, ProductType } from '@/constants/product'; import { JobDetails } from '@/types/job'; import { ProductInfo } from '@/types/product'; import { logWithPrefix } from '@/utils/common'; import { requestProductUseRecord, requestProductBalance, requestUseProduct, requestAllBuyProduct, } from '@/utils/product'; import Toast from '@/utils/toast'; import '../index.less'; interface IProps { data: JobDetails; onClose: () => void; } const PRODUCT_CODE = ProductType.VIP; const log = logWithPrefix('product-job-dialog'); function ProductJobDialog(props: Omit) { const { data, onClose } = props; const [status, setStatus] = useState(DialogStatus.LOADING); const [publisherAcctNo, setPublisherAcctNo] = useState(''); const initRef = useRef(() => {}); const handleCloseDialog = useCallback(() => { onClose(); }, [onClose]); const handleAfterBuy = useCallback(async () => { const [time] = await requestProductBalance(PRODUCT_CODE); if (time <= 0) { Toast.error('发生错误请重试'); onClose(); return; } const productInfo = await requestUseProduct(PRODUCT_CODE, { jobId: data.id }); const declarationTypeResult = productInfo.declarationTypeResult; if (declarationTypeResult?.type === DeclarationType.Direct && declarationTypeResult.publisherAcctNo) { setStatus(DialogStatus.JOB_CONTACT_DIRECT); setPublisherAcctNo(declarationTypeResult.publisherAcctNo); } else { setStatus(DialogStatus.JOB_CONTACT_CS); } }, [data, onClose]); const handleReport = useCallback(() => { log('report', data.id); }, [data]); useEffect(() => { initRef.current = async () => { const handleContact = (declarationTypeResult?: ProductInfo['declarationTypeResult']) => { if (declarationTypeResult?.type === DeclarationType.Direct && declarationTypeResult.publisherAcctNo) { setStatus(DialogStatus.JOB_CONTACT_DIRECT); setPublisherAcctNo(declarationTypeResult.publisherAcctNo); } else { setStatus(DialogStatus.JOB_CONTACT_CS); } }; try { Taro.showLoading(); // if (1 < 2) { // setStatus(DialogStatus.JOB_CONTACT_CS); // return; // } const result = await requestProductUseRecord(PRODUCT_CODE, { jobId: data.id }); log('requestProductUseRecord result', result); if (result) { handleContact(result.declarationTypeResult); return; } const [time] = await requestProductBalance(PRODUCT_CODE); if (time <= 0) { const allowBuy = await requestAllBuyProduct(PRODUCT_CODE); setStatus(allowBuy ? DialogStatus.JOB_BUY : DialogStatus.JOB_UNABLE_UNLOCK); } else { const productInfo = await requestUseProduct(PRODUCT_CODE, { jobId: data.id }); handleContact(productInfo.declarationTypeResult); } } catch (e) { Toast.error('出错了,请重试'); handleCloseDialog(); } finally { Taro.hideLoading(); } }; }, [data, handleCloseDialog]); useEffect(() => { initRef.current(); }, []); if (status === DialogStatus.LOADING) { return null; } return ( {status === DialogStatus.JOB_CONTACT_CS && } {status === DialogStatus.JOB_CONTACT_DIRECT && ( )} {status === DialogStatus.JOB_BUY && } {status === DialogStatus.JOB_UNABLE_UNLOCK && } ); } export default ProductJobDialog;