feat: initial project setup with frontend mockup

- Docker Compose setup with nginx reverse proxy and frontend service
- React + Vite + Tailwind CSS configuration
- Complete mockup of all application views:
  - Authentication (login/register)
  - Events list and selection
  - Event chat with matchmaking
  - 1:1 private chat with WebRTC P2P video transfer mockup
  - Partner rating system
  - Collaboration history
- Mock data for users, events, messages, matches, and ratings
- All UI text and messages in English
- Project documentation (CONTEXT.md, TODO.md, README.md, QUICKSTART.md)
This commit is contained in:
Radosław Gierwiało
2025-11-12 17:50:44 +01:00
commit 80ff4a70bf
38 changed files with 7213 additions and 0 deletions

123
frontend/src/App.jsx Normal file
View File

@@ -0,0 +1,123 @@
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import { AuthProvider, useAuth } from './contexts/AuthContext';
import LoginPage from './pages/LoginPage';
import RegisterPage from './pages/RegisterPage';
import EventsPage from './pages/EventsPage';
import EventChatPage from './pages/EventChatPage';
import MatchChatPage from './pages/MatchChatPage';
import RatePartnerPage from './pages/RatePartnerPage';
import HistoryPage from './pages/HistoryPage';
// Protected Route Component
const ProtectedRoute = ({ children }) => {
const { isAuthenticated, loading } = useAuth();
if (loading) {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-lg text-gray-600">Loading...</div>
</div>
);
}
if (!isAuthenticated) {
return <Navigate to="/login" replace />;
}
return children;
};
// Public Route Component (redirect to events if already logged in)
const PublicRoute = ({ children }) => {
const { isAuthenticated, loading } = useAuth();
if (loading) {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-lg text-gray-600">Loading...</div>
</div>
);
}
if (isAuthenticated) {
return <Navigate to="/events" replace />;
}
return children;
};
function App() {
return (
<BrowserRouter>
<AuthProvider>
<Routes>
{/* Public Routes */}
<Route
path="/login"
element={
<PublicRoute>
<LoginPage />
</PublicRoute>
}
/>
<Route
path="/register"
element={
<PublicRoute>
<RegisterPage />
</PublicRoute>
}
/>
{/* Protected Routes */}
<Route
path="/events"
element={
<ProtectedRoute>
<EventsPage />
</ProtectedRoute>
}
/>
<Route
path="/events/:eventId/chat"
element={
<ProtectedRoute>
<EventChatPage />
</ProtectedRoute>
}
/>
<Route
path="/matches/:matchId/chat"
element={
<ProtectedRoute>
<MatchChatPage />
</ProtectedRoute>
}
/>
<Route
path="/matches/:matchId/rate"
element={
<ProtectedRoute>
<RatePartnerPage />
</ProtectedRoute>
}
/>
<Route
path="/history"
element={
<ProtectedRoute>
<HistoryPage />
</ProtectedRoute>
}
/>
{/* Default redirect */}
<Route path="/" element={<Navigate to="/events" replace />} />
<Route path="*" element={<Navigate to="/events" replace />} />
</Routes>
</AuthProvider>
</BrowserRouter>
);
}
export default App;