feat: first commit

This commit is contained in:
eleanor.mao
2025-03-31 22:34:22 +08:00
commit d25187c9c8
390 changed files with 57031 additions and 0 deletions

View File

@ -0,0 +1,125 @@
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;