import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { UserRole, DashboardView, Event, Announcement, Ticket } from '../types'; import { supabase } from '../supabase'; import Navbar from './Navbar'; import Hero from './Hero'; import HomeDashboard from './HomeDashboard'; import EventList from './EventList'; import EventCard from './EventCard'; import ProfileView from './ProfileView'; import StatusTrackerView from './StatusTrackerView'; import RegistrationsView from './RegistrationsView'; import UpcomingEventsSlider from './UpcomingEventsSlider'; import AboutHubSection from './AboutHubSection'; import StatsSection from './StatsSection'; import AboutSection from './AboutSection'; import ContactSection from './ContactSection'; import Footer from './Footer'; const Portal: React.FC<{ children: React.ReactNode }> = ({ children }) => { return createPortal(children, document.body); }; interface DashboardProps { userRole: UserRole; events: Event[]; announcements: Announcement[]; bookedEventIds: string[]; userRegistrations: any[]; onToggleBooking: (id: string) => void; onLogout: () => void; onUploadCertificate: (eventId: string, data: string) => Promise; studentDocuments: Record; onUploadDoc: (studentId: string, data: string) => void; currentUserName: string; onSupabaseError?: () => void; onBackToCoordinatorHub?: () => void; specialEvents: any[]; } const Dashboard: React.FC = ({ userRole, events, announcements, bookedEventIds, userRegistrations, onToggleBooking, onLogout, onUploadCertificate, studentDocuments, onUploadDoc, currentUserName, onSupabaseError, onBackToCoordinatorHub, specialEvents }) => { const [activeView, setActiveView] = useState('HOME'); const [selectedCategory, setSelectedCategory] = useState(null); const [trackedEvent, setTrackedEvent] = useState(null); // Team Management States const [showCreateModal, setShowCreateModal] = useState<{eventId: string, title: string} | null>(null); const [showJoinModal, setShowJoinModal] = useState<{eventId: string, title: string} | null>(null); const [teamName, setTeamName] = useState(''); const [teamCode, setTeamCode] = useState(''); const [isProcessing, setIsProcessing] = useState(false); const generateCode = () => Math.random().toString(36).substring(2, 8).toUpperCase(); const handleCreateTeam = async (eventId: string) => { if (!teamName.trim()) return alert("Enter team name"); setIsProcessing(true); try { const code = generateCode(); const { data: { user } } = await supabase.auth.getUser(); if (!user) return; const registrationId = `${user.id}_${eventId}`; const { error } = await supabase.from('registrations').update({ team_code: code, team_name: teamName.trim(), is_team_leader: true }).eq('id', registrationId); if (error) throw error; setShowCreateModal(null); setTeamName(''); window.location.reload(); } catch (err) { console.error(err); alert("Failed to create team"); } finally { setIsProcessing(false); } }; const handleJoinTeam = async (eventId: string) => { if (!teamCode.trim()) return alert("Enter team code"); setIsProcessing(true); try { const { data: { user } } = await supabase.auth.getUser(); if (!user) return; const { data: teamRegs, error: fetchErr } = await supabase .from('registrations') .select('*') .eq('event_id', eventId) .eq('team_code', teamCode.trim().toUpperCase()); if (fetchErr) throw fetchErr; if (!teamRegs || teamRegs.length === 0) return alert("Invalid team code for this event"); const leader = teamRegs.find(r => r.is_team_leader); const event = events.find(e => e.id === eventId); if (event?.teamSizeLimit && teamRegs.length >= event.teamSizeLimit) { return alert("Team is already full"); } const { data: myProfile } = await supabase.from('Studentusers').select('department').eq('id', user.id).single(); if (event?.teamComposition === 'INTER_DEPT' && leader && myProfile?.department !== leader.dept) { return alert(`This event requires INTER-DEPARTMENT teams. You must join a team from ${leader.dept}`); } const registrationId = `${user.id}_${eventId}`; const { error: joinErr } = await supabase.from('registrations').update({ team_code: teamCode.trim().toUpperCase(), team_name: leader?.team_name || 'Team', is_team_leader: false }).eq('id', registrationId); if (joinErr) throw joinErr; setShowJoinModal(null); setTeamCode(''); window.location.reload(); } catch (err) { console.error(err); alert("Failed to join team"); } finally { setIsProcessing(false); } }; useEffect(() => { if (activeView !== 'EVENTS' && activeView !== 'STATUS_TRACKER') { setSelectedCategory(null); } }, [activeView]); const handleTrackStatus = (event: Event) => { setTrackedEvent(event); setActiveView('STATUS_TRACKER'); }; const renderContent = () => { switch (activeView) { case 'HOME': return ( <> setActiveView('EVENTS')} specialEvents={specialEvents} /> ); case 'ABOUT': return (
); case 'CONTACT': return (
); case 'EVENTS': return ( ); case 'REGISTRATIONS': return ( ); case 'PROFILE': return ; case 'STATUS_TRACKER': const registration = userRegistrations.find(r => String(r.event_id) === String(trackedEvent?.id)); return trackedEvent ? ( setActiveView('REGISTRATIONS')} onUploadCertificate={(data) => onUploadCertificate(trackedEvent.id, data)} onShowCreateTeam={() => setShowCreateModal({ eventId: trackedEvent.id, title: trackedEvent.title })} onShowJoinTeam={() => setShowJoinModal({ eventId: trackedEvent.id, title: trackedEvent.title })} /> ) : null; default: return null; } }; return (
{renderContent()}
); }; export default Dashboard;