126 lines
4.4 KiB
TypeScript
126 lines
4.4 KiB
TypeScript
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<IProps, 'visible'>) {
|
|
const { data, onClose } = props;
|
|
const [status, setStatus] = useState<DialogStatus>(DialogStatus.LOADING);
|
|
const [publisherAcctNo, setPublisherAcctNo] = useState<string>('');
|
|
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 (
|
|
<Dialog className={PREFIX} onClose={onClose} open>
|
|
<Dialog.Content>
|
|
{status === DialogStatus.JOB_CONTACT_CS && <ContactCustomerService onAfterConfirm={handleCloseDialog} />}
|
|
{status === DialogStatus.JOB_CONTACT_DIRECT && (
|
|
<ContactDirect publisherAcctNo={publisherAcctNo} onAfterConfirm={handleCloseDialog} onReport={handleReport} />
|
|
)}
|
|
{status === DialogStatus.JOB_BUY && <JobBuy onConfirm={handleAfterBuy} />}
|
|
{status === DialogStatus.JOB_UNABLE_UNLOCK && <UnableUnlockContent onConfirm={handleCloseDialog} />}
|
|
</Dialog.Content>
|
|
</Dialog>
|
|
);
|
|
}
|
|
|
|
export default ProductJobDialog;
|