import React, { useState, useEffect, useCallback } from 'react'; import { createPortal } from 'react-dom'; import html2canvas from 'html2canvas'; import { jsPDF } from 'jspdf'; import { generateEventDetailsPDF } from '../utils/pdfGenerator'; import CreateEventForm from './CreateEventForm'; import AdminStatusTrackerView from './AdminStatusTrackerView'; import AdminEventStatusView from './AdminEventStatusView'; import FacultyParticipantsView from './FacultyParticipantsView'; import FacultyAttendanceView from './FacultyAttendanceView'; import FacultyProfileView from './FacultyProfileView'; import CreateSpecialEventsView from './CreateSpecialEventsView'; import CreateDomainView from './CreateDomainView'; import { Event, Announcement } from '../types'; interface AdminLandingPageProps { onBack: () => void; onAddEvent: (event: Event) => void; onUpdateEvent: (event: Event) => void; onDeleteEvent: (id: string) => void; events: Event[]; announcements: Announcement[]; onAddAnnouncement: (ann: Announcement) => Promise; onUpdateAnnouncement?: (ann: Announcement) => Promise; onDeleteAnnouncement: (id: string) => Promise; studentDocuments: Record; onSupabaseError?: () => void; onApproveCertificate: (regId: string) => Promise; localRegistrations?: any[]; onViewStudentHub?: () => void; currentUserName?: string; currentUserDept?: string; currentUserEmail?: string; currentUserPhone?: string; currentUserPhoto?: string; currentUserId?: string; domains?: any[]; currentUserFacultyRole?: string; } const SuccessPopup: React.FC<{ onClose: () => void }> = ({ onClose }) => (

Success!

Event successfully created

); const Toast: React.FC<{ message: string; type: 'success' | 'delete'; onClose: () => void }> = ({ message, type, onClose }) => { useEffect(() => { const timer = setTimeout(onClose, 3000); return () => clearTimeout(timer); }, [onClose]); return createPortal(
{message}
, document.body ); }; const AdminLandingPage: React.FC = ({ onBack, onAddEvent, onUpdateEvent, onDeleteEvent, events, announcements, onAddAnnouncement, onUpdateAnnouncement, onDeleteAnnouncement, studentDocuments, onSupabaseError, onApproveCertificate, localRegistrations = [], onViewStudentHub, currentUserName, currentUserDept, currentUserEmail, currentUserPhone, currentUserPhoto, currentUserId, domains = [], currentUserFacultyRole }) => { const [isLoaded, setIsLoaded] = useState(false); const [view, setView] = useState<'OVERVIEW' | 'CREATE' | 'CREATIONS' | 'EDIT' | 'STATUS_TRACKER' | 'EVENT_STATUS' | 'PARTICIPANTS' | 'ATTENDANCE' | 'PROFILE' | 'VERIFICATION'>('OVERVIEW'); const [selectedEvent, setSelectedEvent] = useState(null); const [inspectedEvent, setInspectedEvent] = useState(null); const [toast, setToast] = useState<{ message: string; type: 'success' | 'delete' } | null>(null); const [showSuccessPopup, setShowSuccessPopup] = useState(false); const [isScrolled, setIsScrolled] = useState(false); const [selectionType, setSelectionType] = useState<'NONE' | 'NORMAL' | 'SPECIAL' | 'DOMAIN'>('NONE'); const [isDownloading, setIsDownloading] = useState(false); const downloadPDF = async () => { if (!inspectedEvent) return; setIsDownloading(true); try { generateEventDetailsPDF(inspectedEvent); } catch (error) { console.error("Failed to generate PDF", error); alert("Failed to download PDF. Please try again."); } finally { setIsDownloading(false); } }; useEffect(() => { if (view !== 'CREATE' && view !== 'EDIT') { setSelectionType('NONE'); } }, [view]); useEffect(() => { setIsLoaded(true); const mainElement = document.querySelector('main'); if (!mainElement) return; const handleScroll = () => { setIsScrolled(mainElement.scrollTop > 20); }; mainElement.addEventListener('scroll', handleScroll); return () => { mainElement.removeEventListener('scroll', handleScroll); }; }, []); const handleCloseToast = useCallback(() => setToast(null), []); const handleEditClick = (event: Event) => { setSelectedEvent(event); setView('EDIT'); }; const handleDelete = (id: string, title: string) => { onDeleteEvent(id); setToast({ message: `"${title}" has been deleted.`, type: 'delete' }); }; const handleCreateSuccess = (event: Event) => { if (view === 'EDIT') { onUpdateEvent(event); setToast({ message: "Event updated successfully!", type: 'success' }); setView('CREATIONS'); } else { onAddEvent(event); setShowSuccessPopup(true); } setSelectedEvent(null); }; const closeSuccessPopup = () => { setShowSuccessPopup(false); setView('CREATIONS'); }; const navLinks = [ { label: 'HOME', active: view === 'OVERVIEW', onClick: () => setView('OVERVIEW') }, { label: 'CREATE EVENTS', active: view === 'CREATE' || view === 'EDIT', onClick: () => { setSelectedEvent(null); setView('CREATE'); } }, { label: 'CREATIONS', active: view === 'CREATIONS', onClick: () => setView('CREATIONS') }, ...(currentUserFacultyRole === 'HOD' ? [ { label: 'VERIFICATION', active: view === 'VERIFICATION', onClick: () => setView('VERIFICATION') } ] : []), { label: 'STATUS TRACKER', active: view === 'STATUS_TRACKER', onClick: () => setView('STATUS_TRACKER') }, { label: 'EVENT STATUS', active: view === 'EVENT_STATUS', onClick: () => setView('EVENT_STATUS') }, { label: 'PARTICIPANTS', active: view === 'PARTICIPANTS', onClick: () => setView('PARTICIPANTS') }, { label: 'ATTENDANCE', active: view === 'ATTENDANCE', onClick: () => setView('ATTENDANCE') }, { label: 'PROFILE', active: view === 'PROFILE', onClick: () => setView('PROFILE') }, ]; return (
{showSuccessPopup && }
setView('OVERVIEW')} > RIT Logo
{view === 'OVERVIEW' && (

EVENT
COORDINATOR
HUB

Orchestrate prestigious campus events within
an innovative digital environment.

{onViewStudentHub && ( )}
)} {(view === 'CREATE' || view === 'EDIT') && (
{selectionType === 'NONE' && view === 'CREATE' ? (

Generate Event

Choose Verification Category

{/* Normal Events Bar */}
setSelectionType('NORMAL')} className="group relative bg-white/70 backdrop-blur-xl border border-white rounded-[4rem] p-12 shadow-2xl hover:shadow-[#004a99]/10 transition-all duration-500 cursor-pointer overflow-hidden flex flex-col items-center text-center hover:-translate-y-2 border-slate-200/50" >

Normal Events

Standard campus activities, workshops, and departmental seminars.

Explore Registry
{/* Special Events Bar */}
setSelectionType('SPECIAL')} className="group relative bg-white/70 backdrop-blur-xl border border-white rounded-[4rem] p-12 shadow-2xl hover:shadow-orange-500/10 transition-all duration-500 cursor-pointer overflow-hidden flex flex-col items-center text-center hover:-translate-y-2 border-slate-200/50" >

Special Events

Prestigious summits, symposiums, and high-impact institutional celebrations.

Explore Registry
{/* Domains Bar */}
setSelectionType('DOMAIN')} className="group relative bg-white/70 backdrop-blur-xl border border-white rounded-[4rem] p-12 shadow-2xl hover:shadow-emerald-500/10 transition-all duration-500 cursor-pointer overflow-hidden flex flex-col items-center text-center hover:-translate-y-2 border-slate-200/50" >

Create Domains

Propose new domains for Technical, Non-Technical, and Workshop categories.

Create Registry
) : (
{(selectionType === 'NORMAL' || view === 'EDIT') && (
{ setView('CREATIONS'); setSelectionType('NONE'); }} onSuccess={handleCreateSuccess} onSupabaseError={onSupabaseError} />
)} {selectionType === 'SPECIAL' && (
setToast({ message: msg, type: type })} />
)} {selectionType === 'DOMAIN' && (
{ setSelectionType('NONE'); }} onShowToast={(msg, type) => setToast({ message: msg, type: type })} />
)}
)}
)} {view === 'CREATIONS' && (

Creations

Synchronized Digital Hub

Event Creations

{events.length > 0 ? events.map((event) => (
{event.title}
{event.category}
Enrollment Status {event.currentParticipants || 0} / {event.maxParticipants || (event.deptLimits && Object.keys(event.deptLimits).length > 0 ? Object.values(event.deptLimits).map(Number).reduce((a, b) => a + b, 0) : '∞')}
{event.verificationStatus === 'APPROVED' ? ( <> Active / Approved ) : event.verificationStatus === 'REJECTED' ? ( <> Rejected ) : event.verificationStatus === 'PENDING_HOD' ? ( <> Awaiting HOD Approval ) : ( <> Awaiting Admin Approval )}
{event.pricingType}

{event.title}

{event.event_summary || "No summary provided."}

{event.date}{event.schedule?.[0]?.start_time ? ` • ${event.schedule[0].start_time}` : ''}
{event.location}
{event.conducting_dept &&
{event.conducting_dept}
}
{/* Financial Summary */} {(event.total_expense || 0) > 0 && (

Financial Projections

{(event.refreshment_expense || 0) > 0 && (
Refreshment ₹{event.refreshment_expense}
)} {(event.transportation_expense || 0) > 0 && (
Transportation ₹{event.transportation_expense}
)} {((event as any).session_coverage_fee || 0) > 0 && (
Session Coverage ₹{(event as any).session_coverage_fee}
)}
Total ₹{event.total_expense}
)}
{event.created_by === currentUserId ? ( <> ) : (
View Only
)}
)) : (

Awaiting New Sessions

Start your curation by generating a new prestigious event for the community.

)}
{/* Domains Subsection — moved to end for UX clarity */} {domains.length > 0 && (

Proposed Domains

{domains.map((domain) => (
{domain.category} {domain.status === 'APPROVED' ? ( ) : domain.status === 'REJECTED' ? ( ) : ( )}

{domain.name}

{domain.status || 'PENDING'}

))}
)}
)} {view === 'STATUS_TRACKER' && setToast({ message: msg, type: 'success' })} studentDocuments={studentDocuments} onApproveCertificate={onApproveCertificate} localRegistrations={localRegistrations} currentUserId={currentUserId} />} {view === 'EVENT_STATUS' && ( setView('CREATIONS')} onUpdateEvent={onUpdateEvent} currentUserId={currentUserId} localRegistrations={localRegistrations} /> )} {view === 'PARTICIPANTS' && } {view === 'ATTENDANCE' && setToast({ message: msg, type: 'success' })} localRegistrations={localRegistrations} currentUserId={currentUserId} />} {view === 'PROFILE' && ( )} {view === 'VERIFICATION' && currentUserFacultyRole === 'HOD' && (

HOD Event Verification

Review and approve/decline event creation requests for the {currentUserDept || 'your'} department

{(() => { const pendingEvents = events.filter( e => e.verificationStatus === 'PENDING_HOD' && e.conducting_dept === currentUserDept ); if (pendingEvents.length === 0) { return (

Clear Queue

No pending verification requests found for your department.

); } return (
{pendingEvents.map((event) => (
{event.category}

{event.title}

Created by: {event.coordinator}

Domain {event.domain}
Venue {event.location}
Date {event.date}
Type {event.pricingType}
))}
); })()}
)}
{toast && } {inspectedEvent && (
{inspectedEvent.title}
{inspectedEvent.category} {inspectedEvent.pricingType} {inspectedEvent.status && ( {inspectedEvent.status} )}

{inspectedEvent.title}

Event Summary

{inspectedEvent.event_summary || "No detailed summary available for this prestigious event session."}

Domain Focus
{inspectedEvent.domain?.charAt(0) || }
{inspectedEvent.domain}
Coordinator
{inspectedEvent.coordinator}
Creation Time (IST)
{inspectedEvent.request_by_faculty ? new Date(inspectedEvent.request_by_faculty).toLocaleString('en-IN', { timeZone: 'Asia/Kolkata', dateStyle: 'medium', timeStyle: 'short' }) : 'N/A'}
{/* Operational Settings & Rules */}

Operational Details

Conducting Dept {inspectedEvent.conducting_dept || 'General'}
Associated Club {inspectedEvent.club || 'None'}
Participant Target {inspectedEvent.participantType || 'All'}
Duration {inspectedEvent.durationDays || 1} Day(s)
Reg. Deadline {inspectedEvent.registrationDeadline ? new Date(inspectedEvent.registrationDeadline).toLocaleString('en-US', { month: 'short', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }) : 'None'}
Event Format {inspectedEvent.isTeamEvent ? 'Team Play' : 'Solo Mode'}
{inspectedEvent.isTeamEvent && (
Team Size Limit Max {inspectedEvent.teamSizeLimit || 1} ({inspectedEvent.teamComposition})
)}
{/* Finance & Budget */}

Budget & Financial Summary

Refreshments ₹{inspectedEvent.refreshment_expense || 0}
Transport ₹{inspectedEvent.transportation_expense || 0}
Session Fee ₹{inspectedEvent.session_coverage_fee || 0}
Total Expense ₹{inspectedEvent.total_expense || 0}
{/* Department Allocations & Quotas */} {inspectedEvent.deptLimits && Object.keys(inspectedEvent.deptLimits).length > 0 && (

Department Limits & Seat Quotas

{Object.entries(inspectedEvent.deptLimits).map(([dept, maxSeats]) => { const current = inspectedEvent.currentDeptCounts?.[dept] || 0; const sectionLimits = inspectedEvent.deptSectionLimits?.[dept]; const hasSectionLimits = sectionLimits && Object.keys(sectionLimits).length > 0; return (
{dept} {current} / {maxSeats} Seats
{hasSectionLimits && (
{Object.entries(sectionLimits).map(([sec, limit]) => { const secCount = inspectedEvent.currentDeptSectionCounts?.[dept]?.[sec] || 0; return (
Sec {sec}: {secCount} / {limit}
); })}
)}
); })}
)} {/* Event Schedule & Resource Persons */} {inspectedEvent.schedule && inspectedEvent.schedule.length > 0 && (

Event Schedule & Resource Persons

{inspectedEvent.schedule.map((slot, idx) => (
Day {slot.day_idx} — Batch {slot.batch_idx} {slot.date} ({slot.start_time} - {slot.end_time})
{slot.resource_person ? (
Resource Person {slot.resource_person.name} {slot.resource_person.type} speaker
Affiliation {slot.resource_person.dept ? `${slot.resource_person.dept} dept, ` : ''} {slot.resource_person.college_name || 'RIT'}
Contact {slot.resource_person.email} {slot.resource_person.phone}
) : (
No Resource Person Assigned
)}
))}
)}

Session Details

{inspectedEvent.date}

{inspectedEvent.time}

{inspectedEvent.location}

Institutional Venue

Enrollment Status {inspectedEvent.currentParticipants || 0} / {inspectedEvent.maxParticipants || (inspectedEvent.deptLimits && Object.keys(inspectedEvent.deptLimits).length > 0 ? Object.values(inspectedEvent.deptLimits).map(Number).reduce((a, b) => a + b, 0) : '∞')}
0 ? Object.values(inspectedEvent.deptLimits).map(Number).reduce((a, b) => a + b, 0) : null)) === 'number' ? (inspectedEvent.maxParticipants || (inspectedEvent.deptLimits && Object.keys(inspectedEvent.deptLimits).length > 0 ? Object.values(inspectedEvent.deptLimits).map(Number).reduce((a, b) => a + b, 0) : 100)) : 100)) * 100, 100)}%` }} />
{/* Verification Hierarchy & Request Timeline */}

Verification Timeline

{/* Faculty Step */}
Faculty Coordinator Request Initiated {inspectedEvent.request_by_faculty ? ( {new Date(inspectedEvent.request_by_faculty).toLocaleString('en-US', { month: 'short', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' })} ) : ( Pending )}
{/* HOD Step */}
Head of Department HOD Request Raised {inspectedEvent.category === 'CENTRE-ACTIVITY' ? ( Bypassed (Centre Activity) ) : inspectedEvent.request_by_HOD ? ( {new Date(inspectedEvent.request_by_HOD).toLocaleString('en-US', { month: 'short', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' })} ) : ( Pending HOD Verification )}
{/* Admin Step */}
Admin Hub Publish Status {inspectedEvent.verificationStatus === 'APPROVED' ? 'Published' : inspectedEvent.verificationStatus === 'REJECTED' ? 'Rejected' : 'Awaiting Admin Approval'}
)}
); }; export default AdminLandingPage;