{"id":18622921,"url":"https://github.com/mirror45/six-cities","last_synced_at":"2026-04-10T06:51:08.088Z","repository":{"id":253596164,"uuid":"773673460","full_name":"Mirror45/six-cities","owner":"Mirror45","description":"A fully functional React app demonstrating routing, state management, API integration, and user authentication. Includes interactive maps, offer filters, and a favorites system.","archived":false,"fork":false,"pushed_at":"2025-07-10T22:00:20.000Z","size":2297,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-11T04:08:52.328Z","etag":null,"topics":["axios","dayjs","leaflet","react","react-router","redux","redux-toolkit","spa","typescript","vite"],"latest_commit_sha":null,"homepage":"https://six-cities-mirror45.netlify.app/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Mirror45.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"Contributing.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-18T07:33:27.000Z","updated_at":"2025-07-10T22:07:09.000Z","dependencies_parsed_at":"2024-09-18T13:02:23.336Z","dependency_job_id":"e8b667d7-9292-439b-bb7f-65834dcdb081","html_url":"https://github.com/Mirror45/six-cities","commit_stats":null,"previous_names":["mirror45/six-cities-main","mirror45/six-cities"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Mirror45/six-cities","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mirror45%2Fsix-cities","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mirror45%2Fsix-cities/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mirror45%2Fsix-cities/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mirror45%2Fsix-cities/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Mirror45","download_url":"https://codeload.github.com/Mirror45/six-cities/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mirror45%2Fsix-cities/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278838434,"owners_count":26054720,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["axios","dayjs","leaflet","react","react-router","redux","redux-toolkit","spa","typescript","vite"],"created_at":"2024-11-07T04:19:36.111Z","updated_at":"2025-12-30T21:15:08.352Z","avatar_url":"https://github.com/Mirror45.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🏙️ Six Cities – A Rental Booking SPA\n\n🚀 **Live Demo:** [six-cities.vercel.app](https://six-cities-rouge.vercel.app/)\n\nA fully functional Single Page Application (SPA) for property rentals built with the modern **React + Vite** stack. The project demonstrates proficiency in handling complex state management, interactive maps, and asynchronous data operations.\n\n---\n\n## 📖 Project Overview\n\n**Six Cities** simulates a short-term rental booking service across six European cities: *Amsterdam, Cologne, Paris, Dusseldorf, Brussels, and Hamburg*.\n\nThe application implements a complete user flow: from browsing and filtering offers to user authentication and submitting reviews. All data is fetched from a real server.\n\n---\n\n## ✨ Key Features\n\n- ⚡ **Vite-Powered** — Instant server start and lightning-fast Hot Module Replacement (HMR).\n- 🗺️ **Interactive Map (Leaflet)** Offers are displayed on a dynamic map with custom markers. Includes state synchronization: hovering over an offer card highlights the corresponding marker on the map.\n- 🔐 **Authentication \u0026 Protected Routes** Token-based authentication. The **Favorites** page is restricted to authorized users. Unauthorized access attempts redirect to `/login`.\n- ❤️ **Favorites System** Users can add or remove listings from their favorites. The state is synchronized with the server.\n- 🔍 **Sorting \u0026 Filtering** Dynamic filtering by city and sorting options (Popular, Price: low/high, Top rated).\n- 💬 **Reviews \u0026 Ratings** Authorized users can submit reviews with client-side validation (50-300 characters). Dates are formatted using `dayjs`.\n- 🔔 **Error Handling** User-friendly error notifications (using `react-toastify`) for API failures (400, 401, 404).\n\n---\n\n## 🛠 Tech Stack\n\n### 🚀 Core\n\n| Technology | Purpose |\n|------------|---------|\n| **React 18** | UI Library (Hooks, Functional Components). |\n| **TypeScript** | Static typing for robust code (Interfaces, Enums, Generics). |\n| **Vite** | Next-generation frontend tooling for fast build and dev server. |\n| **Redux Toolkit** | Global state management (Slices, createAsyncThunk, Selectors). |\n| **React Router v6** | Declarative client-side routing. |\n| **Axios** | HTTP client with interceptors for token handling and error response. |\n\n### 📦 Additional Libraries\n\n| Library | Role |\n|---------|------|\n| **Leaflet / React-Leaflet** | Rendering interactive maps and markers. |\n| **Vitest** | Unit testing framework (Jest-compatible). |\n| **React Toastify** | Toast notifications for server errors. |\n| **React Helmet Async** | Managing document head (title, meta) for SEO. |\n| **Day.js** | Date formatting. |\n| **Classnames** | Conditional utility for CSS classes. |\n\n---\n\n## 🚀 Getting Started\n\n```bash\n# Clone the repository\ngit clone https://github.com/Mirror45/six-cities.git\n\ncd six-cities\n\n# Install dependencies\nnpm install\n\n# Run the development server\nnpm start\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmirror45%2Fsix-cities","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmirror45%2Fsix-cities","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmirror45%2Fsix-cities/lists"}