# Reservation Management System Aplikacja SPA do zarządzania rezerwacjami zbudowana w React 19 + Vite 8. Umożliwia klientom przeglądanie dostępnych terminów, dokonywanie rezerwacji z płatnością depozytu, zarządzanie historią rezerwacji oraz wystawianie opinii. Administratorzy mają dostęp do panelu zarządzania, kalendarza rezerwacji, analityki i eksportu danych. --- ## Uruchomienie ```bash # Terminal 1 – REST API (json-server na porcie 3001) npm run api # Terminal 2 – Vite dev server (port 5173) npm run dev # Testy jednostkowe (Vitest + RTL) npm test # Testy e2e (Playwright) node test_rms.mjs # Storybook (port 6006) npm run storybook ``` > **Uwaga:** przed uruchomieniem `test_rms.mjs` oba serwery muszą być aktywne. Test automatycznie przywraca dane seed (r1, r2) do stanu `pending` przed każdym przebiegiem. --- ## Dane testowe | Rola | E-mail | Hasło | |------|--------|-------| | Admin | `admin@reservations.dev` | `Admin1234!` | | Klient | `anna.kowalski@example.com` | `Client1234!` | Logowanie zawsze uruchamia **weryfikację 2FA** – kod jest wyświetlany bezpośrednio w interfejsie (symulowany e-mail). --- ## Stos technologiczny | Warstwa | Technologia | |---------|-------------| | UI | React 19, Vite 8, SCSS Modules | | Routing | React Router v7 | | Zapytania REST | TanStack React Query v5 + Axios | | Zapytania GraphQL | Apollo Client v4 + SchemaLink (in-memory) | | Formularze | Formik + Zod (`zod-formik-adapter`) | | Ikony | Lucide React | | REST mock | json-server (db.json) | | Testy jednostkowe | Vitest + React Testing Library | | Testy e2e | Playwright | | Dokumentacja | Storybook 8 | --- ## Struktura projektu ``` web_projekt/ ├── db.json # Baza danych json-server (users, services, reservations) ├── test_rms.mjs # Testy e2e Playwright (32 testy) ├── src/ │ ├── main.jsx # Punkt wejścia: Apollo Client, QueryClient, renderowanie │ ├── App.jsx # Router, lazy loading, ErrorBoundary, Suspense, ProtectedRoute │ ├── index.css # Reset + CSS custom properties (tryb ciemny/jasny) │ ├── styles/ │ │ ├── _variables.scss # Tokeny projektu: kolory, spacing, typografia, cienie, media queries │ │ └── main.scss # Globalne style bazowe │ ├── api/ │ │ ├── reservations.js # CRUD rezerwacji przez Axios (json-server :3001) │ │ ├── services.js # Pobieranie listy usług │ │ └── users.js # Pobieranie i aktualizacja użytkowników │ ├── context/ │ │ ├── AuthContext.jsx # Stan uwierzytelnienia, 2FA, role, sesja w localStorage │ │ └── ThemeContext.jsx # Przełącznik jasny/ciemny motyw (data-theme na ) │ ├── hocs/ │ │ └── withRole.jsx # HOC: renderuje komponent tylko dla dozwolonych ról │ ├── hooks/ │ │ ├── useCreateReservation.js # useMutation: POST /reservations │ │ ├── useDeleteReservation.js # useMutation: DELETE /reservations/:id │ │ ├── useReservations.js # useQuery: GET /reservations (wszystkie) │ │ ├── useServices.js # useQuery: GET /services │ │ ├── useSlotReservations.js # useQuery: GET /reservations?serviceId&date │ │ ├── useUpdateReservation.js # useMutation: PATCH /reservations/:id │ │ └── useUserReservations.js # useQuery: GET /reservations?userId │ ├── pages/ │ │ ├── LoginPage.jsx # Formularz logowania (Formik+Zod) + ekran 2FA z podglądem kodu │ │ ├── LoginPage.module.scss │ │ ├── RegisterPage.jsx # Rejestracja z walidacją Zod i weryfikacją e-mail │ │ ├── RegisterPage.module.scss │ │ ├── DashboardPage.jsx # Panel klienta: AvailabilitySearch, SlotFinder, BookingWizard, MyReservations, ProfileEditModal │ │ ├── DashboardPage.module.scss │ │ ├── ReservationsPage.jsx # Historia rezerwacji z filtrami, anulowaniem, RescheduleModal, ReviewsSection, Google Calendar, re-book │ │ ├── ReservationsPage.module.scss │ │ ├── AdminPage.jsx # Panel admina: tabela rezerwacji, UserManagement, AnalyticsDashboard, AdminCalendar, blokowanie terminów (useTransition) │ │ └── AdminPage.module.scss │ ├── components/ │ │ ├── AvailabilitySearch.jsx # Wyszukiwanie wolnych slotów z synchronizacją URL (useSearchParams) │ │ ├── AvailabilitySearch.module.scss │ │ ├── BookingWizard.jsx # 4-krokowy kreator rezerwacji (Usługa → Data → Wymagania → Podsumowanie) │ │ ├── BookingWizard.module.scss │ │ ├── BookingForm.jsx # Uproszczony formularz rezerwacji (react-hook-form) │ │ ├── BookingForm.module.scss │ │ ├── SlotFinder.jsx # Inteligentny finder slotów z punktacją (scoreSlot, findSlots) │ │ ├── SlotFinder.module.scss │ │ ├── PaymentModal.jsx # Modal płatności: Karta / Google Pay / Przelew bankowy (Portal) │ │ ├── PaymentModal.module.scss │ │ ├── RescheduleModal.jsx # Modal zmiany terminu rezerwacji (Portal) │ │ ├── RescheduleModal.module.scss │ │ ├── ProfileEditModal.jsx # Modal edycji profilu i preferencji powiadomień (Portal, Formik+Zod) │ │ ├── ProfileEditModal.module.scss │ │ ├── ReviewsSection.jsx # Sekcja opinii (GraphQL: useQuery + useMutation przez Apollo) │ │ ├── ReviewsSection.module.scss │ │ ├── ProfileView.jsx # Widok profilu (GraphQL: userProfile query) │ │ ├── ProfileView.module.scss │ │ ├── MyReservations.jsx # Sidebar z aktywnymi rezerwacjami użytkownika │ │ ├── MyReservations.module.scss │ │ ├── AdminCalendar.jsx # Widok kalendarza dla admina (miesiąc, kliknięcie dnia, panel boczny) │ │ ├── AdminCalendar.module.scss │ │ ├── AnalyticsDashboard.jsx # Statystyki rezerwacji z eksportem CSV (DataRenderer, useMemo) │ │ ├── AnalyticsDashboard.module.scss │ │ ├── UserManagement.jsx # Zarządzanie użytkownikami przez admina (tabela, dezaktywacja, reset hasła) │ │ ├── UserManagement.module.scss │ │ ├── Modal.jsx # Bazowy komponent modala (Portal, useCallback, Escape key, aria) │ │ ├── Modal.module.scss │ │ ├── StatusBadge.jsx # Odznaka statusu rezerwacji (warianty kolorów, rozmiary, aria-label) │ │ ├── StatusBadge.module.scss │ │ ├── StatusBadge.test.jsx # Testy RTL dla StatusBadge │ │ ├── ThemeToggle.jsx # Przycisk przełączania motywu (jasny/ciemny) │ │ ├── ThemeToggle.module.scss │ │ ├── DataRenderer.jsx # Render-prop: opakowuje useQuery, przekazuje dane przez children() │ │ ├── ErrorBoundary.jsx # Class component: łapie błędy runtime, wyświetla fallback UI │ │ ├── ErrorBoundary.module.scss │ │ ├── LoadingSpinner.jsx # Animowany spinner ładowania │ │ ├── LoadingSpinner.module.scss │ │ └── ProtectedRoute.jsx # Guard routingu: sprawdza rolę i przekierowuje │ ├── stories/ │ │ ├── StatusBadge.stories.jsx # Storybook: wszystkie warianty odznaki statusu │ │ ├── Modal.stories.jsx # Storybook: modal informacyjny i destrukcyjny │ │ └── ThemeToggle.stories.jsx # Storybook: przełącznik motywu │ └── tests/ │ ├── LoginPage.test.jsx # RTL: formularz logowania, błędy walidacji │ ├── BookingForm.test.jsx # RTL: formularz rezerwacji, react-hook-form │ ├── ProtectedRoute.test.jsx # RTL: ochrona tras, przekierowania │ └── StatusBadge.test.jsx # RTL: warianty statusu └── public/ └── index.html # Zawiera