React Frontend Application
Overview
The Movie List frontend is a React.js application that provides an interactive user interface for browsing movies, watching trailers, and reading/writing reviews. It uses modern React patterns including hooks, routing, and component-based architecture.
Application Structure
Entry Point (index.js)
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import App from './App';
import 'bootstrap/dist/css/bootstrap.min.css';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>
      <Routes>
        <Route path="/*" element={<App />} />
      </Routes>
    </BrowserRouter>
  </React.StrictMode>
);
Key Features:
- ReactDOM.createRoot: Modern React 18 rendering method
 - BrowserRouter: Enables client-side routing for single-page application behavior
 - Bootstrap CSS: Provides pre-built styling components
 - React.StrictMode: Helps identify potential problems in development
 
Main Application Component (App.js)
State Management
const [movies, setMovies] = useState();
const [movie, setMovie] = useState();
const [reviews, setReviews] = useState([]);
State Variables:
- movies: Array of all movies for the home page carousel
 - movie: Currently selected movie for detailed view
 - reviews: Array of reviews for the selected movie
 
API Integration
const getMovies = async () => {
  try {
    const response = await api.get("/api/v1/movies");
    setMovies(response.data);
  } catch(err) {
    console.log(err);
  }
}
const getMovieData = async (movieId) => {
  try {
    const response = await api.get(`/api/v1/movies/${movieId}`);
    const singleMovie = response.data;
    setMovie(singleMovie);
    setReviews(singleMovie.reviews);
  } catch (error) {
    console.error(error);
  }
}
API Functions:
- getMovies(): Fetches all movies from the backend API
 - getMovieData(movieId): Fetches specific movie details and reviews
 
Routing Configuration
<Routes>
  <Route path="/" element={<Layout/>}>
    <Route path="/" element={<Home movies={movies} />} />
    <Route path="/Trailer/:ytTrailerId" element={<Trailer/>} />
    <Route path="/Reviews/:movieId" element={<Reviews getMovieData={getMovieData} movie={movie} reviews={reviews} setReviews={setReviews} />} />
    <Route path="*" element={<NotFound/>} />
  </Route>
</Routes>
Route Structure:
- / - Home page displaying movie carousel
 - /Trailer/:ytTrailerId - Movie trailer page with YouTube video
 - /Reviews/:movieId - Movie reviews page with review form
 - ****** - Catch-all route for 404 pages
 
API Configuration (axiosConfig.js)
import axios from 'axios';
export default axios.create({
    baseURL: 'http://localhost:8080',
    headers: {"ngrok-skip-browser-warning": "true"}
});
Configuration Details:
- baseURL: Points to the Spring Boot backend API
 - ngrok-skip-browser-warning: Header for development tunneling tools
 - Axios: HTTP client library for making API requests
 
Component Architecture
Layout Component
const Layout = () => {
  return (
    <main>
      <Outlet/>
    </main>
  )
}
Purpose: Provides a consistent layout wrapper for all pages using React Router's Outlet component.
Header Component
const Header = () => {
  return (
    <Navbar bg="dark" variant="dark" expand="lg">
      <Container fluid>
        <Navbar.Brand href="/" style={{"color":'gold'}}>
          <FontAwesomeIcon icon={faVideoSlash}/>Gold
        </Navbar.Brand>
        <Nav className="me-auto my-2 my-lg-0">
          <NavLink className="nav-link" to="/">Home</NavLink>
          <NavLink className="nav-link" to="/watchList">Watch List</NavLink>      
        </Nav>
        <Button variant="outline-info">Login</Button>
        <Button variant="outline-info">Register</Button>
      </Container>
    </Navbar>
  )
}
Features:
- React Bootstrap Navbar: Responsive navigation bar
 - FontAwesome Icons: Video icon for branding
 - NavLink: React Router navigation with active state styling
 - Placeholder Buttons: Login/Register (not yet implemented)
 
Home Component
const Home = ({movies}) => {
  return (
    <Hero movies={movies} />
  )
}
Purpose: Simple wrapper that passes movie data to the Hero component for display.
Hero Component (Movie Carousel)
const Hero = ({movies}) => {
  const navigate = useNavigate();
  function reviews(movieId) {
    navigate(`/Reviews/${movieId}`);
  }
  return (
    <div className='movie-carousel-container'>
      <Carousel>
        {movies?.map((movie) => {
          return(
            <Paper key={movie.imdbId}>
              <div className='movie-card-container'>
                <div className="movie-card" style={{"--img": `url(${movie.backdrops[0]})`}}>
                  <div className="movie-detail">
                    <div className="movie-poster">
                      <img src={movie.poster} alt="" />
                    </div>
                    <div className="movie-title">
                      <h4>{movie.title}</h4>
                    </div>
                    <div className="movie-buttons-container">
                      <Link to={`/Trailer/${movie.trailerLink.substring(movie.trailerLink.length - 11)}`}>
                        <FontAwesomeIcon icon={faCirclePlay} />
                      </Link>
                      <Button variant="info" onClick={() => reviews(movie.imdbId)}>
                        Reviews
                      </Button>
                    </div>
                  </div>
                </div>
              </div>
            </Paper>
          )
        })}
      </Carousel>
    </div>
  )
}
Key Features:
- Material-UI Carousel: Displays movies in a rotating carousel
 - Dynamic Styling: Uses CSS custom properties for background images
 - Navigation:
- Play button links to trailer page
 - Reviews button navigates to reviews page
 
 - YouTube ID Extraction: Extracts video ID from YouTube URL for trailer links
 
React Concepts Used
Hooks
- useState: Manages component state for movies, reviews, and selected movie
 - useEffect: Fetches initial movie data when app loads
 - useNavigate: Programmatic navigation between routes
 
Props
Components receive data through props:
- movies: Passed from App to Home to Hero
 - getMovieData: Function passed to Reviews component
 - reviews/setReviews: State and setter passed for review management
 
Conditional Rendering
{movies?.map((movie) => { ... })}
Uses optional chaining (?.) to safely render only when movies data is available.
Key Libraries Used
UI Libraries
- React Bootstrap: Pre-styled components (Navbar, Button, Container)
 - Material-UI: Carousel and Paper components
 - FontAwesome: Icons for play buttons and branding
 
Routing
- React Router DOM: Client-side routing with BrowserRouter, Routes, Route, Link, NavLink
 
HTTP Client
- Axios: Promise-based HTTP client for API requests
 
Component Communication Flow
- 
App Component:
- Fetches movie data from API
 - Manages global state
 - Provides data to child components
 
 - 
Header Component:
- Independent navigation component
 - Always visible across all pages
 
 - 
Home → Hero:
- Displays movie carousel
 - Handles navigation to trailers and reviews
 
 - 
Reviews Component:
- Receives movie data and review functions
 - Allows users to view and create reviews
 
 
Benefits of This Architecture
- Component Reusability: Each component has a single responsibility
 - State Management: Centralized state in App component with prop drilling
 - Responsive Design: Bootstrap ensures mobile-friendly interface
 - Client-Side Routing: Fast navigation without page reloads
 - API Integration: Clean separation between frontend and backend
 - Modern React Patterns: Uses hooks and functional components throughout