"use client"; import '../pages/style/top-bar.css'; import { Button } from '@/components/ui/button'; import { GradientText } from '@/components/ui/gradient-text'; import { useTheme } from 'next-themes'; import { Sun, Moon, User, Sparkles, LogOut, PanelsLeftBottom, } from 'lucide-react'; 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 { id: string; name: string; email: string; avatar: string; } export function TopBar({ collapsed, onToggleSidebar }: { collapsed: boolean; onToggleSidebar: () => void }) { const router = useRouter(); const [isOpen, setIsOpen] = React.useState(false); const menuRef = useRef(null); const buttonRef = useRef(null); 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) { setIsLogin(true); } else { setIsLogin(false); } }); useLayoutEffect(() => { console.log('Setting mounted state'); setMounted(true); 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(() => { if (!isOpen) return; let isClickStartedInside = false; const handleMouseDown = (event: MouseEvent) => { const target = event.target as Node; isClickStartedInside = !!( menuRef.current?.contains(target) || buttonRef.current?.contains(target) ); }; const handleMouseUp = (event: MouseEvent) => { const target = event.target as Node; const isClickEndedInside = !!( menuRef.current?.contains(target) || buttonRef.current?.contains(target) ); // 只有当点击开始和结束都在外部时才关闭 if (!isClickStartedInside && !isClickEndedInside) { setIsOpen(false); } isClickStartedInside = false; }; // 在冒泡阶段处理事件 document.addEventListener('mousedown', handleMouseDown); document.addEventListener('mouseup', handleMouseUp); return () => { document.removeEventListener('mousedown', handleMouseDown); document.removeEventListener('mouseup', handleMouseUp); }; }, [isOpen]); const handleAnimationEnd = (event: React.AnimationEvent) => { const element = event.currentTarget; element.classList.remove("on"); }; const handleMouseEnter = (event: React.MouseEvent) => { const element = event.currentTarget; element.classList.add("on"); }; return (
{isLogin && ( )}
router.push("/")} onMouseEnter={handleMouseEnter} onAnimationEnd={handleAnimationEnd} >

{/* beta标签 */}
Beta
{/* Pricing Link */} {/* Notifications */} {/* */} {/* Theme Toggle */} {/* */} {/* User Menu */}
{mounted && ( ReactDOM.createPortal( ( {isOpen && ( e.stopPropagation()} > {/* User Info */}
{currentUser.name ? currentUser.name.charAt(0) : ''}

{currentUser.name}

{currentUser.email}

{ logoutUser(); }} title="退出登录" >
{/* AI Points */}
100 credits
{/* Menu Items */}
{/* router.push('/my-library')} data-alt="my-library-button" > My Library { // 处理退出登录 setIsOpen(false); }} data-alt="logout-button" > Logout */} {/* Footer */}
Privacy Policy · Terms of Service
250819215404 | 2025/8/20 06:00:50
)}
) as React.ReactElement, document.body ) as React.ReactNode )}
); }