import React, { useState, useRef, useEffect } from 'react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs'; import { UserGuide } from './UserGuide'; import { SmartReview } from './SmartReview'; import { Label } from './ui/label'; import { Button } from './ui/button'; import { LogIn, Edit, BookOpen } from 'lucide-react'; import { GroupMembers } from './GroupMembers'; import { Card } from './ui/card'; import { Input } from './ui/input'; import type { LearningMode, Language, SpaceType, GroupMember, User as UserType } from '../App'; import { toast } from 'sonner'; interface LeftSidebarProps { learningMode: LearningMode; language: Language; onLearningModeChange: (mode: LearningMode) => void; onLanguageChange: (lang: Language) => void; spaceType: SpaceType; groupMembers: GroupMember[]; user: UserType | null; onLogin: (user: UserType) => void; onLogout: () => void; isLoggedIn: boolean; onEditProfile: () => void; } export function LeftSidebar({ learningMode, language, onLearningModeChange, onLanguageChange, spaceType, groupMembers, user, onLogin, onLogout, isLoggedIn, onEditProfile, }: LeftSidebarProps) { const [showLoginForm, setShowLoginForm] = useState(false); const [name, setName] = useState(''); const [email, setEmail] = useState(''); const handleLogin = () => { if (!name.trim() || !email.trim()) { toast.error('Please fill in all fields'); return; } onLogin({ name: name.trim(), email: email.trim() }); setShowLoginForm(false); setName(''); setEmail(''); toast.success(`Welcome, ${name}!`); }; const handleLogout = () => { onLogout(); setShowLoginForm(false); toast.success('Logged out successfully'); }; const scrollContainerRef = useRef(null); useEffect(() => { const container = scrollContainerRef.current; if (!container) return; const handleWheel = (e: WheelEvent) => { e.stopPropagation(); e.stopImmediatePropagation(); const { scrollTop, scrollHeight, clientHeight } = container; const isScrollable = scrollHeight > clientHeight; const isAtTop = scrollTop === 0; const isAtBottom = scrollTop + clientHeight >= scrollHeight - 1; if (isScrollable && ((isAtTop && e.deltaY < 0) || (isAtBottom && e.deltaY > 0))) { e.preventDefault(); } }; container.addEventListener('wheel', handleWheel, { passive: false, capture: true }); return () => { container.removeEventListener('wheel', handleWheel, { capture: true } as any); }; }, []); return (
{/* Profile/Login Section */}

Profile

{!isLoggedIn ? (
Student studying

Welcome to Clare!

Log in to start your personalized learning journey

{!showLoginForm ? ( ) : (
setName(e.target.value)} placeholder="Enter your name" />
setEmail(e.target.value)} placeholder="Enter your email or ID" />
)}
) : (
{user?.name

Hello,

{user?.name ?? ''}!

ID: {user?.email ? user.email.split('@')[0] : ''}
)}
{/* Group Members - Only show in group mode */} {spaceType === 'group' && (
)} {/* Tabs */}
{/* 关键:TabsList 已在 ui/tabs.tsx 改成 w-full flex,这里只需要三等分 */} Smart Review Personal Quiz User Guide

Personal Quiz

Clare analyzes your chat history and learning patterns to randomly select a personalized question that challenges your understanding of previously discussed topics.

); }