import * as React from "react" import { motion, AnimatePresence } from "motion/react" import { Button } from "@/components/ui/button" import { Skeleton } from "@/components/ui/skeleton" import { Send } from "@/components/animate-ui/icons/send" import { Check } from "@/components/animate-ui/icons/check" import { InputOTP, InputOTPGroup, InputOTPSlot } from "@/components/ui/input-otp" import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/animate-ui/primitives/radix/collapsible" import { AlertCircle, CreditCard, ArrowLeft, ShieldCheck, Lock } from "lucide-react" import type { GetMerchantOrderResponse } from "@/lib/services" import { useUser } from "@/contexts/user-context" type PaymentStep = typeof PAYMENT_STEPS[keyof typeof PAYMENT_STEPS] const PAYMENT_METHODS = { LINUX_DO_PAY: 'linux-do-pay' } as const const PAYMENT_STEPS = { METHOD: 'method' as const, Credit: 'pay' as const } as const const ORDER_STATUSES = { SUCCESS: 'success', PENDING: 'pending' } as const /** * 加载中骨架组件 * 显示支付方式加载中的骨架 */ function LoadingSkeleton() { return (
) } /** * 成功状态组件 * 显示认证成功状态 */ function SuccessState() { const [countdown, setCountdown] = React.useState(5) React.useEffect(() => { const timer = setInterval(() => { setCountdown((prev) => { if (prev <= 1) { clearInterval(timer) return 0 } return prev - 1 }) }, 1000) return () => clearInterval(timer) }, []) return (
认证成功 认证已安全完成,{countdown > 0 ? `${ countdown }秒后自动跳转...` : '正在跳转...'} ) } /** * 认证方式选择步骤组件 * 显示认证方式选择步骤 */ function MethodSelectionStep({ orderInfo, selectedMethod, isOpen, onSelectedMethodChange, onIsOpenChange, onCurrentStepChange, forceMobile = false }: { orderInfo: GetMerchantOrderResponse selectedMethod: string isOpen: boolean onSelectedMethodChange: (method: string) => void onIsOpenChange: (isOpen: boolean) => void onCurrentStepChange: (step: PaymentStep) => void forceMobile?: boolean }) { const { user } = useUser() return (

选择认证平台

请选择您想要使用的服务认证平台

{ if (selectedMethod === PAYMENT_METHODS.LINUX_DO_PAY) { onSelectedMethodChange('') onIsOpenChange(false) } else { onSelectedMethodChange(PAYMENT_METHODS.LINUX_DO_PAY) onIsOpenChange(true) } }} >
LINUX DO Credit
即时安全认证
{selectedMethod === PAYMENT_METHODS.LINUX_DO_PAY && }
{selectedMethod === PAYMENT_METHODS.LINUX_DO_PAY && (
消费方账户 {orderInfo.order.payer_username || user?.username}
)}
) } /** * 认证步骤组件 * 显示认证步骤 */ function PaymentStep({ orderInfo, payKey, paying, onPayKeyChange, onCurrentStepChange, onPayOrder }: { orderInfo: GetMerchantOrderResponse payKey: string paying: boolean onPayKeyChange: (value: string) => void onCurrentStepChange: (step: PaymentStep) => void onPayOrder: () => void }) { return (

身份验证

请输入您的6位安全密码

{ if (e.key === 'Enter' && payKey.length === 6 && !paying) { onPayOrder() } }} > {[0, 1, 2, 3, 4, 5].map((index) => ( ))}
) } /** * 错误状态组件 * 显示错误状态 */ function ErrorState({ status }: { status: string }) { return (

认证出现问题

状态:{status}

) } /** * 底部组件 * 显示底部 */ function Footer({ loading }: { loading?: boolean }) { return loading ? (
) : (
由 LINUX DO Credit 提供安全认证
) } interface PayingNowProps { orderInfo: GetMerchantOrderResponse | null paying: boolean payKey: string currentStep: PaymentStep selectedMethod: string isOpen: boolean loading?: boolean onPayKeyChange: (value: string) => void onCurrentStepChange: (step: PaymentStep) => void onSelectedMethodChange: (method: string) => void onIsOpenChange: (isOpen: boolean) => void onPayOrder: () => void forceMobile?: boolean } /** * 支付现在组件 * 显示支付现在组件 */ export function PayingNow({ orderInfo, paying, payKey, currentStep, selectedMethod, isOpen, loading = false, onPayKeyChange, onCurrentStepChange, onSelectedMethodChange, onIsOpenChange, onPayOrder, forceMobile = false }: PayingNowProps) { const renderContent = () => { if (loading) return if (!orderInfo) return null switch (orderInfo.order.status) { case ORDER_STATUSES.SUCCESS: return case ORDER_STATUSES.PENDING: return ( {currentStep === PAYMENT_STEPS.METHOD ? ( ) : ( )} ) default: return } } return (
{renderContent()}
) }