import React, { useState } from 'react'; import { Brain, AlertTriangle, AlertCircle, CheckCircle, ChevronDown, ChevronRight, Info } from 'lucide-react'; import { Badge } from './ui/badge'; import { Button } from './ui/button'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'; import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip'; interface ReviewItem { id: string; title: string; schedule: string; status: 'urgent' | 'review' | 'stable'; weight: number; lastReviewed: string; memoryRetention: number; previousQuestion: string; } interface SmartReviewProps { onReviewTopic?: (item: ReviewItem) => void; onReviewAll?: () => void; } export function SmartReview({ onReviewTopic, onReviewAll }: SmartReviewProps = {}) { // Initialize with the first item of W-4 (red zone) expanded by default const [expandedItems, setExpandedItems] = useState(['w4-1']); const [selectedCategory, setSelectedCategory] = useState('W-4'); // Default to red zone const reviewData = [ { label: 'W-4', percentage: 35, color: 'bg-red-500', textColor: 'text-red-500', icon: AlertTriangle, description: 'Higher forgetting risk', items: [ { id: 'w4-1', title: 'Main Concept of Lab 3', schedule: 'T+7', status: 'urgent' as const, weight: 35, lastReviewed: '7 days ago', memoryRetention: 25, previousQuestion: 'I\'ve read the instructions for Lab 3, but what is the main concept we\'re supposed to be learning here?' } ] }, { label: 'W-2', percentage: 20, color: 'bg-orange-500', textColor: 'text-orange-500', icon: AlertCircle, description: 'Medium forgetting risk', items: [ { id: 'w2-1', title: 'Effective Prompt Engineering', schedule: 'T+14', status: 'review' as const, weight: 20, lastReviewed: '3 days ago', memoryRetention: 60, previousQuestion: 'I understand what prompt engineering is, but what specifically makes a prompt effective versus ineffective?' } ] }, { label: 'W-1', percentage: 12, color: 'bg-green-500', textColor: 'text-green-500', icon: CheckCircle, description: 'Recently learned', items: [ { id: 'w1-1', title: 'Objective LLM Evaluation', schedule: 'T+7', status: 'stable' as const, weight: 12, lastReviewed: '1 day ago', memoryRetention: 90, previousQuestion: 'How can we objectively evaluate an LLM\'s performance when the output quality seems so subjective?' } ] }, ]; const totalPercentage = reviewData.reduce((sum, item) => sum + item.percentage, 0); const selectedData = reviewData.find(item => item.label === selectedCategory); const toggleItem = (itemId: string) => { setExpandedItems(prev => prev.includes(itemId) ? prev.filter(id => id !== itemId) : [...prev, itemId] ); }; // When category changes, automatically expand the first item of that category const handleCategoryChange = (categoryLabel: string) => { setSelectedCategory(categoryLabel); const categoryData = reviewData.find(item => item.label === categoryLabel); if (categoryData && categoryData.items.length > 0) { // Expand only the first item of the selected category setExpandedItems([categoryData.items[0].id]); } }; const getStatusBadge = (status: 'urgent' | 'review' | 'stable') => { const configs = { urgent: { label: 'URGENT', className: 'bg-red-500 text-white hover:bg-red-600' }, review: { label: 'DUE', className: 'bg-orange-500 text-white hover:bg-orange-600' }, stable: { label: 'STABLE', className: 'bg-green-500 text-white hover:bg-green-600' }, }; return configs[status]; }; const getButtonColorClass = (colorClass: string) => { // Extract color from bg-red-500, bg-orange-500, bg-green-500 if (colorClass.includes('red')) { return 'bg-red-500 hover:bg-red-600'; } else if (colorClass.includes('orange')) { return 'bg-orange-500 hover:bg-orange-600'; } else if (colorClass.includes('green')) { return 'bg-green-500 hover:bg-green-600'; } return 'bg-red-500 hover:bg-red-600'; // default }; return (

Current Review Distribution

Based on the forgetting curve, Clare has selected topics you might be forgetting from your learning history and interaction patterns. Higher weights indicate higher forgetting risk.

{/* Combined Progress Bar - Clickable */}
{reviewData.map((item) => ( ))}
{/* Selected Category Expandable Items */} {selectedData && (
{/* Expandable Review Items */}
{selectedData.items.map((reviewItem) => ( toggleItem(reviewItem.id)} >
{reviewItem.schedule} {getStatusBadge(reviewItem.status).label} Weight: {reviewItem.weight}% | Last: {reviewItem.lastReviewed}
{/* Empty line for spacing */}
{/* Titles row - aligned horizontally */}
Memory Retention
You previously asked:
{/* Content row */}
{/* Left: Memory Retention Pie Chart */}
{/* Background circle */} {/* Filled arc */}
{reviewItem.memoryRetention}%
{/* Right: Previous Question and Review Button */}

"{reviewItem.previousQuestion}"

))}
)}
); }