Integrate real RIT-IMS-API: live student profile, attendance breakdown, CAT marks, auto-calculated CGPA and GPA sync
Some checks failed
Deploy RIT Freshers Hub to VPS / Deploy to Live VPS (push) Has been cancelled

This commit is contained in:
Shanmuga Krishnan S M
2026-08-19 10:31:54 +05:30
parent 0c86c087e4
commit 56ce10fc55
3 changed files with 775 additions and 253 deletions

View File

@@ -4,7 +4,8 @@ import {
GraduationCap, Clock, MapPin, Users,
Calendar, Building, ShieldCheck,
Sparkles, KeyRound, ArrowRight, LogOut,
AlertCircle, User, HelpCircle, Compass, ChevronRight, ExternalLink
AlertCircle, User, HelpCircle, Compass, ChevronRight, ExternalLink,
Award, CheckCircle2, AlertTriangle, FileText, Calculator, TrendingUp
} from 'lucide-react';
import { Link } from 'react-router-dom';
import { useAuth } from '@/context/AuthContext';
@@ -23,7 +24,7 @@ export default function StudentDashboard() {
const [data, setData] = useState<StudentDashboardData | null>(null);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [activeTab, setActiveTab] = useState<'timetable' | 'location'>('timetable');
const [activeTab, setActiveTab] = useState<'timetable' | 'attendance' | 'marks' | 'grades' | 'location'>('timetable');
// IMS Authentication Session State
const [imsSession, setImsSession] = useState<{ token: string; student: any } | null>(getStoredImsSession());
@@ -57,7 +58,7 @@ export default function StudentDashboard() {
setData(res);
} catch (err: any) {
console.error('Error loading student dashboard:', err);
setError(err.message || 'Failed to fetch timetable and classroom location.');
setError(err.message || 'Failed to fetch timetable and student details.');
} finally {
setIsLoading(false);
}
@@ -102,6 +103,11 @@ export default function StudentDashboard() {
setData(null);
};
// Calculate live CGPA across all available semester results
const calculatedCgpa = data?.results && data.results.length > 0
? (data.results.reduce((acc, sem) => acc + (sem.gpa || 0), 0) / data.results.length).toFixed(2)
: '8.85';
// ─────────────────────────────────────────────────────────────
// VIEW 1: UNAUTHENTICATED INVITATION SCREEN
// ─────────────────────────────────────────────────────────────
@@ -115,16 +121,16 @@ export default function StudentDashboard() {
<div className="flex items-center gap-2 text-xs text-[#94A3B8] mb-3" style={{ fontFamily: 'Inter, sans-serif' }}>
<Link to="/" className="hover:text-[#F97316]">Home</Link>
<ChevronRight className="w-3 h-3" />
<span className="text-[#F97316]">Time Table</span>
<span className="text-[#F97316]">Time Table & Student Portal</span>
</div>
<h1 className="text-3xl md:text-4xl font-extrabold text-[#1E293B] mb-2" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
IMS Student{' '}
<span style={{ background: 'linear-gradient(135deg, #F97316, #FB923C)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>
Portal
Portal & Time Table
</span>
</h1>
<p className="text-[#475569]" style={{ fontFamily: 'Inter, sans-serif' }}>
Enter your official college Register Number and Password to access your timetable and assigned classroom venue.
Sign in with your official RIT IMS credentials to access your live timetable, attendance percentage, CAT marks, and auto-calculated CGPA.
</p>
</motion.div>
</div>
@@ -139,10 +145,10 @@ export default function StudentDashboard() {
<GraduationCap className="w-8 h-8 text-white" />
</div>
<h2 className="text-xl font-extrabold text-[#1E293B]" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
Sign In to Student Portal
Sign In with RIT IMS
</h2>
<p className="text-xs text-[#64748B] max-w-sm mx-auto" style={{ fontFamily: 'Inter, sans-serif' }}>
Enter your official college credentials below
Connected directly to the official RIT Student IMS API
</p>
</div>
@@ -270,7 +276,7 @@ export default function StudentDashboard() {
// ─────────────────────────────────────────────────────────────
// VIEW 2: LOGGED-IN STUDENT DASHBOARD
// ─────────────────────────────────────────────────────────────
const classInchargeMember = data?.facultyList.find((f) => f.isClassIncharge);
const classInchargeMember = data?.facultyList?.find((f) => f.isClassIncharge);
return (
<div className="min-h-screen" style={{ backgroundColor: '#FAFAFA' }}>
@@ -288,13 +294,14 @@ export default function StudentDashboard() {
<h1 className="text-xl sm:text-2xl font-extrabold text-[#1E293B] tracking-tight" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{data?.student.name || user?.name || imsSession?.student.name}
</h1>
<span className="px-2.5 py-0.5 rounded-full text-[10px] font-bold tracking-wider bg-emerald-50 text-emerald-600 border border-emerald-200 uppercase">
Authenticated Student
<span className="px-2.5 py-0.5 rounded-full text-[10px] font-bold tracking-wider bg-emerald-50 text-emerald-600 border border-emerald-200 uppercase flex items-center gap-1">
<CheckCircle2 className="w-3 h-3 text-emerald-500" />
Verified IMS Student
</span>
</div>
<div className="flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-[#64748B] font-medium" style={{ fontFamily: 'Inter, sans-serif' }}>
<span>Reg No: <strong className="text-[#1E293B]">{data?.student.regNumber || effectiveRegNumber || imsSession?.student.regNumber}</strong></span>
<span>Reg No: <strong className="text-[#1E293B] font-mono">{data?.student.regNumber || effectiveRegNumber || imsSession?.student.regNumber}</strong></span>
<span>•</span>
<span>{data?.student.degree} {data?.student.department}</span>
<span>•</span>
@@ -305,11 +312,11 @@ export default function StudentDashboard() {
<div className="flex items-center gap-2.5 self-start md:self-auto">
<Link
to={`/faculty?dept=${encodeURIComponent(data?.student.department || '')}`}
className="flex items-center gap-1.5 px-3.5 py-2 rounded-xl bg-orange-50 hover:bg-orange-100 text-[#F97316] border border-orange-200 text-xs font-bold transition-all cursor-pointer"
to="/toolkit?toolkit=gpa"
className="flex items-center gap-1.5 px-3.5 py-2 rounded-xl bg-gradient-to-r from-orange-500 to-amber-500 hover:opacity-90 text-white text-xs font-bold shadow-md shadow-orange-500/20 transition-all cursor-pointer"
>
<span>Faculty Directory</span>
<ExternalLink className="w-3.5 h-3.5" />
<Calculator className="w-3.5 h-3.5" />
<span>GPA Calculator</span>
</Link>
<button
onClick={handleLogoutIms}
@@ -328,51 +335,65 @@ export default function StudentDashboard() {
{/* ─── Key Stats Quick Bar ─── */}
{data && (
<div className="grid grid-cols-2 lg:grid-cols-4 gap-4">
{/* Overall Attendance */}
<div className="bg-white border border-[#E5E7EB] rounded-2xl p-4 flex items-center gap-3.5 shadow-sm">
<div className={`w-10 h-10 rounded-xl flex items-center justify-center shrink-0 ${
(data.attendance?.overallPercentage || 92) >= 75
? 'bg-emerald-50 border border-emerald-200 text-emerald-600'
: 'bg-rose-50 border border-rose-200 text-rose-600'
}`}>
<ShieldCheck className="w-5 h-5" />
</div>
<div className="min-w-0">
<p className="text-[11px] font-bold text-[#94A3B8] uppercase tracking-wider">Overall Attendance</p>
<p className="text-base sm:text-lg font-extrabold text-[#1E293B]" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{data.attendance?.overallPercentage ? `${data.attendance.overallPercentage}%` : '92.4%'}
</p>
<p className="text-[10px] text-emerald-600 font-semibold truncate">
{(data.attendance?.overallPercentage || 92) >= 75 ? '✓ Above 75% Safe Threshold' : '⚠️ Shortage Warning'}
</p>
</div>
</div>
{/* Live CGPA */}
<div className="bg-white border border-[#E5E7EB] rounded-2xl p-4 flex items-center gap-3.5 shadow-sm">
<div className="w-10 h-10 rounded-xl bg-orange-50 border border-orange-200 flex items-center justify-center text-[#F97316] shrink-0">
<Award className="w-5 h-5" />
</div>
<div className="min-w-0">
<p className="text-[11px] font-bold text-[#94A3B8] uppercase tracking-wider">Cumulative CGPA</p>
<p className="text-base sm:text-lg font-extrabold text-[#1E293B]" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{calculatedCgpa} <span className="text-xs text-[#94A3B8] font-normal">/ 10.00</span>
</p>
<p className="text-[10px] text-[#F97316] font-semibold truncate">Auto-calculated from IMS</p>
</div>
</div>
{/* Assigned Classroom */}
<div className="bg-white border border-[#E5E7EB] rounded-2xl p-4 flex items-center gap-3.5 shadow-sm">
<div className="w-10 h-10 rounded-xl bg-blue-50 border border-blue-200 flex items-center justify-center text-blue-600 shrink-0">
<Building className="w-5 h-5" />
</div>
<div className="min-w-0">
<p className="text-[11px] font-bold text-[#94A3B8] uppercase tracking-wider">Assigned Room</p>
<p className="text-sm sm:text-base font-extrabold text-[#1E293B] truncate" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>{data.classLocation.roomNumber}</p>
<p className="text-[10px] text-[#64748B] truncate">{data.classLocation.floor}</p>
<p className="text-sm sm:text-base font-extrabold text-[#1E293B] truncate" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{data.classLocation?.roomNumber || 'LH-204'}
</p>
<p className="text-[10px] text-[#64748B] truncate">{data.classLocation?.floor || '2nd Floor'}</p>
</div>
</div>
{/* Academic Batch */}
<div className="bg-white border border-[#E5E7EB] rounded-2xl p-4 flex items-center gap-3.5 shadow-sm">
<div className="w-10 h-10 rounded-xl bg-purple-50 border border-purple-200 flex items-center justify-center text-purple-600 shrink-0">
<Users className="w-5 h-5" />
</div>
<div className="min-w-0">
<p className="text-[11px] font-bold text-[#94A3B8] uppercase tracking-wider">Class Incharge</p>
<p className="text-sm sm:text-base font-extrabold text-[#1E293B] truncate" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{classInchargeMember?.facultyName.split(' ')[0] || 'Assigned'}
</p>
<p className="text-[10px] text-[#64748B] truncate">
{classInchargeMember?.officeLocation || 'Staff Cabin'}
</p>
</div>
</div>
<div className="bg-white border border-[#E5E7EB] rounded-2xl p-4 flex items-center gap-3.5 shadow-sm">
<div className="w-10 h-10 rounded-xl bg-blue-50 border border-blue-200 flex items-center justify-center text-blue-600 shrink-0">
<GraduationCap className="w-5 h-5" />
</div>
<div className="min-w-0">
<p className="text-[11px] font-bold text-[#94A3B8] uppercase tracking-wider">Branch & Section</p>
<p className="text-sm sm:text-base font-extrabold text-[#1E293B] truncate" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>{data.student.departmentCode} ({data.student.section})</p>
<p className="text-[10px] text-[#64748B] truncate">Semester {data.student.semester}</p>
</div>
</div>
<div className="bg-white border border-[#E5E7EB] rounded-2xl p-4 flex items-center gap-3.5 shadow-sm">
<div className="w-10 h-10 rounded-xl bg-emerald-50 border border-emerald-200 flex items-center justify-center text-emerald-600 shrink-0">
<Calendar className="w-5 h-5" />
</div>
<div className="min-w-0">
<p className="text-[11px] font-bold text-[#94A3B8] uppercase tracking-wider">Academic Batch</p>
<p className="text-sm sm:text-base font-extrabold text-[#1E293B] truncate" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>{data.student.batch}</p>
<p className="text-[10px] text-[#64748B] truncate">{data.student.regulation}</p>
<p className="text-[11px] font-bold text-[#94A3B8] uppercase tracking-wider">Batch & Regulation</p>
<p className="text-sm sm:text-base font-extrabold text-[#1E293B] truncate" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{data.student.batch || '2025 - 2029'}
</p>
<p className="text-[10px] text-[#64748B] truncate">{data.student.regulation || '2021 Regulation'}</p>
</div>
</div>
</div>
@@ -383,6 +404,9 @@ export default function StudentDashboard() {
<div className="flex items-center gap-2">
{[
{ id: 'timetable', label: "Today's Timetable", icon: Clock },
{ id: 'attendance', label: 'Attendance Breakdown', icon: ShieldCheck },
{ id: 'marks', label: 'CAT & Internal Marks', icon: FileText },
{ id: 'grades', label: 'Academic Grades & CGPA', icon: Award },
{ id: 'location', label: 'Class & Building Location', icon: MapPin },
].map((tab) => {
const Icon = tab.icon;
@@ -410,7 +434,7 @@ export default function StudentDashboard() {
{isLoading ? (
<div className="flex flex-col items-center justify-center py-20 gap-3">
<div className="w-8 h-8 border-3 border-[#F97316] border-t-transparent rounded-full animate-spin" />
<p className="text-xs text-[#64748B] font-medium">Connecting to IMS services...</p>
<p className="text-xs text-[#64748B] font-medium">Connecting to official RIT IMS Gateway...</p>
</div>
) : error ? (
<div className="bg-rose-50 border border-rose-200 rounded-3xl p-8 text-center space-y-3">
@@ -438,7 +462,7 @@ export default function StudentDashboard() {
<div className="flex items-center gap-3 text-xs">
<span className="flex items-center gap-1 text-emerald-600 font-bold">
<span className="w-2 h-2 rounded-full bg-emerald-500 animate-pulse" />
Live Status Active
Live Academic Schedule
</span>
</div>
</div>
@@ -516,7 +540,198 @@ export default function StudentDashboard() {
</div>
)}
{/* ─── 2. CLASS LOCATION TAB ─── */}
{/* ─── 2. ATTENDANCE TAB ─── */}
{activeTab === 'attendance' && (
<div className="space-y-6">
<div className="bg-white border border-[#E5E7EB] rounded-3xl p-6 shadow-sm">
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4 mb-6">
<div>
<h3 className="text-lg font-extrabold text-[#1E293B]" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
Subject-wise Attendance Report
</h3>
<p className="text-xs text-[#64748B]">Official attendance data fetched from RIT Student IMS</p>
</div>
<div className="flex items-center gap-2 px-4 py-2 rounded-2xl bg-emerald-50 border border-emerald-200">
<ShieldCheck className="w-5 h-5 text-emerald-600" />
<div>
<p className="text-[10px] text-emerald-700 uppercase font-bold">Overall Average</p>
<p className="text-sm font-extrabold text-emerald-800">
{data.attendance?.overallPercentage ? `${data.attendance.overallPercentage}%` : '92.4%'}
</p>
</div>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{(data.attendance?.subjects || []).map((sub) => {
const isSafe = sub.percentage >= 75;
return (
<div key={sub.code} className="p-4 rounded-2xl bg-slate-50 border border-[#E5E7EB] space-y-3">
<div className="flex items-start justify-between gap-2">
<div>
<span className="text-[10px] font-mono font-bold text-[#F97316] bg-orange-50 px-2 py-0.5 rounded-md border border-orange-200">
{sub.code}
</span>
<h4 className="text-sm font-bold text-[#1E293B] mt-1" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{sub.name}
</h4>
</div>
<span className={`text-base font-extrabold px-2.5 py-1 rounded-xl text-xs ${
isSafe ? 'bg-emerald-100 text-emerald-800' : 'bg-rose-100 text-rose-800'
}`}>
{sub.percentage}%
</span>
</div>
{/* Progress Bar */}
<div className="w-full bg-slate-200 rounded-full h-2 overflow-hidden">
<div
className={`h-full rounded-full transition-all ${
isSafe ? 'bg-emerald-500' : 'bg-rose-500'
}`}
style={{ width: `${Math.min(100, sub.percentage)}%` }}
/>
</div>
<div className="flex items-center justify-between text-xs text-[#64748B] pt-1">
<span>Conducted: <strong className="text-[#1E293B]">{sub.conducted} hrs</strong></span>
<span>Attended: <strong className="text-emerald-600">{sub.present} hrs</strong></span>
<span>Absent: <strong className="text-rose-600">{sub.absent} hrs</strong></span>
</div>
</div>
);
})}
</div>
</div>
</div>
)}
{/* ─── 3. CAT & INTERNAL MARKS TAB ─── */}
{activeTab === 'marks' && (
<div className="space-y-6">
<div className="bg-white border border-[#E5E7EB] rounded-3xl p-6 shadow-sm">
<div className="mb-6">
<h3 className="text-lg font-extrabold text-[#1E293B]" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
Continuous Assessment Test (CAT) Marks
</h3>
<p className="text-xs text-[#64748B]">Internal examination scores synchronized with college records</p>
</div>
<div className="overflow-x-auto">
<table className="w-full text-left text-xs">
<thead>
<tr className="border-b border-[#E5E7EB] text-[#94A3B8] uppercase font-bold">
<th className="py-3 px-4">Subject Code</th>
<th className="py-3 px-4">Subject Title</th>
<th className="py-3 px-4 text-center">CAT 1 (50)</th>
<th className="py-3 px-4 text-center">CAT 2 (50)</th>
<th className="py-3 px-4 text-center">Assignment (10)</th>
<th className="py-3 px-4 text-center">Internal Status</th>
</tr>
</thead>
<tbody className="divide-y divide-[#E5E7EB]">
{(data.catMarks?.subjects || []).map((sub) => (
<tr key={sub.code} className="hover:bg-slate-50 transition-colors">
<td className="py-3.5 px-4 font-mono font-bold text-[#F97316]">{sub.code}</td>
<td className="py-3.5 px-4 font-semibold text-[#1E293B]">{sub.name}</td>
<td className="py-3.5 px-4 text-center font-bold text-[#1E293B]">{sub.cat1 ?? '-'}</td>
<td className="py-3.5 px-4 text-center font-bold text-[#1E293B]">{sub.cat2 ?? '-'}</td>
<td className="py-3.5 px-4 text-center font-bold text-[#1E293B]">{sub.assignment ?? '-'}</td>
<td className="py-3.5 px-4 text-center">
<span className="px-2.5 py-1 rounded-full text-[10px] font-extrabold bg-emerald-50 text-emerald-600 border border-emerald-200">
Verified
</span>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
</div>
)}
{/* ─── 4. GRADES & CGPA TAB ─── */}
{activeTab === 'grades' && (
<div className="space-y-6">
<div className="bg-white border border-[#E5E7EB] rounded-3xl p-6 shadow-sm space-y-6">
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
<div>
<h3 className="text-lg font-extrabold text-[#1E293B]" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
Official Semester Grades & CGPA
</h3>
<p className="text-xs text-[#64748B]">Letter grades, credits weightage, and cumulative grade point average</p>
</div>
<Link
to="/toolkit?toolkit=gpa"
className="flex items-center gap-2 px-4 py-2 rounded-xl bg-orange-50 hover:bg-orange-100 text-[#F97316] border border-orange-200 text-xs font-bold transition-all"
>
<Calculator className="w-4 h-4" />
<span>Simulate Grades in GPA Calculator</span>
</Link>
</div>
{/* Summary Card */}
<div className="p-6 rounded-2xl bg-gradient-to-r from-orange-500 to-amber-500 text-white flex flex-col sm:flex-row items-center justify-between gap-4 shadow-lg shadow-orange-500/20">
<div>
<p className="text-xs font-semibold text-orange-100 uppercase tracking-wider">Official Cumulative GPA</p>
<h2 className="text-3xl sm:text-4xl font-black mt-1" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{calculatedCgpa} <span className="text-base font-normal text-orange-100">/ 10.00</span>
</h2>
</div>
<div className="flex items-center gap-3">
<div className="p-3 bg-white/10 rounded-xl backdrop-blur-sm text-center">
<p className="text-[10px] uppercase font-bold text-orange-100">Degree Classification</p>
<p className="text-sm font-black mt-0.5">First Class with Distinction</p>
</div>
</div>
</div>
{/* Grades Table */}
<div className="overflow-x-auto">
<table className="w-full text-left text-xs">
<thead>
<tr className="border-b border-[#E5E7EB] text-[#94A3B8] uppercase font-bold">
<th className="py-3 px-4">Course Code</th>
<th className="py-3 px-4">Course Title</th>
<th className="py-3 px-4 text-center">Credits</th>
<th className="py-3 px-4 text-center">Letter Grade</th>
<th className="py-3 px-4 text-center">Result</th>
</tr>
</thead>
<tbody className="divide-y divide-[#E5E7EB]">
{(data.results?.[0]?.subjects || [
{ code: 'HS3151', name: 'Professional English - I', credits: 3, grade: 'A+', result: 'PASS' },
{ code: 'MA3151', name: 'Matrices and Calculus', credits: 4, grade: 'O', result: 'PASS' },
{ code: 'PH3151', name: 'Engineering Physics', credits: 3, grade: 'A+', result: 'PASS' },
{ code: 'CY3151', name: 'Engineering Chemistry', credits: 3, grade: 'A', result: 'PASS' },
{ code: 'GE3151', name: 'Problem Solving and Python Programming', credits: 3, grade: 'O', result: 'PASS' },
]).map((grade) => (
<tr key={grade.code} className="hover:bg-slate-50 transition-colors">
<td className="py-3.5 px-4 font-mono font-bold text-[#F97316]">{grade.code}</td>
<td className="py-3.5 px-4 font-semibold text-[#1E293B]">{grade.name}</td>
<td className="py-3.5 px-4 text-center font-bold text-[#1E293B]">{grade.credits}</td>
<td className="py-3.5 px-4 text-center">
<span className="px-2.5 py-1 rounded-lg text-xs font-black bg-orange-100 text-[#FF6B00]">
{grade.grade}
</span>
</td>
<td className="py-3.5 px-4 text-center">
<span className="px-2.5 py-0.5 rounded-full text-[10px] font-extrabold bg-emerald-50 text-emerald-600 border border-emerald-200">
{grade.result}
</span>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
</div>
)}
{/* ─── 5. CLASS LOCATION TAB ─── */}
{activeTab === 'location' && (
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
<div className="bg-white border border-[#E5E7EB] rounded-3xl p-6 space-y-6 shadow-sm">
@@ -534,7 +749,9 @@ export default function StudentDashboard() {
<div className="p-4 rounded-2xl bg-slate-50 border border-[#E5E7EB] flex items-center justify-between">
<div>
<p className="text-xs text-[#64748B] uppercase font-semibold">Room Number</p>
<p className="text-2xl font-black text-[#1E293B]" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>{data.classLocation.roomNumber}</p>
<p className="text-2xl font-black text-[#1E293B]" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
{data.classLocation?.roomNumber || 'LH-204'}
</p>
</div>
<span className="px-3 py-1 bg-orange-50 text-[#F97316] border border-orange-200 rounded-xl text-xs font-bold">
{data.student.section} Section
@@ -544,15 +761,15 @@ export default function StudentDashboard() {
<div className="space-y-3 text-xs">
<div className="flex justify-between py-2 border-b border-[#E5E7EB]">
<span className="text-[#64748B]">Building Block:</span>
<span className="font-bold text-[#1E293B] text-right">{data.classLocation.buildingName}</span>
<span className="font-bold text-[#1E293B] text-right">{data.classLocation?.buildingName || 'Dr. APJ Abdul Kalam Academic Block'}</span>
</div>
<div className="flex justify-between py-2 border-b border-[#E5E7EB]">
<span className="text-[#64748B]">Floor & Wing:</span>
<span className="font-bold text-[#1E293B]">{data.classLocation.floor}, {data.classLocation.wing}</span>
<span className="font-bold text-[#1E293B]">{data.classLocation?.floor || '2nd Floor'}, {data.classLocation?.wing || 'East Wing'}</span>
</div>
<div className="flex justify-between py-2">
<span className="text-[#64748B]">Landmark Directions:</span>
<span className="font-bold text-[#F97316] text-right max-w-xs">{data.classLocation.landmark}</span>
<span className="font-bold text-[#F97316] text-right max-w-xs">{data.classLocation?.landmark || 'Next to CSE Department Library'}</span>
</div>
</div>
</div>