Movie recommendation web app — A clean, responsive React application that recommends movies and TV shows. Built with Redux Toolkit for predictable state management and implements infinite scroll to browse long lists. Live demo: https://cuddle-screen.vercel.app/
CuddleScreen is a React-based movie recommendation web app that aggregates trending and popular movies/TV shows and presents them with an infinite-scroll browsing experience. The app is intended to be fast, responsive, and easy to extend with new data sources and features.
Live demo: https://cuddle-screen.vercel.app/
- Home page with aggregated trending content
- Dedicated pages for Trending, Popular, Movies, and TV Shows
- Infinite scroll for large lists (load more on demand)
- Redux Toolkit for predictable state management and caching
- Client-side routing for fast navigation
- Loading skeletons and graceful error states
- React (functional components + hooks)
- Redux Toolkit (slices + async thunks / RTK Query)
- React Router for navigation
- Intersection Observer API for infinite scroll
- Fetch/Axios for API requests
- Vercel for hosting (deployed)
- Node.js (v16+ recommended)
- npm or yarn
git clone <your-repo-url>
cd cuddle-screen
npm install
# or
# yarnCreate a .env.local in the project root and add the variables your project expects. Example (adjust names to your code):
VITE_TMDB_BEARER=npm run dev
# or
# yarn devOpen http://localhost:3000 (or the port printed by Vite/CRA).
(Examples — update to match your package.json)
npm run dev— start development servernpm run build— create production buildnpm run preview— preview production build locallynpm run lint— run linternpm run test— run tests
src/
├─ components/ # Reusable UI components (Card, Header, Loader)
├─ features/ # Redux slices (trending, movies, tv, popular)
├─ pages/ # Page components (Home, Trending, Popular, Movies, TV)
├─ services/ # API clients and fetch helpers
├─ hooks/ # Custom hooks (useInfiniteScroll, useDebounce)
├─ routes/ # App routing config
├─ App.jsx
└─ index.jsx
-
Organize domain logic into feature slices (e.g.,
trendingSlice,moviesSlice). -
Each slice commonly stores:
items— array of resultspageorcursor— pagination statehasMore— whether more pages are availableloading/error— request states
-
Use async thunks to fetch paginated data and take advantage of built-in caching.
Recommended approach:
- Use the API's pagination (
pageorcursor) to fetch chunks of data. - Maintain
pageandhasMorein Redux slice state. - Render a sentinel element after the list and observe it with
IntersectionObserver. - When the sentinel becomes visible and
loading === falseandhasMore === true, dispatch the next-page fetch action.
- Fork the repo
- Create a branch:
git checkout -b feat/your-feature - Make changes and add tests
- Open a PR with a clear description and screenshots if UI changed
Commit message suggestions:
feat(...)— new featurefix(...)— bug fixchore(...)— maintenancedocs(...)— documentation
This project is available under the MIT License.