Linux websever 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64
Apache/2.4.52 (Ubuntu)
: 192.168.3.70 | : 192.168.1.99
Cant Read [ /etc/named.conf ]
8.1.2-1ubuntu2.23
urlab
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
var /
www /
html /
coursewise /
assets /
[ HOME SHELL ]
Name
Size
Permission
Action
AcademicTools-tj30wEj0.js
7.55
KB
-rwxr-xr-x
AcademicTools-tj30wEj0.js.map
14.63
KB
-rwxr-xr-x
AddCourse-BTNu-pnI.js
10.08
KB
-rwxr-xr-x
AddCourse-BTNu-pnI.js.map
35.84
KB
-rwxr-xr-x
AdminFeedbackManagement-DsTd1C...
13.52
KB
-rwxr-xr-x
AdminFeedbackManagement-DsTd1C...
45.25
KB
-rwxr-xr-x
CourseReviews-CLlzbLuT.js
27.45
KB
-rwxr-xr-x
CourseReviews-CLlzbLuT.js.map
112.09
KB
-rwxr-xr-x
Dewan-B5d13VSK.png
819.07
KB
-rwxr-xr-x
Dewan-Bniqtmij.js
102
B
-rwxr-xr-x
Dewan-Bniqtmij.js.map
197
B
-rwxr-xr-x
EditCourse-DeWQqcol.js
9.65
KB
-rwxr-xr-x
EditCourse-DeWQqcol.js.map
34.87
KB
-rwxr-xr-x
MyCourses-BA9wctPB.js
8.48
KB
-rwxr-xr-x
MyCourses-BA9wctPB.js.map
31.95
KB
-rwxr-xr-x
Rajput-BnxWGXCy.js
104
B
-rwxr-xr-x
Rajput-BnxWGXCy.js.map
200
B
-rwxr-xr-x
Rajput-CE3gMniE.png
908.11
KB
-rwxr-xr-x
Settings-BGf6-NRc.js
2.09
KB
-rwxr-xr-x
Settings-BGf6-NRc.js.map
5.35
KB
-rwxr-xr-x
TimetableClashChecker-gskbNvYE...
32.74
KB
-rwxr-xr-x
TimetableClashChecker-gskbNvYE...
137.78
KB
-rwxr-xr-x
UserManagement-pl4YxOXe.js
2.17
KB
-rwxr-xr-x
UserManagement-pl4YxOXe.js.map
5.49
KB
-rwxr-xr-x
academic-components-DF0R8Z3x.j...
670.84
KB
-rwxr-xr-x
academic-components-DF0R8Z3x.j...
1.87
MB
-rwxr-xr-x
admin-components-DUStTukf.js
1.36
MB
-rwxr-xr-x
admin-components-DUStTukf.js.m...
5.5
MB
-rwxr-xr-x
apple-touch-icon-CvbJoadU.png
20.94
KB
-rwxr-xr-x
browser-DyVnc2OH.js
392
B
-rwxr-xr-x
browser-DyVnc2OH.js.map
404
B
-rwxr-xr-x
favicon-16x16-CXk8OJVQ.png
734
B
-rwxr-xr-x
favicon-32x32-BMg2Kocu.png
1.78
KB
-rwxr-xr-x
favicon-hhFM0i7Z.ico
15.04
KB
-rwxr-xr-x
geminiService-khxcBfs7.js
2.36
KB
-rwxr-xr-x
geminiService-khxcBfs7.js.map
6.73
KB
-rwxr-xr-x
index-BbxTXAhJ.css
45.32
KB
-rwxr-xr-x
index-DN1SJQ1D.js
73.27
KB
-rwxr-xr-x
index-DN1SJQ1D.js.map
215.58
KB
-rwxr-xr-x
index.es-B3idowhG.js
155.35
KB
-rwxr-xr-x
index.es-B3idowhG.js.map
624.87
KB
-rwxr-xr-x
kunal-UYflGF6w.jpg
9.22
MB
-rwxr-xr-x
kunal-ozIpZZVI.js
102
B
-rwxr-xr-x
kunal-ozIpZZVI.js.map
197
B
-rwxr-xr-x
pdf-vendor-Bz5wMm03.js
317.87
KB
-rwxr-xr-x
pdf-vendor-Bz5wMm03.js.map
976.2
KB
-rwxr-xr-x
purify.es-CQJ0hv7W.js
21.35
KB
-rwxr-xr-x
purify.es-CQJ0hv7W.js.map
88.01
KB
-rwxr-xr-x
react-vendor-BFYHlx6n.js
160.29
KB
-rwxr-xr-x
react-vendor-BFYHlx6n.js.map
687.16
KB
-rwxr-xr-x
sarthak-CfXTejkX.png
764.15
KB
-rwxr-xr-x
sarthak-Cq6ZcrGb.js
106
B
-rwxr-xr-x
sarthak-Cq6ZcrGb.js.map
203
B
-rwxr-xr-x
site-BwHFeIBa.webmanifest
263
B
-rwxr-xr-x
supabase-vendor-DtZyL83W.js
105.45
KB
-rwxr-xr-x
supabase-vendor-DtZyL83W.js.ma...
449.41
KB
-rwxr-xr-x
ui-vendor-DSJ4jbeb.js
44.26
KB
-rwxr-xr-x
ui-vendor-DSJ4jbeb.js.map
190.96
KB
-rwxr-xr-x
useToast-Bg1woyD1.js
414
B
-rwxr-xr-x
useToast-Bg1woyD1.js.map
1.83
KB
-rwxr-xr-x
xlsx-vendor-D_ykzFJ-.js
276.48
KB
-rwxr-xr-x
xlsx-vendor-D_ykzFJ-.js.map
1.37
MB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : CourseReviews-CLlzbLuT.js.map
{"version":3,"file":"CourseReviews-CLlzbLuT.js","sources":["../../src_new/services/courseReviews.ts","../../src_new/features/academic/CourseReviews.tsx"],"sourcesContent":["import { supabase } from '../lib/supabase';\r\nimport { CourseReview, CourseTagCategory } from '../types';\r\n\r\nexport const courseReviewsService = {\r\n // Get all courses for the dropdown selection\r\n async getAllCourses() {\r\n const { data, error } = await supabase\r\n .from('courses_iiitd')\r\n .select('uuid, course_name, course_code, dept_acronym')\r\n .order('course_code');\r\n\r\n if (error) throw error;\r\n return data || [];\r\n },\r\n\r\n // Fetch reviews for a course\r\n async getCourseReviews(courseUuid: string): Promise<CourseReview[]> {\r\n const { data, error } = await supabase\r\n .from('course_reviews')\r\n .select(`\r\n *,\r\n course:courses_iiitd(uuid, course_code, course_name, dept_acronym),\r\n user:users(full_name, profile_picture_url)\r\n `)\r\n .eq('course_uuid', courseUuid)\r\n .order('created_at', { ascending: false });\r\n\r\n if (error) throw error;\r\n return data || [];\r\n },\r\n\r\n // Get reviews written by a specific user\r\n async getUserReviews(userId: string): Promise<CourseReview[]> {\r\n const { data, error } = await supabase\r\n .from('course_reviews')\r\n .select(`\r\n *,\r\n course:courses_iiitd(uuid, course_code, course_name, dept_acronym)\r\n `)\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false });\r\n\r\n if (error) throw error;\r\n return data || [];\r\n },\r\n\r\n // Get all reviews for a user for a list of course codes\r\n async getUserReviewsForCourseCodes(userId: string, courseCodes: string[]): Promise<CourseReview[]> {\r\n if (!courseCodes.length) return [];\r\n const { data, error } = await supabase\r\n .from('course_reviews')\r\n .select('*, course:courses_iiitd(course_code)')\r\n .eq('user_id', userId)\r\n .in('course.course_code', courseCodes);\r\n if (error) throw error;\r\n return data || [];\r\n },\r\n\r\n // Create a new review\r\n async createReview(review: Omit<CourseReview, 'id' | 'created_at' | 'updated_at'>): Promise<CourseReview> {\r\n const { data, error } = await supabase\r\n .from('course_reviews')\r\n .insert([review])\r\n .select()\r\n .single();\r\n\r\n if (error) throw error;\r\n return data;\r\n },\r\n\r\n // Update an existing review\r\n async updateReview(id: string, review: Partial<CourseReview>): Promise<CourseReview> {\r\n const { data, error } = await supabase\r\n .from('course_reviews')\r\n .update(review)\r\n .eq('id', id)\r\n .select()\r\n .single();\r\n\r\n if (error) throw error;\r\n return data;\r\n },\r\n\r\n // Delete a review\r\n async deleteReview(id: string): Promise<void> {\r\n const { error } = await supabase\r\n .from('course_reviews')\r\n .delete()\r\n .eq('id', id);\r\n\r\n if (error) throw error;\r\n },\r\n\r\n // Get all tag categories with their tags\r\n async getTagCategories(): Promise<CourseTagCategory[]> {\r\n const { data, error } = await supabase\r\n .from('course_tag_categories')\r\n .select('*')\r\n .order('category_name');\r\n\r\n if (error) throw error;\r\n \r\n // Parse tags from string format if needed\r\n return (data || []).map(category => ({\r\n ...category,\r\n tags: Array.isArray(category.tags) \r\n ? category.tags \r\n : JSON.parse(category.tags as unknown as string)\r\n }));\r\n },\r\n\r\n // Get suggested tags for a course based on existing reviews\r\n async getSuggestedTags(courseUuid: string): Promise<string[]> {\r\n const { data, error } = await supabase\r\n .from('course_reviews')\r\n .select('tags')\r\n .eq('course_uuid', courseUuid);\r\n\r\n if (error) throw error;\r\n\r\n // Flatten all tags arrays and count occurrences\r\n const tagCounts = data.reduce((acc: { [key: string]: number }, review) => {\r\n if (Array.isArray(review.tags)) {\r\n review.tags.forEach(tag => {\r\n acc[tag] = (acc[tag] || 0) + 1;\r\n });\r\n }\r\n return acc;\r\n }, {});\r\n\r\n // Sort by frequency and return top tags\r\n return Object.entries(tagCounts)\r\n .sort(([,a], [,b]) => b - a)\r\n .map(([tag]) => tag)\r\n .slice(0, 10); // Return top 10 most used tags\r\n },\r\n \r\n // Get course statistics\r\n async getCourseStatistics(courseUuid: string) {\r\n const { data, error } = await supabase\r\n .from('course_reviews')\r\n .select('rating, difficulty')\r\n .eq('course_uuid', courseUuid);\r\n \r\n if (error) throw error;\r\n \r\n const totalReviews = data.length;\r\n \r\n if (totalReviews === 0) {\r\n return {\r\n avgRating: 0,\r\n totalReviews: 0,\r\n ratingDistribution: [0, 0, 0, 0, 0],\r\n difficultyDistribution: {\r\n very_easy: 0,\r\n easy: 0,\r\n moderate: 0,\r\n hard: 0,\r\n very_hard: 0\r\n }\r\n };\r\n }\r\n \r\n // Calculate average rating\r\n const sumRatings = data.reduce((sum, review) => sum + review.rating, 0);\r\n const avgRating = sumRatings / totalReviews;\r\n \r\n // Calculate rating distribution\r\n const ratingDistribution = [0, 0, 0, 0, 0]; // For ratings 1-5\r\n data.forEach(review => {\r\n ratingDistribution[review.rating - 1]++;\r\n });\r\n \r\n // Calculate difficulty distribution\r\n const difficultyDistribution = {\r\n very_easy: 0,\r\n easy: 0,\r\n moderate: 0,\r\n hard: 0,\r\n very_hard: 0\r\n };\r\n \r\n data.forEach(review => {\r\n if (review.difficulty) {\r\n difficultyDistribution[review.difficulty]++;\r\n }\r\n });\r\n \r\n return {\r\n avgRating,\r\n totalReviews,\r\n ratingDistribution,\r\n difficultyDistribution\r\n };\r\n },\r\n\r\n // Fetch all completed courses for a user from transcripts\r\n async getCompletedTranscriptCourses(userId: string) {\r\n const { data, error } = await supabase\r\n .from('transcripts')\r\n .select('semester, courses')\r\n .eq('user_id', userId)\r\n .order('semester');\r\n\r\n if (error) throw error;\r\n if (!data) return [];\r\n\r\n // Flatten all courses with semester info\r\n const completed: Array<{\r\n course_code: string;\r\n course_name: string;\r\n semester: number;\r\n grade?: string;\r\n credit?: number;\r\n status?: string;\r\n [key: string]: any;\r\n }> = [];\r\n\r\n data.forEach((row: any) => {\r\n if (Array.isArray(row.courses)) {\r\n row.courses.forEach((course: any) => {\r\n if (course.status === 'completed') {\r\n completed.push({\r\n ...course,\r\n semester: row.semester,\r\n });\r\n }\r\n });\r\n }\r\n });\r\n return completed;\r\n }\r\n}; ","import React, { useState, useEffect } from 'react';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport {\r\n Box,\r\n Container,\r\n Heading,\r\n Text,\r\n VStack,\r\n HStack,\r\n SimpleGrid,\r\n Card,\r\n CardBody,\r\n Button,\r\n Select,\r\n Flex,\r\n Avatar,\r\n Badge,\r\n Tag,\r\n TagLabel,\r\n TagCloseButton,\r\n Wrap,\r\n WrapItem,\r\n Modal,\r\n ModalOverlay,\r\n ModalContent,\r\n ModalHeader,\r\n ModalFooter,\r\n ModalBody,\r\n ModalCloseButton,\r\n FormControl,\r\n FormLabel,\r\n FormHelperText,\r\n Textarea,\r\n useDisclosure,\r\n Tabs,\r\n TabList,\r\n TabPanels,\r\n Tab,\r\n TabPanel,\r\n IconButton,\r\n Tooltip,\r\n Divider,\r\n Skeleton,\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n Input,\r\n Popover,\r\n PopoverTrigger,\r\n PopoverContent,\r\n PopoverArrow,\r\n PopoverBody,\r\n PopoverHeader,\r\n PopoverCloseButton,\r\n} from '@chakra-ui/react';\r\nimport {\r\n StarIcon,\r\n ChevronRightIcon,\r\n SearchIcon,\r\n InfoIcon,\r\n ExternalLinkIcon,\r\n EditIcon,\r\n DeleteIcon,\r\n CheckIcon,\r\n ArrowBackIcon,\r\n} from '@chakra-ui/icons';\r\nimport { useAuth } from '../../lib/contexts/AuthContext';\r\nimport { useToast } from '../../lib/hooks/useToast';\r\nimport { courseReviewsService } from '../../services/courseReviews';\r\nimport { CourseReview, CourseTagCategory, DifficultyLevel } from '../../types';\r\nimport NavBar from '../shared/NavBar';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\n\r\n// Extended form data interface\r\ninterface ReviewFormData {\r\n rating: number;\r\n difficulty: DifficultyLevel | '';\r\n review: string;\r\n semester: number;\r\n tags: string[];\r\n}\r\n\r\n// Component to display star ratings\r\nconst StarRating: React.FC<{\r\n rating: number;\r\n size?: string;\r\n onChange?: (rating: number) => void;\r\n interactive?: boolean;\r\n}> = ({ rating, size = \"md\", onChange, interactive = false }) => {\r\n const [hoverRating, setHoverRating] = useState(0);\r\n \r\n return (\r\n <HStack spacing={1}>\r\n {[1, 2, 3, 4, 5].map((star) => (\r\n <StarIcon\r\n key={star}\r\n boxSize={size === \"sm\" ? 3 : size === \"lg\" ? 6 : 4}\r\n color={star <= (hoverRating || rating) ? 'yellow.400' : 'gray.300'}\r\n cursor={interactive ? 'pointer' : 'default'}\r\n onMouseEnter={() => interactive && setHoverRating(star)}\r\n onMouseLeave={() => interactive && setHoverRating(0)}\r\n onClick={() => interactive && onChange && onChange(star)}\r\n className={interactive ? \"transform transition-all hover:scale-110\" : \"\"}\r\n />\r\n ))}\r\n </HStack>\r\n );\r\n};\r\n\r\n// Component to display difficulty badge\r\nconst DifficultyBadge: React.FC<{ difficulty: DifficultyLevel | null | '' }> = ({ difficulty }) => {\r\n if (!difficulty) return null;\r\n \r\n const difficultyMap = {\r\n Easy: { color: 'green', label: 'Easy' },\r\n Medium: { color: 'blue', label: 'Medium' },\r\n Hard: { color: 'orange', label: 'Hard' },\r\n } as Record<DifficultyLevel, { color: string; label: string }>;\r\n \r\n const { color, label } = difficultyMap[difficulty as DifficultyLevel];\r\n \r\n return (\r\n <Badge colorScheme={color} variant=\"subtle\" px={2} py={1} borderRadius=\"full\">\r\n {label}\r\n </Badge>\r\n );\r\n};\r\n\r\nconst stripLecture = (name: string) => name.replace(/-Lecture-$/i, '').replace(/-Lecture$/i, '').replace(/-Lab-$/i, '').replace(/-Lab$/i, '').trim();\r\n\r\nconst TABS = [\r\n { key: 'completed', label: 'Completed Courses' },\r\n { key: 'all', label: 'All Courses' },\r\n];\r\n\r\n// Main component\r\nconst CourseReviews: React.FC = () => {\r\n const { session } = useAuth();\r\n const { showToast } = useToast();\r\n const { isOpen, onOpen, onClose } = useDisclosure();\r\n const [isEditMode, setIsEditMode] = useState(false);\r\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\r\n \r\n // State variables\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [courses, setCourses] = useState<{ uuid: string; course_name: string; course_code: string; dept_acronym: string }[]>([]);\r\n const [selectedCourse, setSelectedCourse] = useState<string>('');\r\n const [reviews, setReviews] = useState<CourseReview[]>([]);\r\n const [userReview, setUserReview] = useState<CourseReview | null>(null);\r\n const [tagCategories, setTagCategories] = useState<CourseTagCategory[]>([]);\r\n const [popularTags, setPopularTags] = useState<string[]>([]);\r\n const [reviewStatistics, setReviewStatistics] = useState({\r\n avgRating: 0,\r\n totalReviews: 0,\r\n ratingDistribution: [0, 0, 0, 0, 0],\r\n });\r\n \r\n // Course filtering state\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedDepartment, setSelectedDepartment] = useState<string>('');\r\n const [viewMode, setViewMode] = useState<'list' | 'departments'>('departments');\r\n \r\n // Form state\r\n const [formData, setFormData] = useState<ReviewFormData>({\r\n rating: 0,\r\n difficulty: '',\r\n review: '',\r\n semester: 1,\r\n tags: [],\r\n });\r\n\r\n // State for completed transcript courses\r\n const [completedCourses, setCompletedCourses] = useState<any[]>([]);\r\n const [loadingCompleted, setLoadingCompleted] = useState(false);\r\n const [activeTab, setActiveTab] = useState<'completed' | 'all'>('completed');\r\n\r\n // Computed properties for filtering courses\r\n const departments = React.useMemo(() => {\r\n const deptMap = new Map<string, string>();\r\n courses.forEach(course => {\r\n if (course.dept_acronym) {\r\n deptMap.set(course.dept_acronym, course.dept_acronym);\r\n }\r\n });\r\n return Array.from(deptMap.values()).sort();\r\n }, [courses]);\r\n\r\n const coursesByDepartment = React.useMemo(() => {\r\n const grouped: { [key: string]: typeof courses } = {};\r\n \r\n courses.forEach(course => {\r\n const deptKey = course.dept_acronym || 'Other';\r\n if (!grouped[deptKey]) {\r\n grouped[deptKey] = [];\r\n }\r\n grouped[deptKey].push(course);\r\n });\r\n \r\n // Sort departments alphabetically\r\n return Object.entries(grouped)\r\n .sort(([deptA], [deptB]) => deptA.localeCompare(deptB))\r\n .map(([dept, courses]) => ({\r\n department: dept,\r\n courses: courses.sort((a, b) => a.course_code.localeCompare(b.course_code))\r\n }));\r\n }, [courses]);\r\n \r\n const filteredCourses = React.useMemo(() => {\r\n let result = [...courses];\r\n \r\n // Filter by search query\r\n if (searchQuery) {\r\n const query = searchQuery.toLowerCase();\r\n result = result.filter(course => \r\n course.course_name.toLowerCase().includes(query) || \r\n course.course_code.toLowerCase().includes(query)\r\n );\r\n }\r\n \r\n // Filter by department\r\n if (selectedDepartment) {\r\n result = result.filter(course => course.dept_acronym === selectedDepartment);\r\n }\r\n \r\n return result.sort((a, b) => a.course_code.localeCompare(b.course_code));\r\n }, [courses, searchQuery, selectedDepartment]);\r\n\r\n // Initialize component\r\n useEffect(() => {\r\n const initializeComponent = async () => {\r\n setIsLoading(true);\r\n try {\r\n // Load courses and tag categories in parallel\r\n const [coursesData, categoriesData] = await Promise.all([\r\n courseReviewsService.getAllCourses(),\r\n courseReviewsService.getTagCategories()\r\n ]);\r\n \r\n setCourses(coursesData);\r\n setTagCategories(categoriesData);\r\n } catch (error) {\r\n console.error('Error initializing component:', error);\r\n showToast('Failed to load initial data', 'error');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n \r\n initializeComponent();\r\n }, []);\r\n\r\n // On mount, if a course is already selected, fetch its reviews\r\n useEffect(() => {\r\n if (selectedCourse) {\r\n loadCourseData();\r\n }\r\n }, []); // Only on mount\r\n\r\n // On course selection, always fetch reviews\r\n useEffect(() => {\r\n if (selectedCourse) {\r\n loadCourseData();\r\n }\r\n }, [selectedCourse]);\r\n\r\n // Fetch completed transcript courses on mount\r\n useEffect(() => {\r\n const fetchCompletedAndReviews = async () => {\r\n if (!session?.user?.id) return;\r\n setLoadingCompleted(true);\r\n try {\r\n const completed = await courseReviewsService.getCompletedTranscriptCourses(session.user.id);\r\n // Fetch all user reviews for these courses\r\n const courseCodes = completed.map(c => c.course_code);\r\n const allUserReviews = await courseReviewsService.getUserReviewsForCourseCodes(session.user.id, courseCodes);\r\n // Merge reviews into completed courses\r\n const completedWithReviews = completed.map(course => {\r\n const review = allUserReviews.find(r => r.course?.course_code === course.course_code && r.semester === course.semester);\r\n return { ...course, review };\r\n });\r\n setCompletedCourses(completedWithReviews);\r\n } catch (e) {\r\n showToast('Failed to load completed courses or reviews', 'error');\r\n } finally {\r\n setLoadingCompleted(false);\r\n }\r\n };\r\n fetchCompletedAndReviews();\r\n }, [session?.user?.id]);\r\n\r\n const loadCourseData = async () => {\r\n setIsLoading(true);\r\n try {\r\n // Load reviews, statistics, and popular tags in parallel\r\n const [reviewsData, popularTagsData] = await Promise.all([\r\n courseReviewsService.getCourseReviews(selectedCourse),\r\n courseReviewsService.getSuggestedTags(selectedCourse)\r\n ]);\r\n \r\n setReviews(reviewsData);\r\n setPopularTags(popularTagsData);\r\n \r\n // Calculate statistics\r\n const totalReviews = reviewsData.length;\r\n const sumRatings = reviewsData.reduce((sum, review) => sum + review.rating, 0);\r\n const avgRating = totalReviews > 0 ? sumRatings / totalReviews : 0;\r\n \r\n // Calculate rating distribution\r\n const distribution = [0, 0, 0, 0, 0]; // For ratings 1-5\r\n reviewsData.forEach(review => {\r\n distribution[review.rating - 1]++;\r\n });\r\n \r\n setReviewStatistics({\r\n avgRating,\r\n totalReviews,\r\n ratingDistribution: distribution,\r\n });\r\n \r\n // Check if the current user has already submitted a review\r\n if (session?.user?.id) {\r\n const userReview = reviewsData.find(review => review.user_id === session.user?.id);\r\n setUserReview(userReview || null);\r\n \r\n if (userReview) {\r\n // Pre-populate form with existing review data\r\n setFormData({\r\n rating: userReview.rating,\r\n difficulty: (userReview.difficulty as DifficultyLevel) || '',\r\n review: userReview.review,\r\n semester: userReview.semester,\r\n tags: userReview.tags || [],\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error loading course data:', error);\r\n showToast('Failed to load course reviews', 'error');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n \r\n const handleOpenReviewModal = () => {\r\n if (!session) {\r\n showToast('Please sign in to write a review', 'info');\r\n return;\r\n }\r\n \r\n if (userReview) {\r\n setIsEditMode(true);\r\n setFormData({\r\n rating: userReview.rating,\r\n difficulty: (userReview.difficulty as DifficultyLevel) || '',\r\n review: userReview.review,\r\n semester: userReview.semester,\r\n tags: userReview.tags || [],\r\n });\r\n } else {\r\n setIsEditMode(false);\r\n setFormData({\r\n rating: 0,\r\n difficulty: '',\r\n review: '',\r\n semester: 1,\r\n tags: [],\r\n });\r\n }\r\n \r\n onOpen();\r\n };\r\n\r\n const handleTagToggle = (tag: string) => {\r\n setFormData(prev => ({\r\n ...prev,\r\n tags: prev.tags.includes(tag)\r\n ? prev.tags.filter(t => t !== tag)\r\n : [...prev.tags, tag]\r\n }));\r\n };\r\n \r\n const handleSubmitReview = async () => {\r\n if (!selectedCourse || !session?.user?.id) return;\r\n \r\n if (formData.rating === 0) {\r\n showToast('Please provide a rating', 'warning');\r\n return;\r\n }\r\n \r\n try {\r\n if (isEditMode && userReview) {\r\n await courseReviewsService.updateReview(userReview.id, {\r\n rating: formData.rating,\r\n difficulty: formData.difficulty || null,\r\n review: formData.review,\r\n semester: formData.semester,\r\n tags: formData.tags,\r\n });\r\n \r\n showToast('Your review has been updated', 'success');\r\n } else {\r\n await courseReviewsService.createReview({\r\n course_uuid: selectedCourse,\r\n user_id: session.user.id,\r\n rating: formData.rating,\r\n difficulty: formData.difficulty || null,\r\n review: formData.review,\r\n semester: formData.semester,\r\n tags: formData.tags,\r\n });\r\n \r\n showToast('Your review has been submitted', 'success');\r\n }\r\n \r\n onClose();\r\n await loadCourseData(); // Always fetch latest data\r\n } catch (error) {\r\n console.error('Error submitting review:', error);\r\n showToast('Failed to submit review', 'error');\r\n }\r\n };\r\n \r\n const handleDeleteReview = async () => {\r\n if (!userReview) return;\r\n \r\n try {\r\n await courseReviewsService.deleteReview(userReview.id);\r\n showToast('Your review has been deleted', 'success');\r\n setIsDeleteModalOpen(false);\r\n setUserReview(null);\r\n await loadCourseData(); // Always fetch latest data\r\n } catch (error) {\r\n console.error('Error deleting review:', error);\r\n showToast('Failed to delete review', 'error');\r\n }\r\n };\r\n \r\n // Display a chart showing the rating distribution\r\n const RatingDistribution = () => (\r\n <VStack align=\"start\" spacing={1} width=\"100%\">\r\n {[5, 4, 3, 2, 1].map(rating => {\r\n const count = reviewStatistics.ratingDistribution[rating - 1];\r\n const percentage = reviewStatistics.totalReviews > 0\r\n ? (count / reviewStatistics.totalReviews) * 100\r\n : 0;\r\n \r\n return (\r\n <HStack key={rating} width=\"100%\" spacing={3}>\r\n <Text width=\"15px\" fontWeight=\"medium\" fontSize=\"sm\">{rating}</Text>\r\n <StarIcon color=\"yellow.400\" boxSize={3} />\r\n <Box\r\n width=\"100%\"\r\n height=\"8px\"\r\n bg=\"gray.100\"\r\n borderRadius=\"full\"\r\n overflow=\"hidden\"\r\n >\r\n <Box\r\n width={`${percentage}%`}\r\n height=\"100%\"\r\n bg=\"yellow.400\"\r\n borderRadius=\"full\"\r\n transition=\"width 0.5s ease-in-out\"\r\n />\r\n </Box>\r\n <Text width=\"30px\" fontSize=\"xs\" color=\"gray.500\">\r\n {count}\r\n </Text>\r\n </HStack>\r\n );\r\n })}\r\n </VStack>\r\n );\r\n\r\n // Helper: Check if a course is already reviewed\r\n const isCourseReviewed = (courseCode: string, semester: number) => {\r\n return reviews.some(r => r.course?.course_code === courseCode && r.semester === semester && r.user_id === session?.user?.id);\r\n };\r\n\r\n // Helper: Get review for a course\r\n const getUserReviewForCourse = (courseCode: string, semester: number) => {\r\n return reviews.find(r => r.course?.course_code === courseCode && r.semester === semester && r.user_id === session?.user?.id);\r\n };\r\n\r\n // Handler: Open review modal for a completed course\r\n const handleReviewCompletedCourse = (course: any) => {\r\n setSelectedCourse(''); // Clear main selection\r\n setFormData({\r\n rating: 0,\r\n difficulty: '',\r\n review: '',\r\n semester: course.semester,\r\n tags: [],\r\n });\r\n // Try to find the course in the main course list by code\r\n const found = courses.find(c => c.course_code === course.course_code);\r\n if (found) setSelectedCourse(found.uuid);\r\n setIsEditMode(false);\r\n onOpen();\r\n };\r\n\r\n // Find the current user's review for the selected course\r\n const userReviewForSelectedCourse = reviews.find(\r\n (review) => review.user_id === session?.user?.id\r\n );\r\n const otherReviews = reviews.filter(\r\n (review) => review.user_id !== session?.user?.id\r\n );\r\n\r\n return (\r\n <>\r\n <NavBar />\r\n <Box className=\"min-h-screen bg-gradient-to-br from-indigo-50 to-purple-50 pb-16\">\r\n <Container maxW=\"7xl\" py={8}>\r\n <Card className=\"bg-white shadow-2xl rounded-2xl overflow-hidden border border-indigo-50 relative\">\r\n {/* Back Button */}\r\n\r\n <CardBody p={[4, 8]}>\r\n {/* Animated Tabs */}\r\n <Flex align=\"center\" justify=\"space-between\" mb={8}>\r\n <Flex align=\"center\" gap={6}>\r\n <Heading size=\"xl\" color=\"purple.700\" fontWeight=\"extrabold\" letterSpacing=\"tight\">\r\n Course Reviews\r\n </Heading>\r\n <HStack spacing={4}>\r\n {TABS.map(tab => (\r\n <Button\r\n key={tab.key}\r\n onClick={() => setActiveTab(tab.key as 'completed' | 'all')}\r\n colorScheme={activeTab === tab.key ? 'purple' : 'gray'}\r\n variant={activeTab === tab.key ? 'solid' : 'ghost'}\r\n size=\"lg\"\r\n fontWeight=\"bold\"\r\n borderRadius=\"full\"\r\n boxShadow={activeTab === tab.key ? 'md' : undefined}\r\n as={motion.button}\r\n whileHover={{ scale: 1.08 }}\r\n whileTap={{ scale: 0.97 }}\r\n >\r\n {tab.label}\r\n </Button>\r\n ))}\r\n </HStack>\r\n </Flex>\r\n <RouterLink to=\"/academic-tools\">\r\n <Button\r\n leftIcon={<ArrowBackIcon />}\r\n colorScheme=\"purple\"\r\n variant=\"solid\"\r\n borderRadius=\"full\"\r\n px={6}\r\n py={2}\r\n fontWeight=\"bold\"\r\n boxShadow=\"md\"\r\n bgGradient=\"linear(to-r, purple.400, purple.600)\"\r\n color=\"white\"\r\n as={motion.button}\r\n whileHover={{ scale: 1.07, x: -4, boxShadow: '0 8px 32px rgba(128,0,255,0.15)' }}\r\n _hover={{ bg: 'purple.500' }}\r\n >\r\n Back to Academic Tools\r\n </Button>\r\n </RouterLink>\r\n </Flex>\r\n\r\n {/* Animated Tab Content */}\r\n <AnimatePresence mode=\"wait\">\r\n {activeTab === 'completed' && (\r\n <motion.div\r\n key=\"completed\"\r\n initial={{ opacity: 0, y: 20 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -20 }}\r\n transition={{ duration: 0.3 }}\r\n >\r\n {/* Completed Courses Section */}\r\n <Card className=\"mb-8 bg-white shadow-md rounded-xl border border-indigo-50\" boxShadow=\"lg\" _hover={{ boxShadow: '2xl', transform: 'scale(1.01)' }} transition=\"all 0.2s\">\r\n <CardBody>\r\n <Heading size=\"md\" color=\"purple.700\" mb={4}>Your Completed Courses</Heading>\r\n {loadingCompleted ? (\r\n <Skeleton height=\"40px\" width=\"100%\" />\r\n ) : completedCourses.length === 0 ? (\r\n <Text color=\"gray.500\">No completed courses found in your transcript.</Text>\r\n ) : (\r\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={6}>\r\n {completedCourses.map(course => (\r\n <Popover trigger=\"hover\" placement=\"auto\">\r\n <PopoverTrigger>\r\n <motion.div\r\n key={course.course_code + '-' + course.semester}\r\n whileHover={{ scale: 1.03, boxShadow: '0 8px 32px rgba(128,0,255,0.10)' }}\r\n >\r\n <Card borderRadius=\"2xl\" borderWidth=\"1px\" borderColor={course.review ? 'purple.200' : 'gray.100'} boxShadow=\"md\" p={4} _hover={{ boxShadow: 'xl' }}>\r\n <CardBody>\r\n <VStack align=\"start\" spacing={2}>\r\n <HStack>\r\n <Text fontWeight=\"bold\" fontSize=\"lg\">{course.course_code}</Text>\r\n <Badge colorScheme=\"purple\" variant=\"solid\" fontSize=\"sm\" px={2} py={1} borderRadius=\"md\">Semester {course.semester}</Badge>\r\n </HStack>\r\n <Text color=\"gray.700\" fontSize=\"md\">{stripLecture(course.course_name)}</Text>\r\n {/* Show analytics summary on card if reviewed */}\r\n {course.review && (\r\n <HStack mt={2}>\r\n <StarIcon color=\"yellow.400\" boxSize={4} />\r\n <Text fontWeight=\"bold\">{course.review.rating.toFixed(1)}</Text>\r\n <DifficultyBadge difficulty={course.review.difficulty as DifficultyLevel} />\r\n <Badge colorScheme=\"purple\" variant=\"subtle\">Reviewed</Badge>\r\n </HStack>\r\n )}\r\n {!course.review && (\r\n <Button\r\n colorScheme=\"green\"\r\n size=\"md\"\r\n variant=\"solid\"\r\n borderRadius=\"lg\"\r\n fontWeight=\"bold\"\r\n px={6}\r\n py={2}\r\n as={motion.button}\r\n whileHover={{ scale: 1.07 }}\r\n whileTap={{ scale: 0.97 }}\r\n onClick={() => handleReviewCompletedCourse(course)}\r\n >\r\n Write a Review\r\n </Button>\r\n )}\r\n </VStack>\r\n </CardBody>\r\n </Card>\r\n </motion.div>\r\n </PopoverTrigger>\r\n {course.review && (\r\n <PopoverContent p={4} borderRadius=\"xl\" boxShadow=\"2xl\" minW=\"350px\">\r\n <PopoverArrow />\r\n <PopoverCloseButton />\r\n <PopoverHeader fontWeight=\"bold\" color=\"purple.700\">Your Review & Analytics</PopoverHeader>\r\n <PopoverBody>\r\n <VStack align=\"start\" spacing={2}>\r\n <HStack>\r\n <StarRating rating={course.review.rating} size=\"sm\" />\r\n <Text fontWeight=\"bold\" ml={1}>{course.review.rating.toFixed(1)}</Text>\r\n <DifficultyBadge difficulty={course.review.difficulty as DifficultyLevel} />\r\n </HStack>\r\n <Text>{course.review.review}</Text>\r\n {course.review.tags && course.review.tags.length > 0 && (\r\n <Wrap spacing={2} mt={2}>\r\n {course.review.tags.map(tag => (\r\n <WrapItem key={tag}>\r\n <Badge colorScheme=\"purple\" variant=\"subtle\" rounded=\"full\" px={3} py={1} fontSize=\"xs\">{tag}</Badge>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n )}\r\n {/* Analytics summary (can add more if desired) */}\r\n <Divider my={2} />\r\n <Text fontSize=\"sm\" color=\"gray.500\">Course Analytics</Text>\r\n <HStack>\r\n <StarIcon color=\"yellow.400\" boxSize={3} />\r\n <Text fontWeight=\"bold\">Avg: {reviewStatistics.avgRating.toFixed(1)}</Text>\r\n <Text color=\"gray.500\">({reviewStatistics.totalReviews} reviews)</Text>\r\n </HStack>\r\n </VStack>\r\n </PopoverBody>\r\n </PopoverContent>\r\n )}\r\n </Popover>\r\n ))}\r\n </SimpleGrid>\r\n )}\r\n </CardBody>\r\n </Card>\r\n </motion.div>\r\n )}\r\n {activeTab === 'all' && (\r\n <motion.div\r\n key=\"all\"\r\n initial={{ opacity: 0, y: 20 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -20 }}\r\n transition={{ duration: 0.3 }}\r\n >\r\n {/* All Courses Section (existing search/filter UI) */}\r\n <VStack spacing={8} align=\"stretch\">\r\n \r\n <Text color=\"gray.600\" fontSize=\"lg\">\r\n Read reviews from students who have taken these courses or share your own experience to help others make informed decisions.\r\n </Text>\r\n\r\n {/* Course Selection */}\r\n <Card variant=\"outline\" p={5} borderRadius=\"xl\" borderColor=\"purple.100\">\r\n <FormControl>\r\n <VStack align=\"stretch\" spacing={4}>\r\n <FormLabel fontSize=\"lg\" fontWeight=\"bold\" color=\"purple.700\">Select a Course</FormLabel>\r\n \r\n {/* Search and Filter Bar */}\r\n <Flex direction={{ base: 'column', md: 'row' }} gap={4} mb={2}>\r\n <Flex flex={1} position=\"relative\">\r\n <Input\r\n placeholder=\"Search by course name or code...\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n pl={10}\r\n bg=\"gray.50\"\r\n borderColor=\"gray.200\"\r\n _focus={{\r\n borderColor: \"purple.400\",\r\n boxShadow: \"0 0 0 1px var(--chakra-colors-purple-400)\",\r\n }}\r\n size=\"md\"\r\n />\r\n <Box\r\n position=\"absolute\"\r\n left={3}\r\n top=\"50%\"\r\n transform=\"translateY(-50%)\"\r\n >\r\n <SearchIcon color=\"gray.400\" />\r\n </Box>\r\n </Flex>\r\n \r\n <Select\r\n placeholder=\"All Departments\"\r\n value={selectedDepartment}\r\n onChange={(e) => setSelectedDepartment(e.target.value)}\r\n maxW={{ base: '100%', md: '180px' }}\r\n bg=\"gray.50\"\r\n borderColor=\"gray.200\"\r\n size=\"md\"\r\n _focus={{\r\n borderColor: \"purple.400\",\r\n boxShadow: \"0 0 0 1px var(--chakra-colors-purple-400)\",\r\n }}\r\n >\r\n {departments.map(dept => (\r\n <option key={dept} value={dept}>\r\n {dept}\r\n </option>\r\n ))}\r\n </Select>\r\n \r\n <HStack spacing={2}>\r\n <Button\r\n colorScheme={viewMode === 'list' ? 'purple' : 'gray'}\r\n variant={viewMode === 'list' ? 'solid' : 'outline'}\r\n onClick={() => setViewMode('list')}\r\n size=\"sm\"\r\n >\r\n List View\r\n </Button>\r\n <Button\r\n colorScheme={viewMode === 'departments' ? 'purple' : 'gray'}\r\n variant={viewMode === 'departments' ? 'solid' : 'outline'}\r\n onClick={() => setViewMode('departments')}\r\n size=\"sm\"\r\n >\r\n By Department\r\n </Button>\r\n </HStack>\r\n </Flex>\r\n \r\n {/* Course Selection Area */}\r\n <Box \r\n maxH=\"500px\" \r\n overflowY=\"auto\" \r\n border=\"1px\" \r\n borderColor=\"gray.200\" \r\n borderRadius=\"md\" \r\n p={2} \r\n bg=\"white\"\r\n >\r\n {isLoading ? (\r\n <VStack spacing={2} p={2}>\r\n <Skeleton height=\"40px\" width=\"100%\" />\r\n <Skeleton height=\"40px\" width=\"100%\" />\r\n <Skeleton height=\"40px\" width=\"100%\" />\r\n </VStack>\r\n ) : filteredCourses.length === 0 ? (\r\n <Box p={4} textAlign=\"center\">\r\n <Text color=\"gray.500\">No courses found matching your search</Text>\r\n </Box>\r\n ) : viewMode === 'list' ? (\r\n <VStack align=\"stretch\" spacing={1}>\r\n {filteredCourses.map(course => {\r\n const userReview = reviews.find(\r\n (r) => r.course?.uuid === course.uuid && r.user_id === session?.user?.id\r\n );\r\n return (\r\n <Popover key={course.uuid} trigger=\"hover\" placement=\"auto\">\r\n <PopoverTrigger>\r\n <Box\r\n key={course.uuid}\r\n p={2}\r\n borderRadius=\"md\"\r\n cursor=\"pointer\"\r\n onClick={() => setSelectedCourse(course.uuid)}\r\n bg={selectedCourse === course.uuid ? \"purple.100\" : \"transparent\"}\r\n _hover={{ bg: selectedCourse === course.uuid ? \"purple.100\" : \"gray.50\" }}\r\n transition=\"background 0.2s\"\r\n >\r\n <Flex justify=\"space-between\" align=\"center\">\r\n <Text fontWeight=\"bold\">{stripLecture(course.course_name)}</Text>\r\n <HStack>\r\n <Badge colorScheme=\"purple\" variant=\"subtle\">{course.dept_acronym}</Badge>\r\n <Text color=\"gray.600\" fontSize=\"sm\">{course.course_code}</Text>\r\n </HStack>\r\n </Flex>\r\n {userReview && (\r\n <HStack mt={2}>\r\n <StarIcon color=\"yellow.400\" boxSize={4} />\r\n <Text fontWeight=\"bold\">{userReview.rating.toFixed(1)}</Text>\r\n <DifficultyBadge difficulty={userReview.difficulty as DifficultyLevel} />\r\n <Badge colorScheme=\"purple\" variant=\"subtle\">Reviewed</Badge>\r\n </HStack>\r\n )}\r\n </Box>\r\n </PopoverTrigger>\r\n {userReview && (\r\n <PopoverContent p={4} borderRadius=\"xl\" boxShadow=\"2xl\" minW=\"350px\">\r\n <PopoverArrow />\r\n <PopoverCloseButton />\r\n <PopoverHeader fontWeight=\"bold\" color=\"purple.700\">Your Review & Analytics</PopoverHeader>\r\n <PopoverBody>\r\n <VStack align=\"start\" spacing={2}>\r\n <HStack>\r\n <StarRating rating={userReview.rating} size=\"sm\" />\r\n <Text fontWeight=\"bold\" ml={1}>{userReview.rating.toFixed(1)}</Text>\r\n <DifficultyBadge difficulty={userReview.difficulty as DifficultyLevel} />\r\n </HStack>\r\n <Text>{userReview.review}</Text>\r\n {userReview.tags && userReview.tags.length > 0 && (\r\n <Wrap spacing={2} mt={2}>\r\n {userReview.tags.map(tag => (\r\n <WrapItem key={course.uuid + '-' + tag}>\r\n <Badge colorScheme=\"purple\" variant=\"subtle\" rounded=\"full\" px={3} py={1} fontSize=\"xs\">{tag}</Badge>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n )}\r\n <Divider my={2} />\r\n <Text fontSize=\"sm\" color=\"gray.500\">Course Analytics</Text>\r\n <HStack>\r\n <StarIcon color=\"yellow.400\" boxSize={3} />\r\n <Text fontWeight=\"bold\">Avg: {reviewStatistics.avgRating.toFixed(1)}</Text>\r\n <Text color=\"gray.500\">({reviewStatistics.totalReviews} reviews)</Text>\r\n </HStack>\r\n </VStack>\r\n </PopoverBody>\r\n </PopoverContent>\r\n )}\r\n </Popover>\r\n );\r\n })}\r\n </VStack>\r\n ) : (\r\n <Tabs variant=\"soft-rounded\" colorScheme=\"purple\" size=\"sm\">\r\n <TabList \r\n overflowX=\"auto\" \r\n py={2} \r\n className=\"flex-nowrap whitespace-nowrap\"\r\n css={{\r\n scrollbarWidth: 'thin',\r\n '&::-webkit-scrollbar': {\r\n height: '6px',\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n backgroundColor: 'rgba(155, 155, 155, 0.5)',\r\n borderRadius: '3px',\r\n }\r\n }}\r\n >\r\n {coursesByDepartment.map(({ department }) => (\r\n <Tab key={department} px={4}>{department}</Tab>\r\n ))}\r\n </TabList>\r\n <TabPanels>\r\n {coursesByDepartment.map(({ department, courses }) => (\r\n <TabPanel key={department} p={2}>\r\n <VStack align=\"stretch\" spacing={1} maxH=\"400px\" overflowY=\"auto\">\r\n {courses\r\n .filter(course => \r\n !searchQuery || \r\n stripLecture(course.course_name).toLowerCase().includes(searchQuery.toLowerCase()) || \r\n course.course_code.toLowerCase().includes(searchQuery.toLowerCase())\r\n )\r\n .map(course => {\r\n const userReview = reviews.find(\r\n (r) => r.course?.uuid === course.uuid && r.user_id === session?.user?.id\r\n );\r\n return (\r\n <Popover key={course.uuid} trigger=\"hover\" placement=\"auto\">\r\n <PopoverTrigger>\r\n <Box\r\n key={course.uuid}\r\n p={2}\r\n borderRadius=\"md\"\r\n cursor=\"pointer\"\r\n onClick={() => setSelectedCourse(course.uuid)}\r\n bg={selectedCourse === course.uuid ? \"purple.100\" : \"transparent\"}\r\n _hover={{ bg: selectedCourse === course.uuid ? \"purple.100\" : \"gray.50\" }}\r\n transition=\"background 0.2s\"\r\n >\r\n <Flex justify=\"space-between\" align=\"center\">\r\n <Text fontWeight=\"bold\">{stripLecture(course.course_name)}</Text>\r\n <HStack>\r\n <Badge colorScheme=\"purple\" variant=\"subtle\">{course.dept_acronym}</Badge>\r\n <Text color=\"gray.600\" fontSize=\"sm\">{course.course_code}</Text>\r\n </HStack>\r\n </Flex>\r\n {userReview && (\r\n <HStack mt={2}>\r\n <StarIcon color=\"yellow.400\" boxSize={4} />\r\n <Text fontWeight=\"bold\">{userReview.rating.toFixed(1)}</Text>\r\n <DifficultyBadge difficulty={userReview.difficulty as DifficultyLevel} />\r\n <Badge colorScheme=\"purple\" variant=\"subtle\">Reviewed</Badge>\r\n </HStack>\r\n )}\r\n </Box>\r\n </PopoverTrigger>\r\n {userReview && (\r\n <PopoverContent p={4} borderRadius=\"xl\" boxShadow=\"2xl\" minW=\"350px\">\r\n <PopoverArrow />\r\n <PopoverCloseButton />\r\n <PopoverHeader fontWeight=\"bold\" color=\"purple.700\">Your Review & Analytics</PopoverHeader>\r\n <PopoverBody>\r\n <VStack align=\"start\" spacing={2}>\r\n <HStack>\r\n <StarRating rating={userReview.rating} size=\"sm\" />\r\n <Text fontWeight=\"bold\" ml={1}>{userReview.rating.toFixed(1)}</Text>\r\n <DifficultyBadge difficulty={userReview.difficulty as DifficultyLevel} />\r\n </HStack>\r\n <Text>{userReview.review}</Text>\r\n {userReview.tags && userReview.tags.length > 0 && (\r\n <Wrap spacing={2} mt={2}>\r\n {userReview.tags.map(tag => (\r\n <WrapItem key={course.uuid + '-' + tag}>\r\n <Badge colorScheme=\"purple\" variant=\"subtle\" rounded=\"full\" px={3} py={1} fontSize=\"xs\">{tag}</Badge>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n )}\r\n <Divider my={2} />\r\n <Text fontSize=\"sm\" color=\"gray.500\">Course Analytics</Text>\r\n <HStack>\r\n <StarIcon color=\"yellow.400\" boxSize={3} />\r\n <Text fontWeight=\"bold\">Avg: {reviewStatistics.avgRating.toFixed(1)}</Text>\r\n <Text color=\"gray.500\">({reviewStatistics.totalReviews} reviews)</Text>\r\n </HStack>\r\n </VStack>\r\n </PopoverBody>\r\n </PopoverContent>\r\n )}\r\n </Popover>\r\n );\r\n })\r\n }\r\n {courses.filter(course => \r\n !searchQuery || \r\n stripLecture(course.course_name).toLowerCase().includes(searchQuery.toLowerCase()) || \r\n course.course_code.toLowerCase().includes(searchQuery.toLowerCase())\r\n ).length === 0 && (\r\n <Box p={4} textAlign=\"center\">\r\n <Text color=\"gray.500\">No courses found matching your search</Text>\r\n </Box>\r\n )}\r\n </VStack>\r\n </TabPanel>\r\n ))}\r\n </TabPanels>\r\n </Tabs>\r\n )}\r\n </Box>\r\n \r\n {selectedCourse && (\r\n <Box mt={2}>\r\n <Text fontSize=\"sm\" color=\"gray.600\">\r\n Selected Course: <Text as=\"span\" fontWeight=\"bold\" color=\"purple.700\">\r\n {courses.find(c => c.uuid === selectedCourse)?.course_code} - {courses.find(c => c.uuid === selectedCourse)?.course_name}\r\n </Text>\r\n </Text>\r\n </Box>\r\n )}\r\n \r\n {!selectedCourse && (\r\n <FormHelperText>\r\n Select a course to see what others are saying\r\n </FormHelperText>\r\n )}\r\n </VStack>\r\n </FormControl>\r\n </Card>\r\n\r\n {selectedCourse && (\r\n <Flex \r\n direction={{ base: 'column', lg: 'row' }} \r\n gap={8} \r\n align=\"start\"\r\n >\r\n {/* Left side - Summary and write review */}\r\n <VStack \r\n width={{ base: '100%', lg: '30%' }}\r\n spacing={6}\r\n align=\"stretch\"\r\n >\r\n <Card borderRadius=\"xl\" overflow=\"hidden\" boxShadow=\"md\" border=\"1px solid\" borderColor=\"purple.100\">\r\n <CardBody>\r\n <VStack spacing={5} align=\"center\">\r\n <Heading size=\"md\" color=\"purple.700\">Course Rating</Heading>\r\n \r\n <Flex direction=\"column\" align=\"center\" justify=\"center\" py={4}>\r\n <Heading size=\"3xl\" fontWeight=\"bold\" color=\"purple.700\">\r\n {reviewStatistics.avgRating.toFixed(1)}\r\n </Heading>\r\n <StarRating rating={Math.round(reviewStatistics.avgRating)} size=\"lg\" />\r\n <Text color=\"gray.500\" fontSize=\"sm\" mt={2}>\r\n Based on {reviewStatistics.totalReviews} {reviewStatistics.totalReviews === 1 ? 'review' : 'reviews'}\r\n </Text>\r\n </Flex>\r\n \r\n <RatingDistribution />\r\n </VStack>\r\n </CardBody>\r\n </Card>\r\n \r\n <Card borderRadius=\"xl\" overflow=\"hidden\" boxShadow=\"md\" border=\"1px solid\" borderColor=\"purple.100\">\r\n <CardBody>\r\n <VStack spacing={5} align=\"stretch\">\r\n <Heading size=\"md\" color=\"purple.700\">Popular Tags</Heading>\r\n \r\n {popularTags.length > 0 ? (\r\n <Wrap>\r\n {popularTags.map(tag => (\r\n <WrapItem key={tag}>\r\n <Badge\r\n colorScheme=\"purple\"\r\n rounded=\"full\"\r\n px={3}\r\n py={1}\r\n fontSize=\"sm\"\r\n >\r\n {tag}\r\n </Badge>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n ) : (\r\n <Text color=\"gray.500\">No tags yet</Text>\r\n )}\r\n </VStack>\r\n </CardBody>\r\n </Card>\r\n \r\n <Button\r\n colorScheme=\"purple\"\r\n size=\"lg\"\r\n onClick={handleOpenReviewModal}\r\n leftIcon={userReview ? <EditIcon /> : <CheckIcon />}\r\n className=\"transform transition-all hover:scale-105 w-full\"\r\n >\r\n {userReview ? 'Edit Your Review' : 'Write a Review'}\r\n </Button>\r\n \r\n {userReview && (\r\n <Button\r\n variant=\"outline\"\r\n colorScheme=\"red\"\r\n onClick={() => setIsDeleteModalOpen(true)}\r\n leftIcon={<DeleteIcon />}\r\n size=\"md\"\r\n >\r\n Delete Your Review\r\n </Button>\r\n )}\r\n </VStack>\r\n\r\n {/* Right side - Reviews list */}\r\n <VStack\r\n width={{ base: '100%', lg: '70%' }}\r\n spacing={5}\r\n align=\"stretch\"\r\n >\r\n <Heading size=\"md\" color=\"gray.700\">Student Reviews</Heading>\r\n\r\n {/* Show user's review at the top if it exists */}\r\n {userReviewForSelectedCourse && (\r\n <motion.div\r\n key={userReviewForSelectedCourse.id}\r\n whileHover={{ boxShadow: 'md', transform: 'translateY(-2px)' }}\r\n >\r\n <Card\r\n borderRadius=\"lg\"\r\n borderWidth=\"2px\"\r\n borderColor=\"purple.400\"\r\n boxShadow=\"lg\"\r\n bg=\"purple.50\"\r\n >\r\n <CardBody>\r\n <VStack align=\"stretch\" spacing={2}>\r\n <HStack justify=\"space-between\">\r\n <Text fontWeight=\"bold\" color=\"purple.700\">Your Review</Text>\r\n <Badge colorScheme=\"purple\" variant=\"solid\">You</Badge>\r\n </HStack>\r\n <HStack>\r\n <StarRating rating={userReviewForSelectedCourse.rating} size=\"sm\" />\r\n <Text fontWeight=\"bold\" ml={1}>\r\n {userReviewForSelectedCourse.rating.toFixed(1)}\r\n </Text>\r\n <DifficultyBadge difficulty={userReviewForSelectedCourse.difficulty as DifficultyLevel} />\r\n </HStack>\r\n <Text>{userReviewForSelectedCourse.review}</Text>\r\n {userReviewForSelectedCourse.tags && userReviewForSelectedCourse.tags.length > 0 && (\r\n <Wrap spacing={2}>\r\n {userReviewForSelectedCourse.tags.map(tag => (\r\n <WrapItem key={tag}>\r\n <Badge\r\n colorScheme=\"purple\"\r\n variant=\"subtle\"\r\n rounded=\"full\"\r\n px={3}\r\n py={1}\r\n fontSize=\"xs\"\r\n >\r\n {tag}\r\n </Badge>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n )}\r\n </VStack>\r\n </CardBody>\r\n </Card>\r\n </motion.div>\r\n )}\r\n\r\n {/* Render other reviews */}\r\n {isLoading ? (\r\n Array.from({ length: 3 }).map((_, i) => (\r\n <Card key={i} boxShadow=\"sm\" borderRadius=\"lg\">\r\n <CardBody>\r\n <VStack align=\"stretch\" spacing={4}>\r\n <HStack>\r\n <Skeleton height=\"40px\" width=\"40px\" borderRadius=\"full\" />\r\n <VStack align=\"start\" spacing={0}>\r\n <Skeleton height=\"20px\" width=\"150px\" />\r\n <Skeleton height=\"16px\" width=\"80px\" />\r\n </VStack>\r\n </HStack>\r\n <Skeleton height=\"20px\" width=\"120px\" />\r\n <Skeleton height=\"60px\" />\r\n <Skeleton height=\"24px\" width=\"80%\" />\r\n </VStack>\r\n </CardBody>\r\n </Card>\r\n ))\r\n ) : (reviews.length === 0) ? (\r\n <Card p={8} textAlign=\"center\" borderRadius=\"lg\">\r\n <VStack spacing={4}>\r\n <Text color=\"gray.500\">No reviews yet for this course</Text>\r\n <Button\r\n colorScheme=\"purple\"\r\n onClick={handleOpenReviewModal}\r\n leftIcon={<CheckIcon />}\r\n >\r\n Be the first to review\r\n </Button>\r\n </VStack>\r\n </Card>\r\n ) : (\r\n otherReviews.map(review => (\r\n <motion.div\r\n key={review.id}\r\n whileHover={{ boxShadow: 'md', transform: 'translateY(-2px)' }}\r\n >\r\n <Card\r\n borderRadius=\"lg\"\r\n borderWidth=\"1px\"\r\n borderColor={review.user_id === session?.user?.id ? \"purple.200\" : \"transparent\"}\r\n >\r\n <CardBody>\r\n <VStack align=\"stretch\" spacing={4}>\r\n <Flex justify=\"space-between\" align=\"center\">\r\n <HStack spacing={3}>\r\n <Avatar\r\n size=\"md\"\r\n name={review.user?.full_name || 'Anonymous'}\r\n src={review.user?.profile_picture_url}\r\n />\r\n <VStack align=\"start\" spacing={0}>\r\n <Text fontWeight=\"bold\">\r\n {review.user?.full_name || 'Anonymous'}\r\n </Text>\r\n <Text fontSize=\"sm\" color=\"gray.500\">\r\n Semester {review.semester}\r\n </Text>\r\n </VStack>\r\n </HStack>\r\n <HStack>\r\n <StarRating rating={review.rating} size=\"sm\" />\r\n <Text fontWeight=\"bold\" ml={1}>\r\n {review.rating.toFixed(1)}\r\n </Text>\r\n </HStack>\r\n </Flex>\r\n <HStack>\r\n <DifficultyBadge difficulty={review.difficulty as DifficultyLevel} />\r\n </HStack>\r\n <Text>{review.review}</Text>\r\n {review.tags && review.tags.length > 0 && (\r\n <Wrap spacing={2}>\r\n {review.tags.map(tag => (\r\n <WrapItem key={tag}>\r\n <Badge\r\n colorScheme=\"purple\"\r\n variant=\"subtle\"\r\n rounded=\"full\"\r\n px={3}\r\n py={1}\r\n fontSize=\"xs\"\r\n >\r\n {tag}\r\n </Badge>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n )}\r\n </VStack>\r\n </CardBody>\r\n </Card>\r\n </motion.div>\r\n ))\r\n )}\r\n </VStack>\r\n </Flex>\r\n )}\r\n </VStack>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </CardBody>\r\n </Card>\r\n </Container>\r\n </Box>\r\n \r\n {/* Review Form Modal */}\r\n <Modal isOpen={isOpen} onClose={onClose} size=\"xl\" scrollBehavior=\"inside\">\r\n <ModalOverlay backdropFilter=\"blur(4px)\" />\r\n <ModalContent borderRadius=\"xl\">\r\n <ModalHeader color=\"purple.700\">\r\n {isEditMode ? 'Edit Your Review' : 'Write a Course Review'}\r\n </ModalHeader>\r\n <ModalCloseButton />\r\n \r\n <ModalBody>\r\n <VStack spacing={6} align=\"stretch\">\r\n <FormControl isRequired>\r\n <FormLabel color=\"purple.700\">Rating</FormLabel>\r\n <HStack spacing={2} align=\"center\">\r\n <StarRating \r\n rating={formData.rating} \r\n onChange={(rating) => setFormData({ ...formData, rating })}\r\n interactive={true}\r\n size=\"lg\"\r\n />\r\n <Text ml={2} fontWeight={formData.rating > 0 ? \"bold\" : \"normal\"} color={formData.rating > 0 ? \"purple.700\" : \"gray.400\"}>\r\n {formData.rating > 0 ? `${formData.rating} stars` : \"Select rating\"}\r\n </Text>\r\n </HStack>\r\n </FormControl>\r\n\r\n <FormControl>\r\n <FormLabel color=\"purple.700\">Difficulty Level</FormLabel>\r\n <Select\r\n value={formData.difficulty}\r\n onChange={(e) => setFormData({ ...formData, difficulty: e.target.value as DifficultyLevel })}\r\n placeholder=\"Select difficulty level\"\r\n >\r\n <option value=\"Easy\">Easy</option>\r\n <option value=\"Medium\">Medium</option>\r\n <option value=\"Hard\">Hard</option>\r\n </Select>\r\n </FormControl>\r\n \r\n <FormControl isRequired>\r\n <FormLabel color=\"purple.700\">Semester Taken</FormLabel>\r\n <Select\r\n value={formData.semester}\r\n onChange={(e) => setFormData({ ...formData, semester: parseInt(e.target.value) })}\r\n >\r\n {[1, 2, 3, 4, 5, 6, 7, 8].map(sem => (\r\n <option key={sem} value={sem}>Semester {sem}</option>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n\r\n <FormControl>\r\n <FormLabel color=\"purple.700\">Review</FormLabel>\r\n <Textarea\r\n value={formData.review}\r\n onChange={(e) => setFormData({ ...formData, review: e.target.value })}\r\n placeholder=\"Share your experience with this course, what you liked, what could be improved, tips for future students...\"\r\n rows={5}\r\n resize=\"vertical\"\r\n />\r\n </FormControl>\r\n\r\n <FormControl>\r\n <FormLabel color=\"purple.700\">Tags</FormLabel>\r\n <FormHelperText mb={3}>\r\n Select tags that best describe this course (max 10)\r\n </FormHelperText>\r\n \r\n <VStack spacing={4} align=\"stretch\" maxH=\"300px\" overflowY=\"auto\" pr={2}>\r\n {/* Popular tags section if available */}\r\n {popularTags.length > 0 && (\r\n <Box mb={2}>\r\n <Text fontSize=\"sm\" fontWeight=\"bold\" color=\"purple.700\" mb={2}>\r\n Popular Tags:\r\n </Text>\r\n <Wrap spacing={2}>\r\n {popularTags.map(tag => (\r\n <WrapItem key={tag}>\r\n <Tag\r\n size=\"md\"\r\n variant={formData.tags.includes(tag) ? \"solid\" : \"outline\"}\r\n colorScheme=\"purple\"\r\n cursor=\"pointer\"\r\n onClick={() => handleTagToggle(tag)}\r\n >\r\n <TagLabel>{tag}</TagLabel>\r\n </Tag>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n </Box>\r\n )}\r\n\r\n {/* Tag categories */}\r\n {tagCategories.map(category => (\r\n <Box key={category.id} mb={3}>\r\n <Text fontSize=\"sm\" fontWeight=\"bold\" color=\"purple.700\" mb={2}>\r\n {category.category_name}:\r\n </Text>\r\n <Wrap spacing={2}>\r\n {category.tags.map(tag => (\r\n <WrapItem key={tag}>\r\n <Tag\r\n size=\"md\"\r\n variant={formData.tags.includes(tag) ? \"solid\" : \"outline\"}\r\n colorScheme=\"purple\"\r\n cursor=\"pointer\"\r\n onClick={() => handleTagToggle(tag)}\r\n >\r\n <TagLabel>{tag}</TagLabel>\r\n </Tag>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n </Box>\r\n ))}\r\n </VStack>\r\n \r\n {formData.tags.length > 0 && (\r\n <Box mt={4}>\r\n <Text fontSize=\"sm\" fontWeight=\"bold\" color=\"purple.700\" mb={2}>\r\n Selected Tags ({formData.tags.length}/10):\r\n </Text>\r\n <Wrap spacing={2}>\r\n {formData.tags.map(tag => (\r\n <WrapItem key={tag}>\r\n <Tag\r\n size=\"md\"\r\n variant=\"solid\"\r\n colorScheme=\"purple\"\r\n >\r\n <TagLabel>{tag}</TagLabel>\r\n <TagCloseButton onClick={() => handleTagToggle(tag)} />\r\n </Tag>\r\n </WrapItem>\r\n ))}\r\n </Wrap>\r\n </Box>\r\n )}\r\n </FormControl>\r\n </VStack>\r\n </ModalBody>\r\n\r\n <ModalFooter>\r\n <Button variant=\"ghost\" mr={3} onClick={onClose}>\r\n Cancel\r\n </Button>\r\n <Button\r\n colorScheme=\"purple\"\r\n onClick={handleSubmitReview}\r\n isDisabled={formData.rating === 0}\r\n >\r\n {isEditMode ? 'Update Review' : 'Submit Review'}\r\n </Button>\r\n </ModalFooter>\r\n </ModalContent>\r\n </Modal>\r\n \r\n {/* Delete Confirmation Modal */}\r\n <Modal isOpen={isDeleteModalOpen} onClose={() => setIsDeleteModalOpen(false)} isCentered>\r\n <ModalOverlay backdropFilter=\"blur(4px)\" />\r\n <ModalContent borderRadius=\"xl\">\r\n <ModalHeader color=\"red.500\">Delete Review</ModalHeader>\r\n <ModalCloseButton />\r\n <ModalBody>\r\n <Text>Are you sure you want to delete your review? This action cannot be undone.</Text>\r\n </ModalBody>\r\n <ModalFooter>\r\n <Button variant=\"ghost\" mr={3} onClick={() => setIsDeleteModalOpen(false)}>\r\n Cancel\r\n </Button>\r\n <Button colorScheme=\"red\" onClick={handleDeleteReview}>\r\n Delete\r\n </Button>\r\n </ModalFooter>\r\n </ModalContent>\r\n </Modal>\r\n </>\r\n );\r\n};\r\n\r\nexport default CourseReviews; "],"names":["courseReviewsService","data","error","supabase","courseUuid","userId","courseCodes","review","id","category","tagCounts","acc","tag","a","b","totalReviews","avgRating","sum","ratingDistribution","difficultyDistribution","completed","row","course","StarRating","rating","size","onChange","interactive","hoverRating","setHoverRating","useState","jsx","HStack","star","StarIcon","DifficultyBadge","difficulty","difficultyMap","color","label","Badge","stripLecture","name","TABS","CourseReviews","session","useAuth","showToast","useToast","isOpen","onOpen","onClose","useDisclosure","isEditMode","setIsEditMode","isDeleteModalOpen","setIsDeleteModalOpen","isLoading","setIsLoading","courses","setCourses","selectedCourse","setSelectedCourse","reviews","setReviews","userReview","setUserReview","tagCategories","setTagCategories","popularTags","setPopularTags","reviewStatistics","setReviewStatistics","searchQuery","setSearchQuery","selectedDepartment","setSelectedDepartment","viewMode","setViewMode","formData","setFormData","completedCourses","setCompletedCourses","loadingCompleted","setLoadingCompleted","activeTab","setActiveTab","departments","React","deptMap","coursesByDepartment","grouped","deptKey","deptA","deptB","dept","filteredCourses","result","query","useEffect","coursesData","categoriesData","loadCourseData","c","allUserReviews","completedWithReviews","r","reviewsData","popularTagsData","sumRatings","distribution","handleOpenReviewModal","handleTagToggle","prev","t","handleSubmitReview","handleDeleteReview","RatingDistribution","VStack","count","percentage","jsxs","Text","Box","handleReviewCompletedCourse","found","userReviewForSelectedCourse","otherReviews","Fragment","NavBar","Container","Card","CardBody","Flex","Heading","tab","Button","motion","RouterLink","ArrowBackIcon","AnimatePresence","Skeleton","SimpleGrid","Popover","PopoverTrigger","PopoverContent","PopoverArrow","PopoverCloseButton","PopoverHeader","PopoverBody","Wrap","WrapItem","Divider","FormControl","FormLabel","Input","e","SearchIcon","Select","Tabs","TabList","department","Tab","TabPanels","TabPanel","FormHelperText","EditIcon","CheckIcon","DeleteIcon","_","i","Avatar","Modal","ModalOverlay","ModalContent","ModalHeader","ModalCloseButton","ModalBody","sem","Textarea","Tag","TagLabel","TagCloseButton","ModalFooter"],"mappings":"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"}
Close