diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx
index 036c12f..b78286d 100644
--- a/app/dashboard/page.tsx
+++ b/app/dashboard/page.tsx
@@ -59,7 +59,7 @@ export default function DashboardPage() {
const fetchPaymentDetails = async (sessionId: string) => {
try {
const User = JSON.parse(localStorage.getItem("currentUser") || "{}");
- const response = await fetch(`/api/payment/checkout-status/${sessionId}?user_id=${User.id}`);
+ const response = await fetch(`/api/payment/checkout-status/${sessionId}?user_id=${String(User.id)}`);
const result = await response.json();
if (result.successful && result.data) {
diff --git a/app/payment-success/page.tsx b/app/payment-success/page.tsx
index 589d424..710ee99 100644
--- a/app/payment-success/page.tsx
+++ b/app/payment-success/page.tsx
@@ -43,7 +43,7 @@ export default function PaymentSuccessPage() {
// 使用新的Checkout Session状态查询
const { getCheckoutSessionStatus } = await import('@/lib/stripe');
const User = JSON.parse(localStorage.getItem("currentUser") || "{}");
- const result = await getCheckoutSessionStatus(sessionId, User.id);
+ const result = await getCheckoutSessionStatus(sessionId, String(User.id));
if (result.successful && result.data) {
setPaymentData(result.data);
diff --git a/components/layout/top-bar.tsx b/components/layout/top-bar.tsx
index 023990c..3bcb754 100644
--- a/components/layout/top-bar.tsx
+++ b/components/layout/top-bar.tsx
@@ -12,11 +12,12 @@ import {
LogOut,
PanelsLeftBottom,
} from 'lucide-react';
-import { motion } from 'framer-motion';
+import { motion, AnimatePresence } from 'framer-motion';
import ReactDOM from 'react-dom';
import { useRouter } from 'next/navigation';
import React, { useRef, useEffect, useLayoutEffect, useState } from 'react';
import { logoutUser } from '@/lib/auth';
+import { createPortalSession, redirectToPortal } from '@/lib/stripe';
interface User {
@@ -34,6 +35,7 @@ export function TopBar({ collapsed, onToggleSidebar }: { collapsed: boolean; onT
const currentUser: User = JSON.parse(localStorage.getItem('currentUser') || '{}');
const [mounted, setMounted] = React.useState(false);
const [isLogin, setIsLogin] = useState(false);
+ const [isManagingSubscription, setIsManagingSubscription] = useState(false);
useEffect(() => {
const currentUser = localStorage.getItem("currentUser");
if (JSON.parse(currentUser || "{}")?.token) {
@@ -48,6 +50,34 @@ export function TopBar({ collapsed, onToggleSidebar }: { collapsed: boolean; onT
return () => console.log('Cleanup mounted effect');
}, []);
+ // 处理订阅管理
+ const handleManageSubscription = async () => {
+ if (!currentUser?.id) {
+ console.error('用户未登录');
+ return;
+ }
+
+ setIsManagingSubscription(true);
+ try {
+ const response = await createPortalSession({
+ user_id: String(currentUser.id),
+ return_url: window.location.origin + '/dashboard'
+ });
+
+ if (response.successful && response.data?.portal_url) {
+ redirectToPortal(response.data.portal_url);
+ } else {
+ console.error('创建订阅管理会话失败:', response.message);
+ alert('无法打开订阅管理页面,请稍后重试');
+ }
+ } catch (error) {
+ console.error('打开订阅管理页面失败:', error);
+ alert('无法打开订阅管理页面,请稍后重试');
+ } finally {
+ setIsManagingSubscription(false);
+ }
+ };
+
// 处理点击事件
useEffect(() => {
@@ -187,13 +217,16 @@ export function TopBar({ collapsed, onToggleSidebar }: { collapsed: boolean; onT
MovieFlow can make any kind of film in high quality for you -
- + + {/* 3x3网格布局 */} - + ))} ))} - - + + ); } /**电影制作工序介绍 */ @@ -287,7 +287,7 @@ function HomeModule4() {