import { useCallback } from 'react';
import { Trans, useTranslation } from 'react-i18next';
import LoginForm from '@/components/LoginForm';
import { message } from '@/config/request/antdAppInstance';
import { PayUrlShowType } from '@/defines';
import { useAppUrls } from '@/hooks/useAppUrls';
import { dialogModel } from '@/models/dialogModel';
import { fetchGetUserConfig, fetchPayOrderCreate } from '@/services/config';
import { getToken } from '@/utils/authUtils';
import { currentUnixTimestamp } from '@/utils/timeUtils';
import { PayQrContent } from './components/OrderSummary/PayQrContent';
import { PayWaitingContent } from './components/OrderSummary/PayWaitingContent';
import type { Plan } from './useService';
const ORDER_TYPE_PLAN = 1;
type PayOrder = { orderId: string; payUrl: string; showType: PayUrlShowType };
export interface UseActionReturn {
handlePayNow: (plan: Plan, payMethod: string) => void;
}
function useLoginDialog() {
const { t } = useTranslation();
const { openDialog, closeDialog } = dialogModel.useModel();
const { deeplinkUrl, downloadUrlByPlatform } = useAppUrls();
return useCallback(() => {
const id = openDialog({
title: t('pages.pricing.payFlow.loginTitle'),
content: (
{
const Wrap = ({ children }: { children?: React.ReactNode }) =>
deeplinkUrl ? (
{children}
) : (
{children}
);
return ;
})(),
downloadLink: (() => {
const Wrap = ({ children }: { children?: React.ReactNode }) =>
downloadUrlByPlatform ? (
{children}
) : (
{children}
);
return ;
})(),
}}
/>
closeDialog(id)} />
),
maskClosable: false,
closeable: true,
});
}, [t, openDialog, closeDialog, deeplinkUrl, downloadUrlByPlatform]);
}
function useQrPayDialog() {
const { t } = useTranslation();
const { openDialog, closeDialog } = dialogModel.useModel();
const onPaymentSuccess = useCallback(() => {
return fetchGetUserConfig({}).then(() => {
message.success(t('pages.pricing.payFlow.planPurchaseSuccess'));
});
}, [t]);
return useCallback(
(order: PayOrder) => {
const qrDialogId = openDialog({
title: t('pages.pricing.payFlow.waitingTitle'),
content: (
closeDialog(qrDialogId)}
onPaymentSuccess={onPaymentSuccess}
/>
),
buttons: [
{
label: t('pages.pricing.payFlow.closeWaiting'),
variant: 'secondary' as const,
onClick: (_e: React.MouseEvent, dialogId: string) => {
closeDialog(dialogId);
},
},
],
maskClosable: false,
closeable: true,
});
},
[t, openDialog, closeDialog, onPaymentSuccess]
);
}
function useJumpToPayDialog() {
const { t } = useTranslation();
const { openDialog, closeDialog } = dialogModel.useModel();
const onPaymentSuccess = useCallback(() => {
return fetchGetUserConfig({}).then(() => {
message.success(t('pages.pricing.payFlow.planPurchaseSuccess'));
});
}, [t]);
return useCallback(
(order: PayOrder) => {
openDialog({
title: t('pages.pricing.payFlow.goToPayTitle'),
content: (
{t('pages.pricing.payFlow.goToPayDesc')}
),
buttons: [
{
label: t('pages.pricing.payFlow.goToPayButton'),
variant: 'primary' as const,
onClick: (_e: React.MouseEvent, dialogId: string) => {
window.open(order.payUrl, '_blank');
closeDialog(dialogId);
const waitId = openDialog({
title: t('pages.pricing.payFlow.waitingTitle'),
content: (
closeDialog(waitId)}
onPaymentSuccess={onPaymentSuccess}
/>
),
buttons: [
{
label: t('pages.pricing.payFlow.closeWaiting'),
variant: 'secondary' as const,
onClick: (
_e: React.MouseEvent,
d: string
) => {
closeDialog(d);
},
},
],
maskClosable: false,
});
},
},
],
maskClosable: false,
closeable: true,
});
},
[t, openDialog, closeDialog, onPaymentSuccess]
);
}
export function useAction(): UseActionReturn {
const openLoginDialog = useLoginDialog();
const openQrPayDialog = useQrPayDialog();
const openJumpToPayDialog = useJumpToPayDialog();
const handlePayNow = useCallback(
(selectedPlan: Plan, selectedPayMethod: string) => {
const token = getToken();
const expired =
!token?.accessExpires || (token.accessExpires ?? 0) - currentUnixTimestamp() <= 0;
if (!token?.accessToken || expired) {
// 如果用户未登录,则打开登录对话框
openLoginDialog();
return;
}
// 创建订单
fetchPayOrderCreate({
orderType: ORDER_TYPE_PLAN,
payType: selectedPayMethod,
channelItemId: selectedPlan.id,
})
.then((res) => {
const order = res?.data?.userPayOrder;
if (!order?.payUrl || !order?.orderId) return;
if (order.showType === PayUrlShowType.SHOW_QR_CODE) {
// 如果订单支付地址的显示类型为二维码,则打开二维码支付对话框
openQrPayDialog(order);
return;
}
// 如果订单支付地址的显示类型为跳转,则跳转到支付地址并打开等待支付对话框
openJumpToPayDialog(order);
})
.catch(() => {});
},
[openLoginDialog, openQrPayDialog, openJumpToPayDialog]
);
return {
handlePayNow,
};
}