-
+
+ {/* Chat Tab */}
+ {activeTab === 'chat' && (
+
+ {/* Sidebar - visible only on chat tab on larger screens */}
+
+
!shouldHideUser(u.userId))}
+ activeUsers={activeUsers}
+ userHeats={userHeats}
+ userCompetitorNumbers={userCompetitorNumbers}
+ myHeats={myHeats}
+ hideMyHeats={hideMyHeats}
+ onHideMyHeatsChange={setHideMyHeats}
+ onMatchWith={handleMatchWith}
+ />
+
- {/* Message Input */}
-
-
setNewMessage(e.target.value)}
- onSubmit={handleSendMessage}
- disabled={!isConnected}
- placeholder="Write a message..."
+ {/* Chat Area */}
+
+
+
+ {/* Message Input */}
+
+ setNewMessage(e.target.value)}
+ onSubmit={handleSendMessage}
+ disabled={!isConnected}
+ placeholder="Write a message..."
+ />
+
+
+
+ )}
+
+ {/* Participants Tab */}
+ {activeTab === 'participants' && (
+
+
!shouldHideUser(u.userId))}
+ activeUsers={activeUsers}
+ userHeats={userHeats}
+ userCompetitorNumbers={userCompetitorNumbers}
+ myHeats={myHeats}
+ hideMyHeats={hideMyHeats}
+ onHideMyHeatsChange={setHideMyHeats}
+ onMatchWith={handleMatchWith}
+ fullWidth={true}
/>
-
+ )}
+
+ {/* Recording Tab */}
+ {activeTab === 'recording' && (
+
+ )}
{/* Leave Event Button */}
diff --git a/frontend/src/pages/EventDetailsPage.jsx b/frontend/src/pages/EventDetailsPage.jsx
index 2a176f1..861721d 100644
--- a/frontend/src/pages/EventDetailsPage.jsx
+++ b/frontend/src/pages/EventDetailsPage.jsx
@@ -1,9 +1,9 @@
import { useState, useEffect } from 'react';
import { useParams, Link } from 'react-router-dom';
import { QRCodeSVG } from 'qrcode.react';
-import { Copy, Check, Users, Calendar, MapPin, QrCode } from 'lucide-react';
+import { Copy, Check, Users, Calendar, MapPin, QrCode, Video, Clock, Save, RefreshCw } from 'lucide-react';
import Layout from '../components/layout/Layout';
-import { eventsAPI } from '../services/api';
+import { eventsAPI, matchingAPI } from '../services/api';
export default function EventDetailsPage() {
const { slug } = useParams();
@@ -12,6 +12,11 @@ export default function EventDetailsPage() {
const [error, setError] = useState('');
const [copied, setCopied] = useState(false);
+ // Registration deadline state
+ const [deadlineInput, setDeadlineInput] = useState('');
+ const [savingDeadline, setSavingDeadline] = useState(false);
+ const [runningMatching, setRunningMatching] = useState(false);
+
useEffect(() => {
fetchEventDetails();
}, [slug]);
@@ -21,6 +26,11 @@ export default function EventDetailsPage() {
setLoading(true);
const response = await eventsAPI.getDetails(slug);
setEventDetails(response.data);
+ // Initialize deadline input
+ if (response.data?.event?.registrationDeadline) {
+ const deadline = new Date(response.data.event.registrationDeadline);
+ setDeadlineInput(deadline.toISOString().slice(0, 16)); // Format for datetime-local
+ }
} catch (err) {
console.error('Error loading event details:', err);
setError(err.message || 'Failed to load event details');
@@ -29,6 +39,34 @@ export default function EventDetailsPage() {
}
};
+ const handleSaveDeadline = async () => {
+ try {
+ setSavingDeadline(true);
+ const deadline = deadlineInput ? new Date(deadlineInput).toISOString() : null;
+ await matchingAPI.setRegistrationDeadline(slug, deadline);
+ await fetchEventDetails(); // Refresh data
+ } catch (err) {
+ console.error('Failed to save deadline:', err);
+ alert('Nie udalo sie zapisac deadline');
+ } finally {
+ setSavingDeadline(false);
+ }
+ };
+
+ const handleRunMatching = async () => {
+ try {
+ setRunningMatching(true);
+ const result = await matchingAPI.runMatching(slug);
+ alert(`Matching zakonczony! Dopasowano: ${result.matched}, Nie znaleziono: ${result.notFound}`);
+ await fetchEventDetails(); // Refresh data
+ } catch (err) {
+ console.error('Failed to run matching:', err);
+ alert('Nie udalo sie uruchomic matchingu');
+ } finally {
+ setRunningMatching(false);
+ }
+ };
+
const copyToClipboard = async () => {
try {
await navigator.clipboard.writeText(eventDetails.checkin.url);
@@ -210,6 +248,89 @@ export default function EventDetailsPage() {