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)
}
}}
>
{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 (
)
}
/**
* 底部组件
* 显示底部
*/
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 (
)
}