- Getting Started (00:28)
- What is React (4:32)
 - Setting Up the Development Environment (3:37)
 - Your First React App (6:33)
 - Hello World (5:25)
 - Custom Configs (3:11)
 - Full-stack Architecture (2:44)
 - Course Structure (2:24)
 - Start Redux?
 
 - ES6 Refresher (00:48)
- Introduction (1:43)
 - Let vs Var vs Const (3:52)
 - Objects (2:45)
 - The this Keyword (2:49)
 - Binding this (2:36)
 - Arrow Functions (4:15)
 - Arrow Functions and this (4:14)
 - Array.map Method (3:36)
 - Object Destructuring (2:29)
 - Spread Operator (4:02)
 - Classes (3:45)
 - Inheritance (4:03)
 - Modules (4:11)
 - Named and Default Exports (5:15)
 
 - Components (01:17)
- Introduction (1:38)
 - Setting Up the Project (2:06)
 - Your First React Component (5:20)
 - Specifying Children (4:16)
 - Embedding Expressions (4:50)
 - Setting Attributes (5:45)
 - Rendering Classes Dynamically (4:18)
 - Rendering Lists (3:58)
 - Conditional Rendering (6:04)
 - Handling Events (2:49)
 - Binding Event Handlers (4:36)
 - Updating the State (2:14)
 - What Happens When State Changes (2:04)
 - Passing Event Arguments (3:04)
 - Setting Up the Vidly Project (5:38)
 - Exercises (3:25)
 - Building the Movies Component (7:18)
 - Deleting a Movie (5:18)
 - Conditional Rendering (3:26)
 - Summary (0:36)
 
 - Composing Components (01:19)
- Introduction (0:45)
 - Composing Components (3:45)
 - Passing Data to Components (3:11)
 - Passing Children (3:10)
 - Debugging React Apps (4:09)
 - Props vs State (2:24)
 - Raising and Handling Events (4:52)
 - Updating the State (4:38)
 - Single Source of Truth (3:55)
 - Removing the Local State (6:47)
 - Multiple Components in Sync (5:53)
 - Lifting the State Up (5:36)
 - Stateless Functional Components (2:29)
 - Destructuring Arguments (2:00)
 - Lifecycle Hooks (1:38)
 - Mounting Phase (5:34)
 - Updating Phase (4:20)
 - Unmounting Phase (1:26)
 - Exercise- Decrement Button (1:05)
 - Solution - Decrement Button (4:53)
 - Exercise- Like Component (1:44)
 - Solution- Like Component (12:26)
 - Summary (0:42)
 
 - Pagination, Filtering, and Sorting (01:47)
- Introduction (1:08)
 - Exercise- Pagination Component (1:01)
 - Pagination- Component Interface (3:47)
 - Pagination- Displaying Pages (6:48)
 - Pagination- Handling Page Changes (5:49)
 - Pagination- Paginating Data (6:14)
 - Pagination- Type Checking with PropTypes (4:56)
 - Exercise- ListGroup Component (1:24)
 - Filtering- Component Interface (5:32)
 - Filtering- Displaying Items (3:57)
 - Filtering- Default Props (2:06)
 - Filtering- Handling Selection (4:20)
 - Filtering- Implementing Filtering (2:59)
 - Filtering- Adding All Genres (3:39)
 - Sorting- Extracting MoviesTable (5:19)
 - Sorting- Raising the Sort Event (3:28)
 - Sorting- Implementing Sorting (5:13)
 - Sorting- Moving Responsibility (5:15)
 - Sorting- Extracting TableHeader (7:44)
 - Sorting- Extracting TableBody (3:12)
 - Sorting- Rendering Cell Content (8:02)
 - Sorting- Unique Keys - Final (2:58)
 - Sorting- Adding the Sort Icon (3:57)
 - Sorting- Extracting Table (3:51)
 - Sorting- Extracting a Method (3:18)
 - Destructuring Arguments (0:58)
 - Summary (0:51)
 
 - Routing (00:53)
- Introduction (0:33)
 - Setup (1:46)
 - Adding Routing (4:15)
 - Switch (2:26)
 - Link (4:20)
 - Route Props (2:10)
 - Passing Props (2:35)
 - Route Parameters (3:32)
 - Optional Parameters (2:06)
 - Query String Parameters (3:51)
 - Redirects (3:06)
 - Programmatic Navigation (2:20)
 - Nested Routing (4:35)
 - Exercises- NavBar and Routing (1:43)
 - Adding React Router (1:26)
 - Adding Routes (4:57)
 - Adding the NavBar (4:39)
 - Linking to the MovieForm (4:42)
 - Summary (0:31)
 
 - Forms (01:34)
- Introduction (0:38)
 - Building a Bootstrap Form (5:34)
 - Handling Form Submission (2:00)
 - Refs (3:58)
 - Controlled Elements (4:32)
 - Handling Multiple Inputs (2:49)
 - Common Errors (2:28)
 - Extracting a Reusable Input (3:57)
 - Validation (2:56)
 - A Basic Validation Implementation (3:11)
 - Displaying Validation Errors (3:42)
 - Validation on Change (4:19)
 - Joi (4:33)
 - Validating a Form Using Joi (4:43)
 - Validating a Field Using Joi (5:22)
 - Disabling the Submit Button (1:11)
 - Code Review (3:13)
 - Extracting a Reusable Form (4:51)
 - Extracting Helper Rendering Methods (8:18)
 - Register Form (1:42)
 - Code Review (1:10)
 - Exercise 2- Movie Form (3:18)
 - Code Review (8:24)
 - Exercise 3- Search Movies (1:22)
 - Code Review (5:12)
 
 - Calling Backend Services (01:42)
- Introduction (1:13)
 - JSON Placeholder (2:54)
 - Http Clients (2:56)
 - Getting Data (5:26)
 - Creating Data (4:52)
 - Lifecycle of a Request (2:50)
 - Updating Data (4:14)
 - Deleting Data (1:35)
 - Optimistic vs Pessimistic Updates (4:24)
 - Expected vs Unexpected Errors (6:40)
 - Handling Unexpected Errors Globally (7:54)
 - Extracting a Reusable Http Service (3:43)
 - Extracting a Config Module (1:36)
 - Displaying Toast Notifications (2:56)
 - Logging Errors (5:47)
 - Extracting a Logger Service (4:25)
 - Vidly Backend (1:50)
 - Installing MongoDB on Mac (3:58)
 - Installing MongoDB on Windows (5:39)
 - Setting Up the Node Backend (2:44)
 - Disabling Authentication (4:01)
 - Exercise- Connect Movies Page to the Backend (1:56)
 - Adding Http and Log Services (2:38)
 - Replacing FakeGenreService (3:23)
 - Replacing FakeMovieService (5:48)
 - Extracting a Config File (1:54)
 - Exercise- Connect Movie Form to the Backend (0:56)
 - Populating the Form (3:45)
 - Refactoring (2:30)
 - Saving the Movie (2:40)
 - Refactoring (2:36)
 
 - Authentication and Authorization (01:41)
- Introduction (0:49)
 - Registering a New User (2:37)
 - Submitting the Registration Form (4:30)
 - Handling Registration Errors (1:58)
 - Logging in a User (1:43)
 - Submitting the Login Form (2:23)
 - Handling Login Errors (1:51)
 - Storing the JWT (3:04)
 - Logging in the User upon Registration (5:37)
 - JSON Web Tokens (JWT) (3:59)
 - Getting the Current User (4:18)
 - Displaying the Current User on NavBar (4:48)
 - Logging out a User (2:44)
 - Refactoring (10:03)
 - Calling Protected API Endpoints (4:10)
 - Fixing Bi-directional Dependencies (2:43)
 - Authorization (6:30)
 - Showing or Hiding Elements based on the User (2:40)
 - Protecting Routes (2:50)
 - Extracting ProtectedRoute (5:55)
 - Redirecting after Login (5:40)
 - Exercise (0:19)
 - Hiding the Delete Column (4:19)
 
 - Deployment (00:35)
- Introduction (0:38)
 - Environment Variables (4:58)
 - Production Builds (2:48)
 - Getting Started with Heroku (2:06)
 - MongoDB in the Cloud (2:35)
 - Adding Code to a Git Repository (3:05)
 - Deploying to Heroku (3:01)
 - Viewing Logs (2:40)
 - Setting Environment Variables on Heroku (4:37)
 - Preparing the Font-end for Deployment (4:09)
 - Deploying the Front-end (2:38)
 
 - Advanced Topics (01:04)
- Introduction (0:31)
 - Source Code
 - Setting Up the Development Environment (3:13)
 - Higher Order Components (2:04)
 - Implementing a Higher Order Component (8:35)
 - Hooks (3:06)
 - The useState Hook (8:30)
 - The useEffect Hook (5:46)
 - Custom Hooks (3:04)
 - Fetching Data with Hooks (4:37)
 - Context (2:10)
 - Context in Class Components (9:46)
 - Context in Functional Components (3:33)
 - Updating the Context (7:06)
 - Consuming Multiple Contexts (2:24)
 - Thank You!
 - What to Learn Next