{error}
} - - {/* Search Loading State */} - {isSearchLoading && ( -Searching...
-- Search Results - - ({searchResults.length} found) - -
-Loading your watchlist...
-diff --git a/cinetrack-app/.gitignore b/cinetrack-app/.gitignore index b50664c..4c4a1b6 100644 --- a/cinetrack-app/.gitignore +++ b/cinetrack-app/.gitignore @@ -14,6 +14,7 @@ dist-ssr .env .env.* !.env.example +infra/data # Editor directories and files .vscode/* diff --git a/cinetrack-app/client/.env.example b/cinetrack-app/client/.env.example index 06581bd..4388b4a 100644 --- a/cinetrack-app/client/.env.example +++ b/cinetrack-app/client/.env.example @@ -1,10 +1,10 @@ # Client Environment Variables # Copy this file to .env and fill in your values -# TMDB API Read Access Token (required) -# Used as fallback if backend proxy fails +# TMDB API Read Access Token (optional - only needed as fallback) +# The server proxies all TMDB requests, so this is only used if proxy fails # Get one at: https://www.themoviedb.org/settings/api -VITE_TMDB_API_READ_ACCESS_TOKEN=your_tmdb_api_read_access_token +VITE_TMDB_API_READ_ACCESS_TOKEN= # API Base URL (optional, for development when server runs separately) # Leave empty in production as the client is served by the backend diff --git a/cinetrack-app/client/package.json b/cinetrack-app/client/package.json index e1368ad..7625931 100644 --- a/cinetrack-app/client/package.json +++ b/cinetrack-app/client/package.json @@ -10,12 +10,13 @@ "preview": "vite preview" }, "dependencies": { + "framer-motion": "^12.23.26", "react": "^19.2.1", "react-dom": "^19.2.1", "react-icons": "^5.5.0", + "react-router-dom": "^7.11.0", "scheduler": "^0.27.0", "socket.io-client": "^4.8.1", - "use-context-selector": "^2.0.0", "zustand": "^5.0.9" }, "devDependencies": { diff --git a/cinetrack-app/client/src/App.tsx b/cinetrack-app/client/src/App.tsx index ad407f9..52fc90d 100644 --- a/cinetrack-app/client/src/App.tsx +++ b/cinetrack-app/client/src/App.tsx @@ -1,387 +1,23 @@ -import React, { Suspense, lazy, memo, useMemo } from "react"; -import { FiSettings, FiSearch, FiBell, FiGithub, FiArrowLeft } from "react-icons/fi"; +import React, { Suspense, lazy } from "react"; import { ErrorBoundary } from "./components/common/ErrorBoundary"; -import { WatchlistProvider } from "./contexts/WatchlistContext"; -import { useWatchlistStore, getWatchlistIds } from "./store/useWatchlistStore"; -import { UIProvider, useUIContext } from "./contexts/UIContext"; +import { UIProvider } from "./contexts/UIContext"; import { DiscoverProvider } from "./contexts/DiscoverContext"; import { AuthProvider, useAuthContext } from "./contexts/AuthContext"; -import { SearchBar } from "./components/common/SearchBar"; -import { SearchPalette } from "./components/common/SearchPalette"; -import { NotificationsModal } from "./components/common/NotificationsModal"; -import { LoadingPosterAnimation } from "./components/common/LoadingPosterAnimation"; -import { BottomNavBar } from "./components/layout/BottomNavBar"; -import { SideNavBar } from "./components/layout/SideNavBar"; -import { MediaGrid } from "./components/media/MediaGrid"; -import { useLocalStorage } from "./hooks/useLocalStorage"; -import { getTVSeasonDetails } from "./services/tmdbService"; +import { DemoWelcomeModal, useDemoWelcome } from "./components/common/DemoWelcomeModal"; +import { RouterProvider } from "react-router-dom"; +import { router } from "./router"; +import { useWatchlistInit } from "./store/useWatchlistStore"; -const AuthPage = lazy(() => import("./pages/AuthPage").then(m => ({ default: m.AuthPage }))); -const DiscoverPage = lazy(() => import("./pages/DiscoverPage").then(m => ({ default: m.DiscoverPage }))); -const ListsPage = lazy(() => import("./pages/ListsPage").then(m => ({ default: m.ListsPage }))); -const RecommendationsPage = lazy(() => import("./pages/RecommendationsPage").then(m => ({ default: m.RecommendationsPage }))); -const StatisticsPage = lazy(() => import("./pages/StatisticsPage").then(m => ({ default: m.StatisticsPage }))); -const ViewAllPage = lazy(() => import("./pages/ViewAllPage").then(m => ({ default: m.ViewAllPage }))); +const AuthPage = lazy(() => import("./pages/AuthPage").then((m) => ({ default: m.AuthPage }))); -// Lazy load heavy modal components -const MediaDetailModal = lazy(() => - import("./components/media/MediaDetailModal").then((module) => ({ - default: module.MediaDetailModal, - })) -); -const SettingsModal = lazy(() => - import("./components/features/SettingsModal").then((module) => ({ - default: module.SettingsModal, - })) -); - -// Loading fallback for modals -const ModalLoadingFallback: React.FC = () => ( -
{error}
} - - {/* Search Loading State */} - {isSearchLoading && ( -Searching...
-Loading your watchlist...
-