"use client"; import { Link } from "@/i18n/navigation"; import { CTA_CONFIG } from "@/config/course"; import { useAuthAndVip } from "@/app/lib/useAuthAndVip"; import { getStoredToken, getStoredUser } from "@/app/lib/pocketbase"; import AuthModal from "@/app/components/AuthModal"; import { getPayEnv, redirectToPay, getDeviceFromEnv, } from "@/app/lib/payment"; import { useState } from "react"; export function CTASection() { const { user, vip, refetch } = useAuthAndVip(); const paid = !!user && vip; const [authOpen, setAuthOpen] = useState(false); const [payRedirecting, setPayRedirecting] = useState(false); const startPay = (userId: string) => { const env = getPayEnv(); const channel = "wxpay"; const device = getDeviceFromEnv(env); const returnUrl = `${window.location.origin}/`; redirectToPay({ user_id: userId, return_url: returnUrl, channel, device, type: "video", useJoinConfig: true, }); }; const handleEnroll = async () => { if (payRedirecting) return; setPayRedirecting(true); try { // 先验证登录态 let meRes = await fetch("/api/auth/me", { credentials: "include" }); let meData = await meRes.json().catch(() => ({})); if (meData?.user?.id) { // 已登录:先校验 VIP,已是 VIP 则无需支付 const vipRes = await fetch(`/api/vip/check?email=${encodeURIComponent(meData.user.email)}`, { credentials: "include" }); const vipData = await vipRes.json().catch(() => ({})); if (vipData?.vip) { await refetch(); return; } startPay(meData.user.id); return; } const storedUser = getStoredUser(); const storedToken = getStoredToken(); if (storedUser?.id && storedToken) { await fetch("/api/auth/sync-session", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ token: storedToken, record: storedUser }), credentials: "include", }).catch(() => null); meRes = await fetch("/api/auth/me", { credentials: "include" }); meData = await meRes.json().catch(() => ({})); if (meData?.user?.id) { const vipRes = await fetch(`/api/vip/check?email=${encodeURIComponent(meData.user.email)}`, { credentials: "include" }); const vipData = await vipRes.json().catch(() => ({})); if (vipData?.vip) { await refetch(); return; } startPay(meData.user.id); return; } } setAuthOpen(true); } finally { setPayRedirecting(false); } }; return (

{CTA_CONFIG.title}

{CTA_CONFIG.subtitle}

{CTA_CONFIG.badges.map((b, i) => ( {b} ))}
{paid ? ( 开始学习 → ) : ( )}
setAuthOpen(false)} onSuccess={() => { setAuthOpen(false); void refetch(); }} />
); }