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, }; }