LongCut logo

React Tutorial Full Course - Beginner to Pro (React 19, 2025)

By SuperSimpleDev

Summary

Topics Covered

  • React: External Library Simplifies Websites
  • JSX: HTML Inside JavaScript
  • Components: Reusable Website Pieces
  • Props: Make Components Reusable
  • State: Data Updates UI Automatically

Full Transcript

Welcome to the React full course. In

this course, we'll learn how to build complex websites with React. And by the end of this course, we'll build two projects, a chatbot and an e-commerce project.

We'll start from the very basics of React like how to set up React with JavaScript and we'll learn each feature in detail step by step. We'll learn the

major features of React as well as advanced features like how to use React with a backend, deploy React to the internet with AWS,

React with TypeScript, and React with AI.

You can find the sections of this course below the video here and here.

You can also change the speed of the video here.

And you can find subtitles for different languages here.

And after each lesson, I'll give you a bunch of exercises that you can do on your own to practice the skills that we learned. In total, this course has over

learned. In total, this course has over 125 exercises.

So, with that being said, let's get started.

I'm going to be doing this course on Windows, but the steps are the same if you're using a Mac. Before we begin, we're going to need two pieces of

software. Number one is a web browser,

software. Number one is a web browser, and number two is a code editor. The

most popular web browser for web development is Google Chrome and the most popular code editor for web development is VS Code. So I recommend using these. If you need to install

using these. If you need to install these, you can search for them on Google.

Click the link and follow the instructions to download and install.

Now you'll also need to know the basics of JavaScript.

React is built on JavaScript and we're going to be writing a lot of JavaScript when using React. Don't worry, you don't need to be an expert in JavaScript. You

just need to know some basic features like the ones listed here. And I'll also try to review JavaScript features as we go through this course. If you want to

learn JavaScript in more detail, you can check out my JavaScript full course in the video description.

Finally, you'll need to know the basics of HTML.

When using React, we're going to be writing a lot of HTML.

Again, don't worry. You don't need to be an expert in HTML. You just need to know some basic features like the ones listed here. And I'll try my best to review

here. And I'll try my best to review HTML features as we go through this course.

If you want to learn HTML in more detail, you can check out my HTML and CSS full course in the video description.

If you have any issues in this course, you can check the troubleshooting guide in the description.

Now that we have all the requirements that we need, we're ready to learn React.

On our computer, we're going to go to our desktop and we're going to create a new folder. So here I'm going to

new folder. So here I'm going to rightclick and create a new folder.

And this folder is going to contain all the code that we write in this course.

So let's name it react dashc course and press enter.

Next we're going to open this folder in our code editor VS Code. So, we'll open VS Code and then click File,

Open Folder and select the folder we just created.

So, I created my folder on the desktop and it's this folder right here. So,

we'll select this folder and then click select folder and we can close this welcome page.

So, now let's create a new file to learn React. So up here, we're going to create

React. So up here, we're going to create a new file and we're going to name it react-basics.html and press enter.

As a review, a file that ends inh contains HTML code and this creates a website.

Next, we're going to create a website and we're going to set up React on this website. Now, to save time, we're

website. Now, to save time, we're actually going to download some starting code.

So, we're going to open our web browser, Google Chrome.

And at the top, we're going to type super simple.dev/react-basics

super simple.dev/react-basics [Music] and press enter.

So, this page has some starting HTML code we can use to learn React. So now

let's click on this page and we're going to select all this code by pressing control A on Windows or command A on Mac and we're going to copy paste this code

into our file. So we'll right click copy. We can also press control C on

copy. We can also press control C on Windows or command C on Mac and then open our code editor and then

inside this HTML file we're going to rightclick and paste. We can also press control +VV on Windows or commandV on Mac.

And finally let's save this file by pressing control S on Windows or command S on Mac.

Next, we're going to open this file in our web browser to see what the website looks like. To make this easier, we're

looks like. To make this easier, we're going to use a VS Code extension called Live Server. So, the benefit of live

Live Server. So, the benefit of live server is it will automatically refresh the web page whenever we change some code. So, it's going to make our coding

code. So, it's going to make our coding easier.

If you don't have live server installed, you can click the extension section and then search for live server at the top

and then click install.

Once liveer is installed, we're going to go back to our code and we're going to open this file in live server by rightclicking in the file and click open

with live server.

So live server will open the HTML file using our browser and it's going to create a website and we should see the message welcome to super simple dev

react course on this website.

So this message is displayed by React and this means that we successfully set up React on this website.

Now, let's go back to VS Code.

And this is the minimum amount of code that we need to set up React. We're

going to go through this code step by step to make sure that you understand everything here.

First of all, what is React? React is an external library that helps us create websites easier. Now, there are two

websites easier. Now, there are two parts to this statement. Number one,

React is an external library. And number

two, React helps us create websites easier. Let's go through these one by

easier. Let's go through these one by one. So number one, React is an external

one. So number one, React is an external library. First, let's review what an

library. First, let's review what an external library is. So here we have a bunch of HTML code. An HTML code creates

a website. And now, how do we load

a website. And now, how do we load JavaScript onto our website? There are

several ways to load JavaScript on a website. One way is to use an HTML

website. One way is to use an HTML element called a script element.

For example, under this div element, let's create a script element using less than script greater than and less than/cript greater than. But our code

editor might autocomplete this for us.

Now, inside this script element, we can write some JavaScript code. For example,

console.log

the string hello.

As a review, this code displays the text hello in the console. So now let's save and we're going to open the console in

our browser. So we'll open Google Chrome

our browser. So we'll open Google Chrome and Liveer is going to automatically refresh the page and run that JavaScript code. And now we're going to check the

code. And now we're going to check the console by right-clicking and then click inspect and open the console tab.

And you'll see that inside the console we displayed the text hello. And that's

exactly what this code does. So we

successfully loaded this code onto our website.

We'll go back to VS Code. So this is one way to run JavaScript code on a website.

First, we create a script element and then we put our JavaScript code inside.

Another way to run JavaScript is to save our JavaScript code in a file. So on the left, let's create a new file and we'll name it React-basics.js

and press enter.

So when we end a file with js, this file contains JavaScript code. So now let's move that code into this file. So we'll

go to our HTML file. We're going to select this code and then rightclick cut. We can also press controlX on

cut. We can also press controlX on Windows or command X on Mac.

And inside our JavaScript file, we're going to rightclick and paste and save this file.

Now to run the code inside this file, we're going to go back to our HTML and we're going to add an HTML attribute

to this script element. So after this script, we're going to type space and then type src equals double quotes. So

the src attribute lets us load JavaScript from a file.

Inside these double quotes, we're going to tell the computer which JavaScript file to load. So we'll type react-basics.js.

react-basics.js.

So this will look for a file called react-basics.js beside the current HTML file. So it's

going to find the file here, and it's going to run all the code inside this file. So now let's save

file. So now let's save and open our browser and check the result.

Live server will automatically refresh the page. And inside the console you can

the page. And inside the console you can see that we display the message hello.

So we're successfully loading code from inside a file.

We'll go back to VS Code.

And this is a second way to load JavaScript. We save our JavaScript in a

JavaScript. We save our JavaScript in a file and then we load it from the file.

Next, the script element can actually load code from anywhere on the internet, not just on our computer. For example,

we're going to open Google Chrome. And

then we're going to create a new tab.

And at the top we're going to type unpkg.com/sups

unpkg.com/sups simpledev/external dash library.js and press enter.

So on this website we have some JavaScript code. So this is just normal

JavaScript code. So this is just normal JavaScript code. it displays a message.

JavaScript code. it displays a message.

This is an external library inside the console. So using the script element, we

console. So using the script element, we can actually take this code from this website and run it on our own website.

To do that, we're going to open VS Code and inside the src attribute, instead of loading the JavaScript code from a file, we're going to load the JavaScript code

from a website. So, first we need the URL of the website. So, we'll go back to Google Chrome and at the top this is a

URL and we're going to copy and VS Code we're going to remove this

file and we're going to paste the URL.

And now let's save.

So now let's go back to our website and we're going to go to the tab for our website.

And we're going to check the console.

And inside the console, you can see we displayed the message, this is an external library.

So we successfully loaded JavaScript code from another website.

Let's go back to VS Code.

So using the script element, we can load JavaScript code from anywhere on the internet. So this code is called an

internet. So this code is called an external library. An external library is

external library. An external library is just code that is outside of our computer. It's code that someone else

computer. It's code that someone else wrote and we can load that code into our website using the script element.

Now, React is an external library. So,

React is just a bunch of code that is outside our computer that someone else wrote and we can load this code on our website and use it.

So inside our starting file at the bottom here, these two script elements load the React external library. So

loads React.js and React-dom.js.

and React-dom.js.

So let's open these URLs in our browser and take a look. So we're going to select this URL and we're going to copy.

And inside Google Chrome, we're going to create a new tab. And at the top, we're going to paste the URL and press enter.

And on this website, you can see that we have a bunch of JavaScript code. So,

this is the code for React. We're just

taking all of this code and then loading it onto our website.

Let's go back to VS Code. And the same thing applies to this second URL. If we

select it and then copy and in our browser create a new tab and then at the top paste

and press enter.

You can see that this website also has a bunch of JavaScript code and this is also the code for React. So,

as you can see, React is an external library. It's just a bunch of code that

library. It's just a bunch of code that is outside of our computer that someone else wrote. And we can load this code on

else wrote. And we can load this code on our website and use it.

Now, before we move on, there's two things you might be wondering about.

Number one, why are we loading React from Super Simple Dev instead of some official React URL? So, this just lets

me control the version of React. If we

loaded React from the official URL, you might get a different version of React than the one I'm using in this video, which might cause issues. So, for the video, we're going to use a super simple

dev URL to make sure that we have the same version of React and you're able to follow along.

The second thing you might be wondering is why are there two external libraries for React React and React DOM. So React

is designed to be used in different places like websites and also mobile apps. So the creators of React decided

apps. So the creators of React decided to divide it into two external libraries. React which contains all the

libraries. React which contains all the shared features that are used in both websites and mobile apps and React DOM which contain features that are specific

to websites. So if we're using React to

to websites. So if we're using React to create websites, we need to load the React external library and the React DOM

external library. If we were using React

external library. If we were using React to create mobile apps, we would load the React external library and a different library called React Native.

In this course, we're going to use React to create websites. So, we're going to load React and React DOM.

Okay, so we learned that React is an external library. It's just a bunch of

external library. It's just a bunch of code that is outside of our computer and we're going to load it onto our website.

The next part is React helps us create websites easier. So now let's learn how

websites easier. So now let's learn how to use React.

We'll go back to VS Code and we're going to scroll down and these two lines of JavaScript at the bottom sets up React. So let's go through this

step by step. In the first line, we're using document.query query selector to

using document.query query selector to get an HTML element from the website and put it into our JavaScript. As a review, this is a feature of JavaScript called

the DOM or the document object model.

Basically, JavaScript gives us this document object which sort of combines JavaScript and HTML together. It lets us get HTML elements from the page and put

them into our JavaScript and it also lets our JavaScript modify HTML elements on the page. So the DOM or the document

object sort of combines HTML and JavaScript together and it lets the two languages interact with each other.

Don't worry, you don't need to know a lot about the DOM to learn React. I'm

just explaining what this code does so you understand what's going on here.

So the code document.query selector lets us get an HTML element from the page and put it into our JavaScript.

Inside these brackets, we tell the computer which HTML element we want to get from the page. So if we start with a dot, this means we're going to look for

a class. And here we're looking for the

a class. And here we're looking for the class js-container.

Up here, this div element has the class js-container.

So, it's going to take this element and put it into our JavaScript. And finally,

we're going to save it inside a variable so we can use it later.

Next, let's go to the second line of code and react.create

routt basically sets up React To set up React, we have to give it an HTML element. So, we're going to give it

HTML element. So, we're going to give it the element that we saved up here, which is this div element. So, basically the way this works is that this element is

going to act as a container.

Everything that we create with React is going to be displayed inside this element or inside this container. The

reason React uses a container is because it keeps things organized.

Everything inside this element will be controlled by React and React will not affect anything outside of this element.

So it keeps things isolated and organized.

So after we set up React with a container, we can start using the features of React.

One feature of React is render. Render

means to display something. So render

lets us display something inside this container or inside this element. Now

between the brackets of render, we're going to tell React what to display inside the container. So right now we told it to display the text welcome to

super simple dev react course. And if we go back to our website and open the tab for our website and after we open the console, this time

we're going to go to the elements tab.

So this lets us see the HTML that's currently on the page. We're going to open this body element and inside we can see our container and you can see that

React rendered or displayed the message welcome to super simple dev react course inside our container. So we'll go back to our code

and that's how we set up and use React.

First we give it a container and then we can display things like a message inside this container.

Before we continue, let's review the rest of the code in this file to make sure that we understand every line of

code. So, the HTML at the top here

code. So, the HTML at the top here as well as the bottom here.

This HTML is called the HTML structure.

As a review, this is a standard structure that we follow when writing HTML.

At the top, dock type HTML tells a computer to use a modern version of HTML.

The HTML element represents a website.

So all the code for our website should go inside the HTML element. Now every

website is split into two sections. the

head section and the body section. The

head section generally contains things that are not visible on the page. For

example, the title element sets the text at the top of the tab. So, this is not visible on the page. So, we put this inside the head.

The body section generally contains things that are visible on the page. For

example, the div element will be visible on the page. So we put it inside the body.

Finally, we usually put our script elements at the bottom of the body because we want our HTML to be created first and then our JavaScript can modify

the HTML.

So that's a review of the HTML structure. This is a standard structure

structure. This is a standard structure that we follow when writing HTML.

So now we understand almost every line of code in this file. This is just the HTML structure that we have to follow.

This is a container that we give to React to keep things isolated and organized.

This is an example of an external library and this loads the React external library or loads the code for React.

And this sets up and uses React.

The last two lines that we haven't learned yet are these two lines right here. So here we're loading another

here. So here we're loading another external library. And this external

external library. And this external library is called Babel.

So again if I open this URL in my browser copy and in my browser going to create a new

tab and at the top paste and press enter.

You'll see that this website contains a bunch of JavaScript code and this is the code for another external library called Babel.

So we'll go back to VS Code and let's learn what is the Babel external library.

Babel is known as a JavaScript compiler.

So it basically translates other languages into JavaScript.

So why do we need Babel? When using

React, we actually don't use normal JavaScript. We use an enhanced version

JavaScript. We use an enhanced version of JavaScript called JSX.

JSX stands for JavaScript XML. It's the

same as JavaScript, but we can also write HTML directly in our JavaScript code. So, it's just JavaScript with

code. So, it's just JavaScript with extra features. So, let's do an example

extra features. So, let's do an example of JSX to learn how to use it. Inside

the script element at the bottom, we're going to create a new variable using const and let's call it button

equals. And now let's create a button

equals. And now let's create a button HTML element. So here we're going to

HTML element. So here we're going to type HTML directly less than button greater than and then less than /button

greater than.

So this is actually HTML code and we're writing it directly inside our JavaScript. So this HTML code creates a

JavaScript. So this HTML code creates a button and then inside our button we can put the text hello.

So this code here is actually using JSX.

So JSX works the same way as JavaScript except we can also write HTML directly in our JavaScript code.

So, what does this code do? It's

actually pretty straightforward. This

code creates a new button element inside our JavaScript and then we save it in a variable.

We can actually do this with normal JavaScript as well. We can use the DOM and we can create a button element in our JavaScript like this. So you can

think of this JSX code as a shortcut for this JavaScript code.

So that's JSX. JSX is an enhanced version of JavaScript. So it's the same as JavaScript, but we can also write

HTML directly in our JavaScript code. So

when using React, we usually use JSX instead of normal JavaScript because, as you can see, JSX is simpler.

Now there is one problem with JSX which is our web browser doesn't understand JSX. It only understands normal

JSX. It only understands normal JavaScript.

In order to use JSX we need to translate it into normal JavaScript first and then our web browser can understand this code.

To do that we use the Babel external library. Babel translates JSX into

library. Babel translates JSX into normal JavaScript so our web browser can understand it. To use Babel, we need to

understand it. To use Babel, we need to do two steps. First, we load the Babel external library, which is what we do

here. And then when we want to translate

here. And then when we want to translate something into JavaScript, we have to give the script element an attribute type equals text/babel.

So this attribute tells Babel to translate all the code inside here into normal JavaScript.

So that's what these two lines of code do. First, we load the Babel external

do. First, we load the Babel external library and then we tell Babel to translate the code from JSX into normal JavaScript so our web browser can

understand it. So now we understand all

understand it. So now we understand all of the code in our starting file. And

again, this is the minimum amount of code that we need to set up React.

Next, let's learn some more features of React. So, we'll scroll back down. And

React. So, we'll scroll back down. And

currently, we're using React to display some text inside this container. Now, in

addition to text, we can also display HTML elements inside this container. So

to do that, we're going to remove this string and instead we're going to give render an HTML element.

So up here, we actually created an HTML element or a button. So we're going to give this to the render function. So

here we're going to give it the button.

And now it's going to display this button inside our container or inside this div here. Let's save and we'll open the browser

and open the tab for our website. And

you'll see it displayed the button with the text hello on the website.

And if we check the elements tab, you can see that React displayed the button inside our container.

We'll go back to our code.

So that's what this code does. It

displays an element inside this container.

Now let's do another example. Let's

display a different HTML element inside this container. So below this button,

this container. So below this button, let's use JSX to create a paragraph element. So first we'll create a new

element. So first we'll create a new variable using const and we'll name the variable paragraph

equals and we'll create a paragraph element using the code less than p greater than less than /p greater than.

So this html code creates a paragraph or a paragraph of text. Inside our

paragraph, let's just put paragraph of text.

And now let's display this paragraph on our website. So inside render, instead

our website. So inside render, instead of the button, we're going to render the paragraph and save.

If we open our website, you can see it displayed a paragraph of text. If we go into the elements tab and

text. If we go into the elements tab and we open this div container, we can see that React displayed this paragraph element inside this container.

So let's go back to our code. And that's

basically how we use React. We give

React a container and then we can display an HTML element inside this container.

Next, we're currently using React to display one element at a time on our website, which is not that useful. So

now we're going to learn how to use React to display multiple elements on our website. So one thing we can't do is

our website. So one thing we can't do is give render multiple elements. So this

is not supported. We also can't save multiple elements inside a variable.

This is also not supported. Instead, we

need to use another HTML element called a div element. So, under our paragraph, let's create a new variable using const

and let's name it div and make it equal.

And we'll create an HTML div element using the code less than div greater than less than /d greater than.

So this is the HTML code to create a div element. As a review, the div element

element. As a review, the div element represents a container. The purpose of a div element is to contain other elements

like buttons and paragraphs. So that's

actually why we used a div element up here. This element is a container. It's

here. This element is a container. It's

going to contain everything that we create using React. So let's go back down.

Inside our div element, we can put other HTML elements like a button. So, let's

actually select this code and we'll copy and then inside this div, paste.

And let's also put a paragraph element inside our div. So we'll select this code for the paragraph element and we'll copy

and our div paste.

So this code works because a div is considered as one element. So we're just taking one element and saving it in one variable which is supported in

JavaScript. The only thing special about

JavaScript. The only thing special about this is that this one element can contain other elements inside.

Next, we're going to give this div to the render function here. So, instead of the paragraph, we're going to give

render our div and save.

And if we check our website, you can see that React displayed multiple elements on the website, a button and a paragraph. If we look at

the elements tab and open this div container, you can see that React displayed our div inside this container.

Let's go back to our code. And that's

how we display multiple elements on a website using React.

First, we group the elements inside a div element. And then we render the div

div element. And then we render the div element.

Before we continue, we're going to do some code cleanup. When we have multiple lines of HTML like this, a best practice is to add brackets around it. So, at the

front, we're going to add an open bracket and at the end, a closed bracket.

And we're going to put the HTML on its own line. So, here we have JavaScript

own line. So, here we have JavaScript and HTML together. We're going to add a new line here by pressing enter. and

we're going to put the HTML on its own line. Same thing here. Click here and

line. Same thing here. Click here and press enter to put the HTML on its own line.

Next, we have two elements that are inside a div. So, we're also going to give this line an indent by pressing tab. And then, we're going to give this

tab. And then, we're going to give this line an indent by pressing tab. So that

it's easy to see that these two elements are inside this div element.

So this is how we should format our code when we have multiple lines of HTML.

Another way to think about this is inside here, you're actually just writing HTML normally.

So don't worry, the more that you use React, the more you'll get used to this format.

So let's save this file.

Now that we learn the basics of React, let's talk about how React helps us create websites easier.

If we look at this code, creating a website with React feels natural. It's a

lot simpler than using the DOM feature in JavaScript. We can just create the

in JavaScript. We can just create the HTML elements we want directly and then give it to React and React will display it on the website.

Another benefit is JSX lets us find errors easier.

For example, if I misspell button, it will actually tell me that these two don't match because this is an actual element rather than just text or a

string. So, it makes it easier to find

string. So, it makes it easier to find errors when we're coding. So, I'll add the O back.

Another benefit is we can insert values inside our JSX elements. For example,

inside this paragraph, we're going to type space and we're going to insert a value here by typing open curly bracket close curly bracket. And inside here, we

can give it any JavaScript code. For

example, 2 + 2. So this will calculate 2 + 2 and then insert it into this element. If we save

element. If we save and then check our website, we can see that it calculated 2 + 2 which is four and inserted it into this

paragraph element. So we'll go back to

paragraph element. So we'll go back to our code and that's another benefit of using React. We can insert JavaScript

using React. We can insert JavaScript code directly into our JSX elements. So

this is similar to string interpolation where we can insert values into a string except here we're inserting values into

actual HTML elements. So those are three ways that React helps us create websites easier. Number one, it's more natural.

easier. Number one, it's more natural.

We can create the elements that we want and then just give it to React and it will put it on the website. Number two,

it helps us find errors easier because these are actual elements. And number

three, we can insert our JavaScript code into our elements. So this helps us use JavaScript and HTML together more easily.

Now, React has many other features that helps us create websites easier, but we're going to learn those features later on as we go through the course.

The last thing we're going to do is we're going to scroll up and we're just going to remove this example external library and save

so that we just have the code that we need for React.

And that's the end of this lesson. In

this lesson, we learned that React is an external library that helps us create websites easier. We learned how to load

websites easier. We learned how to load the React external library. We learned

how to set up React and use render. We

reviewed the basics of HTML and JavaScript.

We learned JSX, an enhanced version of JavaScript.

We created elements directly with JSX.

And we learned how to insert values into our JSX elements. Here are some exercises to help you practice what we learned in this lesson. You can find the

solutions to these exercises in the video description.

In this lesson, we're going to learn two of the most important features of React, which are components and props. To learn

this, I actually prepared a project that we can do for this lesson. We're going

to go to our browser and we can delete these extra tabs for now.

And we're going to create a new tab.

And at the top, we're going to go to super simple.dev/projects/

super simple.dev/projects/ chatbot and press enter.

This is a chatbot project. We can send a message to a robot up here and the robot will respond to our message. For

example, we can click in here and type hello chatbot and then press send.

And the robot will respond with hello, how can I help you? Now, if we scroll to the bottom of this page, we can also move the text box to the bottom by

clicking this link.

So, a lot of chatbot applications use this design where the text box is at the bottom. However, because we're watching

bottom. However, because we're watching a video, this text box might get cut off or it might be covered by the video progress bar. So, just for this video,

progress bar. So, just for this video, we're going to click this again and we're going to start with a text box at the top.

Next, this is a simple chatbot and currently it can only do three things.

get today's date, flip a coin, and roll a dice. For example, up here, we can

a dice. For example, up here, we can type, "Can you get me today's date?"

and press send.

And it will respond with today's date.

And let's try typing, "How about flip a coin?" and press send.

coin?" and press send.

and it will respond with heads or tails.

Finally, let's type okay, thank you and press send.

And it responds with no problem.

So, this is a chatbot project we're going to work on for the next few lessons. Now, this is a simple chatbot

lessons. Now, this is a simple chatbot and it can only do these three things.

But in the future, we can also switch this to a more powerful AI that can respond to any message we send.

But for now, we'll just use this simple chatbot to learn React. Now, let's use React to build this chatbot project.

We'll go back to VS Code and let's make a copy of React Basics.

So, first we'll select this file and then rightclick, copy.

And inside here, we're going to rightclick and paste.

And let's rename this file. So, we'll

rightclick and rename and rename it to chatbot.html and press enter.

And let's close the React Basics files for now.

So, we're going to start with the same code as the React Basics file, except we're just going to change the title up here. So, we'll remove React Basics and

here. So, we'll remove React Basics and just change it to chatbot and save.

And now, let's open this file in our browser. We'll rightclick,

browser. We'll rightclick, open with a live server.

And it should say chatbot in the tab up here. So now we can close the React

here. So now we can close the React basics tabs which are these two here.

And we'll go back to VS Code.

And now we're ready to begin the chatbot project.

First we're going to learn one of the most important features of React called components. A component is just a piece

components. A component is just a piece of the website.

For example, let's go back to our browser and open the final chatbot project.

So looking at this project, we can split it up into different pieces. One piece

can be the text box and the button at the top and another piece are each of these chat messages.

So these are called components. A

component is just a piece of the website. Now, when building websites,

website. Now, when building websites, it's better to split up the website into pieces or components so that we can work on a small piece of the website at a

time.

Now that we know what components are, let's create our first component in React. So, we mentioned that one way we

React. So, we mentioned that one way we can split up this website is to have one component at the top for this text box and the button. So, let's create a

component for this in React. We'll go

back to our code and we'll scroll down and first let's remove the example button and paragraph that we used. So, we'll select this and

remove it.

And to create a component in React, we're going to use a function. So we'll

type function. And now we're going to name this component. Since this piece of the website is for inputting a message and sending it to the chatbot, let's

name this component capital C chat capital I input brackets and curly brackets.

Now in React the component name must start with a capital letter. So make

sure that chat input starts with a capital C. This is also known as Pascal

capital C. This is also known as Pascal case where each word in the name starts with a capital letter.

Next this function will return some HTML. So we're going to type return and

HTML. So we're going to type return and we're going to return the HTML for this piece of the website. So this piece of the website has a text box and a button.

So let's type brackets and press enter between these brackets.

And to create a text box, we're going to use the HTML element less than input greater than. And we also need to type

greater than. And we also need to type less than /input greater than. Now you

may notice that in normal HTML input doesn't need this closing tag. However,

JSX is more strict than normal HTML. So,

all elements need a closing tag, including input. Now, there's actually a

including input. Now, there's actually a shortcut we can use here. If there's

nothing inside an element, we can actually remove the closing tag.

And at the end of this opening tag, we can just type space and then slash. So,

this code is a shortcut for this code.

And this is called a self-closing element. So in JSX we have to either

element. So in JSX we have to either have a closing tag or use this self-closing element shortcut.

Next, this piece of the website also has a button. So let's also create a button

a button. So let's also create a button element using less than button greater than less than /button greater than. And

inside this button we have the text send.

And now we're going to get an error here because we're trying to return two values or two elements from this function. But we can only return one

function. But we can only return one value from a function. To solve this problem, we can use a div element like down here to group these two elements together.

So above this, let's create a div element.

And at the bottom, less than /d greater than. And let's also add indents before

than. And let's also add indents before these two lines. So we'll click here and press tab. And also click here and press

press tab. And also click here and press tab.

So this shows that these two elements are inside this div element. And now

this code no longer has an error because we're returning one value from this function.

Now that we created this component, let's learn how to display it on the website. If we scroll down, right now

website. If we scroll down, right now we're using React to display this div on the website. So all we have to do is to

the website. So all we have to do is to insert our component inside this div and it will be displayed on the website. So

one way to do this is to use curly brackets to insert something like we did before. So here we'll type curly

before. So here we'll type curly brackets. And now we're just going to

brackets. And now we're just going to run this function capital C chat input and brackets.

So this will run the function and it will return this HTML from the function and then the curly brackets will insert the HTML into the div and then display

it on the page.

So, as you can see, we can put any JavaScript code between these curly brackets. As long as this code results

brackets. As long as this code results in a value, we can insert it into this HTML.

Let's remove the button and the paragraph that we used as an example and save.

And let's check our website. We'll open

the browser and go to our chatbot project. And now we created the elements

project. And now we created the elements for the top section of the chatbot project, the text box and the send button. So don't worry about how it

button. So don't worry about how it looks for now. Later in the course, we're going to style this with CSS and make it look like the final project.

Let's go back to our code.

And next, React has a special syntax we can use to insert a component. Instead

of using curly brackets and running the function, we can type this code less than and then the name of the component

capital C chat input greater than and then less than slash chat input greater than.

So this is called the component syntax.

This does the same thing as the code above. It runs the chat input function

above. It runs the chat input function and then inserts the result into the HTML.

If we save and we check our project, you'll notice that that syntax does the same thing and it creates another text box and button.

Let's go back to our code.

And again, this code does the same thing as this code. Now this syntax has a big advantage.

This actually looks like an HTML element. It has an opening tag and a

element. It has an opening tag and a closing tag. So you can think of this

closing tag. So you can think of this like we're creating our own HTML element called chat input.

HTML provides us with some default elements like div, input and button. And

now using React, we can actually create our own HTML element like chat input.

Then we can use our own HTML elements to build the website instead of just the default HTML elements. And this is

actually one of the main ideas of React.

We can create our own HTML elements. So

when using React, we should use this component syntax instead of running the component function directly because this syntax lets us create our own HTML

element.

And again, we can use the self-closing element shortcut like we did up here. If

there is nothing inside this element, we can remove this closing tag.

And inside the opening tag at the end, we can type space and slash.

And now we can remove this example code above.

And let's save and check our project.

And that creates the top section of the chatbot project.

So go back to VS Code.

And we mentioned in the previous lesson that React helps us create websites easier. And this is another way that

easier. And this is another way that React helps us create websites easier.

It lets us split our website into smaller pieces or components. And this

lets us work on a small piece of the website at a time.

Before we create the rest of the project, we're going to improve our code a little bit. First, notice that in this component, we're using a div to group

these two elements together. However,

this is also going to insert an extra div element into our website. So, if we go to our website

and rightclick and click inspect, and we're going to go to the elements tab, and we're going to go to our container here, and we're going to expand it.

So notice here that we have a bunch of extra divs on this website. So what if we don't want to insert these extra divs? What if we just want to insert the

divs? What if we just want to insert the text box and the button on our website?

Let's go back to our code and learn how to do that.

React has another way to group elements together called a fragment. To use a fragment, we can remove the word div.

and div from the closing tag and just have a less than greater than and a less than slashgreater than. So this is called a fragment and it groups the two

elements together. So we can return it

elements together. So we can return it from the function but it won't insert an extra div. So, if we save this code and

extra div. So, if we save this code and then go to our website and take a look at the HTML, you'll notice now we have one less extra

div on the website.

Let's go back and we can also use a fragment down here. If we don't want to insert this

here. If we don't want to insert this extra div, we can remove it and remove it at the bottom and just use a

fragment. If we save and check the

fragment. If we save and check the website, now we no longer have those extra divs. We have our container and we just

inserted the text box and the button.

So that's fragments. It allows us to group elements together without creating an extra div.

Let's go back to our code.

And since this variable no longer contains a div, let's rename it. So

right now we're building a chatbot application or an app. So let's rename this variable to app instead. And here

as well, we're going to render the app and save.

So again in React, when returning multiple elements or saving multiple elements, we can use a fragment to group them together. And this makes our HTML a

them together. And this makes our HTML a little bit cleaner because it doesn't create an extra div element.

Next, another improvement we can make is to add a placeholder to the text box at the top. So the gray text inside the

the top. So the gray text inside the text box is called a placeholder. It

tells us what to type inside the text box. And when we start typing, it will

box. And when we start typing, it will disappear.

To create a placeholder, we give this input element an attribute. So at the end, we're going to type the attribute placeholder

equals double quotes.

And then inside these double quotes, we're going to put the text that we want, which is send a message to

chatbot.

If we save this code and look at our website, now we have a placeholder in the text box. And when we start typing in it, it

box. And when we start typing in it, it will disappear. So the placeholder is

will disappear. So the placeholder is working. Now there is one problem here,

working. Now there is one problem here, which is if we remove this text, you'll notice that this placeholder is too long and it's getting cut off. To fix this,

let's make this text box wider. We'll go

back to our code.

And to make this input wider, we're going to give it another attribute. So

at the end, we'll type another attribute called size equals double quotes. And

this sets how many characters can fit in this input. By the way, a character is

this input. By the way, a character is just a letter, number, or symbol.

Let's set the size to 30 characters and save and take a look.

Okay, so that looks pretty good for now.

Again, don't worry about how this looks.

We'll style it later in the course using CSS.

So, we just created our first component or our first piece of the website, which is the section at the top. Now, let's

get some practice and create more components.

Let's go back to the final chatbot project and let's ask ourselves how can we split up the rest of this website into pieces.

Another piece of this website could be one chat message here. So let's create a component for this piece of the website.

We'll go back to VS Code and to create a component we're going to use a function. So down here, let's

create a function and let's name it capital C chat capital M message

brackets and curly brackets. So remember

a component name must start with a capital letter and we use Pascal case.

So each word starts with a capital letter.

Now inside this function, we're going to return the HTML for this piece of the website or this component.

So let's also type brackets and enter.

So we can write the HTML on multiple lines. And now each chat message has two

lines. And now each chat message has two things, some text and a profile image.

Since we have multiple things inside this component, let's group them together using a fragment. So we can return one value from this function. So

we'll type less than greater than enter and then less than /g greater than to create a fragment. And now inside here

each message has some text. So let's

create the first chat message in our project. We'll go back to the final

project. We'll go back to the final project.

And let's just copy paste the text from the first message here which is hello chatbot. So we'll select this and then

chatbot. So we'll select this and then copy by pressing control C on Windows or command C on Mac.

And then inside our code in the chat message component we're going to paste by pressing controlV on Windows or commandV on Mac.

And let's fix the indent by pressing tab at the start.

Next, each chat message has a profile image. To create an image, we can use an

image. To create an image, we can use an HTML element called img. So, let's

create a new line. And we're going to type less than img greater than and then less than / img greater than. So,

remember that in JSX, every element has to have a closing tag. And again, we can use the self-closing element shortcut like we did down here. If there's

nothing inside this element, we can remove the closing tag and then just add a space and a slash at the end of the opening tag. And now we have the two

opening tag. And now we have the two things that we need for each chat message, the text and an image.

Next, we need to tell the computer which image to load. Right now, if we look at our final chatbot project, we have two images that we use, but we currently

don't have these in our project. So,

let's download them. We're going to rightclick this first image and then click save image.

And we're going to find the folder that contains all of our code. So, for me, it's on the desktop and it's in the folder React-Course.

and we're going to save it inside of this folder.

And same things for this robot image.

We're going to rightclick and click save image.

Go to the React-Course folder. And we're

also going to save the robot image.

And now if we look at our code, we should have two images inside our project. User.png png and robot.png.

project. User.png png and robot.png.

And now let's go back to our code.

To load an image on the website, we need to tell the computer which image to load. To do that, we're going to give

load. To do that, we're going to give this image element an attribute called src or source equals double quotes. And

inside these double quotes, we're going to tell the computer which image to load for the first chat message. The image is

the user image. So let's type this file name. userpng.

name. userpng.

So this will look for a file called user.png beside the current HTML file. This is a current HTML file. So we'll look for

user.png beside it, which is right here.

and then it's going to load this image on the website.

Okay, so we created a component for a chat message. Now let's insert this

chat message. Now let's insert this component on the website. We're going to scroll down to the app and let's insert this

component using the component syntax like we did up here. So we'll type a new line and type less than and then the name of the component which is capital C

chat capital M message.

And currently we don't have anything to put inside this component. So we use the self-closing element shortcut like we did up here. So now let's save

and check our website which is this tab. And let's close the console so we can see it. And we created a chat message.

However, we have a few problems here.

The first problem is that the profile image is too big. To make it smaller, we're going to go back to our code and inside the img element, we're going

to give it another attribute called width equals double quotes.

And let's try setting the width to 50 and save. And then check our website.

and save. And then check our website.

And that looks close enough.

Another problem is the chat message is appearing on the same line as the chat input, but in the final project, we want it to appear below. To fix this, we'll

go back to our code and inside the chat message component, instead of using a fragment to group these elements together, we're going to

change it back to a div. So, inside

we'll type div and inside here /d.

The reason we're using a div is because in HTML, a div is known as a block element. A block element will always

element. A block element will always take up an entire line by itself. So if

we group this in a div element, instead of appearing beside the chat input, the div is going to take up an entire line by itself. So it's going to take up the

by itself. So it's going to take up the entire line under the chat input. So

let's save this code and then check our website.

So now this div is taking up this entire line. If we rightclick and click inspect

line. If we rightclick and click inspect and then click this arrow icon in the top left and then click on this div,

you can see that this div now takes up this entire line. So now we have the layout that we want. So in React, we

still use divs for layout purposes.

If you want to learn divs, layout, and HTML in more detail, you can check out my HTML and CSS full course in the video description.

So now we created our first chat message.

Next, let's create the second chat message. We'll go back to our code

message. We'll go back to our code and instead of creating a whole new component, we can actually reuse our chat message component. Components are

actually designed to be reusable.

To reuse this component, we don't want the message to be hello chatbot every time. We want to be able to display

time. We want to be able to display different messages in this component. To

do that, we can give our component an attribute. So down here, we're going to

attribute. So down here, we're going to go to the chat message component and we're going to give it an attribute. So

this works just like HTML attributes.

We're going to give our attribute a name. Let's call it message

name. Let's call it message equals double quotes. And inside these double quotes, we're going to give the attribute a value.

Let's put the text for the first message which is hello chatbot. So let's select this code and then copy

and we're going to paste it inside here.

So now we have an attribute called message with a value hello chatbot. So

again you can see that this syntax looks like HTML. We can even add our own

like HTML. We can even add our own attributes.

Now that we added this message attribute, how do we access it inside this component and use it? To do that, we're going to use a feature called props.

Every component function gets one parameter up here called props.

This props parameter is an object and it contains all the attributes that we give to this component. So up here, let's

actually console.log

actually console.log props to see what it looks like. Let's

save and then open our website and check the console.

And you'll see that props is an object and it contains the attributes that we gave to our component. So here we have the message attribute and it has a value

hello chatbot. So the attribute name is

hello chatbot. So the attribute name is saved as a property and the attributes value is saved as a value of this object.

So let's go back to VS code and using this props object we can access our attributes. By the way props

is short for properties. We call this props because the attributes are saved as properties in this object.

So now to access the message attribute we can remove this and type props dot and the attribute name which is

message and let's save this in a variable so we can use it later. So at the front we'll create a variable using const name name it message

equals props dossage and we'll add a new line to separate the code a little bit.

Now instead of displaying hello chatbot every time let's display whatever is in the message attribute. So we'll remove this

and let's insert this variable into this element. To do that we can use curly

element. To do that we can use curly brackets and type the variable name message.

So again we can put any JavaScript code between these curly brackets and as long as it results in a value it will insert

it into this element. So now let's save and we'll check the website and it displays a message hello chatbot.

That's the message attribute that we gave it.

Let's go back to our code.

So that's props. Just like a normal HTML element, we can give attributes to our component and then access these attributes using this props object.

So props are really useful because props make our component reusable.

For example, let's try creating the second chat message. To do that, we can just create another chat message

component. So down here, let's type less

component. So down here, let's type less than chat message/grater than.

And we just need to give it a different message attribute. So here we'll give it

message attribute. So here we'll give it an attribute message equals double quotes. And we'll copy paste the second

quotes. And we'll copy paste the second message in the chatbot project. We'll go

to our browser and go to the chatbot project and let's copy and paste this second message.

We'll select it and then copy.

And inside our code in the message attribute, we're going to paste.

So this will save the message hello how can I help you inside props and then we get it out of props and insert it into

the component. Let's save and check the

the component. Let's save and check the website and go to our tab.

And now we created the second chat message. So let's go back to our code.

message. So let's go back to our code.

And you can see that props make our component reusable. We can reuse this

component reusable. We can reuse this component, but just give it a different attribute or prop and it will display a different message.

Let's get some practice and use props to create two more chat messages. Feel free

to pause if you want to try it yourself first.

So down here, let's create our third message using less than chat message/grater than. and we'll give it a message

than. and we'll give it a message attribute equals double quotes and we'll copy paste the third message. We'll go

to the chatbot project and select this third message and then copy.

And in our code inside the attribute, we're going to paste.

And finally, let's create the fourth message less than chat message slashgreater than and then the message

attribute equals double quotes and we'll copy paste the fourth message which is this one. So don't worry if your

this one. So don't worry if your messages are different from mine. We're

just doing an example. So we'll select this and copy.

And inside here, we're going to paste and save.

And now, if we check our website and go to our tab, you'll see that we now have four chat messages in our

project. So, that's how we use props to

project. So, that's how we use props to reuse the chat message component.

Next, in the final chatbot project, notice that these two messages are different. These two messages are from

different. These two messages are from the chatbot. So there are two

the chatbot. So there are two differences here. The profile image is a

differences here. The profile image is a robot and the image is on the left. To

create this, we can add another prop to chat message. Let's go back to VS Code

chat message. Let's go back to VS Code and for each chat message, we're going to add another attribute.

And let's call this attribute the sender equals double quotes.

This attribute tells us who sent the message. And we can use this to

message. And we can use this to determine which image to load and where to place the image. So if we send the

message, let's make the sender the user.

And for the second chat message, we're going to add another sender attribute equals double quotes. And the second message is from the chatbot. So let's

make the sender attribute the robot.

And we'll do the same thing for the third and fourth message. We'll give it a sender attribute.

The third message is from the user. So

let's make the sender user.

And the fourth message sender equals double quotes. This message is from the

double quotes. This message is from the robot. So let's make the sender robot.

robot. So let's make the sender robot.

Next, let's access the sender attribute inside our component. To do that, all the attributes are saved inside this

props object. To access the sender

props object. To access the sender attribute, we can type props dot sender.

So this gives us the value of the sender attribute which is either user or robot.

So let's save this in a variable so we can use it later. Type const and let's call it sender equals props.

So now that we have the sender attribute, let's use it to decide which profile image to load and where to place this image. To do that, we can just use

this image. To do that, we can just use an if statement.

So inside here, we can type if brackets and curly brackets.

And inside these brackets, we're going to check if the sender is equal to the string robot.

By the way, by default, if the attribute just has double quotes like this, the value is a string. So here the value is going to be the string user or the string robot.

So now inside our component, if the sender is the robot, we're going to return some different HTML.

So let's type return brackets. So we can write this HTML on multiple lines. And

let's just copy paste the HTML from down here and modify it. So we'll select this HTML and then copy

and then inside this return we're going to paste.

And let's also select these lines and press tab to fix the indenting.

So the first thing we need to change if the sender is a robot is that we want to load the robot image instead.

So, we already downloaded the robot image here. To load it, we're just going

image here. To load it, we're just going to change the src attribute or the source attribute of this image. So,

we're going to change this from user to robot.png.

robot.png.

And we also want this image to be on the left. So, let's just move this image

left. So, let's just move this image before the message. So we'll select this code and then cut by pressing control X

on Windows or command X on Mac.

And then before the message we're going to paste by pressing controlV on Windows or commandV on Mac.

And we can remove this extra new line.

So as you can see inside a component we can use any JavaScript feature like if statement and we can return a different

HTML and whatever we return will be inserted inside the element here. So now

let's save this code and then check our website and then open our tab and you can see that now we have two

messages from the chatbot. that loads

the robot image and it puts the image on the left.

We'll go back to our code and using this sender prop, we're able to reuse this component to create a chat

message from the robot. So again, props make our component reusable.

And that's it. If we scroll down, using components, we split up the website or the app into smaller pieces like the chat input section at the top

and each chat message. And we created all the HTML that we need for this project.

The last thing we're going to learn in this lesson are some shortcuts that are commonly used in React, and we can use these to clean up our code.

First, let's scroll up to the chat message component.

So, instead of doing con message equals props message, we actually have a shortcut for this in JavaScript. So,

down here we can just type const curly brackets and inside we can type message

and make it equal to props.

So this takes the message property out of this object and saves it in a variable called message. So this does

the same thing as this line above. This

code is a shortcut for this code. And

this shortcut is called dstructuring because we're taking stuff out of this object. We're deconstructing it. We can

object. We're deconstructing it. We can

also use this shortcut with the sender property to add another property to take out of this object. After the first

property, we can type comma and the second property sender.

So this will get the message property and the sender property out of this object and it will save it in a message variable and a sender variable. So this

line of code is a shortcut for these two lines above.

So now let's actually turn these two lines into comments or comment out these lines. At the front we're going to type

lines. At the front we're going to type double slash and at the front here we'll type double slash.

By the way, if we start with double slash, it will turn this code into comments and it will be ignored by the computer.

So, we'll just keep this here as a reminder that this is a shortcut for these two.

Next, JavaScript has an even shorter shortcut for this. Since props is a parameter up here, we can just

dstructure it directly up here. So here

instead of the props object we can just type curly brackets directly and then type message

and sender.

This takes the message and sender properties directly out of the first parameter and then saves them in a variable called message and a variable called sender. So it does the same thing

called sender. So it does the same thing as this code down here, but it's an even shorter shortcut. We're dstructuring the

shorter shortcut. We're dstructuring the parameter directly at the top. So this

shortcut is used a lot in React tutorials and documentation. So it's

useful to know how this works.

So let's comment out this line here at the front. We'll type double slash.

the front. We'll type double slash.

So we remember that this code is a shortcut for this line of code and these two lines of code.

Now, let's save and check our website to make sure that everything is still working. So, that looks good.

working. So, that looks good.

We'll go back. And that is a dstructuring shortcut. It allows us to

dstructuring shortcut. It allows us to take properties directly out of an object.

Next, we're going to learn how to use if statements directly inside JSX.

So currently we have some JSX here and we put an if statement outside of this JSX.

However, this means we're duplicating some code like the div and the message.

To make this code more reusable, we can actually move this if statement directly inside the JSX down here. So what we

want to do is if the sender is a robot, we want to put the image before the message. So down here, let's go before

message. So down here, let's go before the message and press enter. And we're

going to type curly brackets and we're going to insert the if statement directly inside here. So here before the

message we want to do something like if the sender is equal to the string robot

we're going to insert this image.

However we can't actually use the word if inside of these curly brackets.

Instead we need to use another feature of JavaScript called a guard operator or and.

In JavaScript, you can write value one and value two. If value one is true, then the result will be value two. So

this works just like an if statement except we can write it on one line and it results in a value. So if you want to learn more about this feature, I cover it in the booleans lesson of my

JavaScript course and you can check out that in the video description.

For now, the only thing we need to know is we can use and as sort of an if statement in our JSX.

So, first let's remove this and then we're going to use and to insert this if statement directly inside the JSX.

So, the first value is going to be our if condition, which is sender equals the robot. So we'll check if the sender is

robot. So we'll check if the sender is equal to the string robot and then we're going to use and.

So if this is true, the result is going to be the second value here. So here if the sender is a robot, we want to insert

the robot image. So let's just copy and paste this code. We're going to select this and then copy it.

And then down here after and we're going to paste.

So again the way this works is if the value on the left is true then the result will be the value on the right.

So this and is sort of a shortcut for this if statement and it lets us insert if statements directly inside our JSX.

So let's actually comment out this if statement out here. So we remember that this code is a shortcut for this code.

So here before the if statement we'll type slash and star and after the if statement we'll type star and slash and

remove the indent. So this is known as a multi-line comment. All the code between

multi-line comment. All the code between these two stars will be ignored by the computer. So now let's save

computer. So now let's save and check our website.

And as you can see, if the sender is a robot, we're going to add an image on the left before the message. So now, one problem here is that we're also showing

the user's profile image at the back, but we only want to show one profile image. We'll go back to our code

image. We'll go back to our code and here we only want to show the user profile image if the sender is the user.

So let's insert another if statement down here. Feel free to pause this video

down here. Feel free to pause this video if you want to try it yourself first.

So at the front we'll type open curly bracket. At the end a close curly

bracket. At the end a close curly bracket.

And at the front we're going to type the if condition. So we'll check if the

if condition. So we'll check if the sender is equal to the string user and

then we'll type ant. So if this is true then we will show this image. If this is not true, we will not show this image.

So this code is a shortcut for this code.

Let's save and check our website.

And it works. The robot image is on the left and the user image is on the right.

So let's go back.

Using the guard operator or and we can insert an if statement directly inside our JSX.

Next, we're going to do some code cleanup. So, let's scroll up and we're

cleanup. So, let's scroll up and we're going to go to the chat input component first. So, you notice that in here, this

first. So, you notice that in here, this line is a little bit too long. To make

our code easier to read, we can actually put each attribute on its own line. So,

here we'll type enter to put placeholder on its own line. And here we'll type enter to put size on its own line. And

let's also type enter at the back. So

the attributes are on their own lines.

And then let's add an indent in front of these attributes by pressing tab and pressing tab. This makes it clear that

pressing tab. This makes it clear that these attributes are part of this element. And we also want to make sure

element. And we also want to make sure that these two are vertically aligned.

This makes it easy to see where this element starts and where it ends.

Next, let's scroll down to the chat message component. And notice that these

message component. And notice that these two lines of code with the and are also a bit too long. To improve this, we can

surround this value with brackets. So

we'll type open bracket and at the end close bracket and then we can put this code on its own line. So here we'll type

enter and at the end we'll type enter.

So this will still have the same value, but the brackets allow us to put the code on multiple lines. We'll do the same thing for the second image.

We'll surround it in brackets, open bracket, and close bracket. And we'll

put this value on a separate line so that it's no longer too long.

Next, let's scroll down even more to the app variable. And you'll notice that

app variable. And you'll notice that these lines are also a bit too long because of the attributes. Again, we can put each attribute on its own line. So

here we'll put message on its own line and sender on its own line. And we'll

put the end of the component on its own line so that this is vertically aligned with this. And let's also add indents

with this. And let's also add indents before the attributes. So we'll press tab and tab. So it's easy to see that these attributes are part of this

component. And we'll do the same thing

component. And we'll do the same thing for the other three chat messages. So

we'll put this on its own line and add indents.

And put this on its own line.

Add indents.

And put this on its own line.

And add indents.

and save and check our website and everything should still work because we just changed the formatting of our code. So

let's go back and that's how we avoid our lines being too long. We can put each attribute on its own line and we can also surround a value with

brackets and put it on its own line.

Finally, down here, instead of using a variable to save our app, a best practice is to use a component to create this app.

So here, let's create a component using function and we'll name it capital A app

brackets and curly brackets.

And then this component will return all of this HTML.

So we'll return brackets so we can write it on multiple lines.

And we're going to move all this code up here. So let's select this code. And

here. So let's select this code. And

we'll cut and inside the return we're going to paste.

And we can select these lines and press tab to fix the indenting.

So now we're going to use this component instead of the variable to create our app. So down here, let's remove this

app. So down here, let's remove this variable.

And then inside render, we're going to create the app. We can type less than capital A app greater than and then less

than slash app greater than.

So this creates an entire chatbot application. And then we give this to

application. And then we give this to React to display on the website.

And again since there's nothing inside this component, we can use the self-closing element shortcut. So we can remove this closing tag. And then at the

end here we can type space and slash.

And now let's save and check our website.

And it displays the app on the website.

Let's go back to our code.

So a best practice is to use a component called app to create the website because it gives us access to extra features of components like props.

And also notice that we can have components inside a component. So this

lets us split up a website into smaller and smaller components or smaller and smaller pieces.

So again, React helps us create websites easier because it lets us work on a small piece of the website at a time.

In the next lesson, we're going to learn a very important feature of React called state. State lets us make our website

state. State lets us make our website interactive, and it will let us add new chat messages to our website.

And that's the end of this lesson. In

this lesson, we learned that a component is just a piece of the website. We also

learned that components let us create our own HTML elements. We started the chatbot project. We split the chatbot

chatbot project. We split the chatbot into chat input and chat message components. We learned props which let

components. We learned props which let us insert values into components and make components reusable.

We learned the destructuring and guard operator shortcuts. We did some code

operator shortcuts. We did some code cleanup and split longer lines into multiple lines. And we created an app

multiple lines. And we created an app component which represents the entire application.

Thanks for watching so far. If you find this course valuable, you can support the channel by liking this video, leaving a comment, and subscribing.

You can also check out the premium version of this course where you'll get all the lessons ads free broken down into small videos as well as additional lessons and more projects that are not

in the public React course. Currently,

the premium course contains 11 lessons and I'll be adding more lessons in the future. You can also get a certificate

future. You can also get a certificate of completion, create comments or questions on specific topics, get progress tracking, search and course

notes. You can also check out the

notes. You can also check out the membership where you can get this course ads free separated by each lesson, AI videos, backend tutorials, and more.

Thanks again, and let's continue with the course. Here are some exercises to

the course. Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to learn two of the most important features of React called state and event handlers. And

we're going to use these features to create the functionality for the chatbot project.

Before we learn state, we're going to improve our code a bit. Currently to add a new chat message we have to manually type a new chat message component.

Instead of manually typing this code we can actually use JavaScript to generate these components.

To do that we're going to do two steps.

The first step is to save the data. Data

means information.

Here the data is the information about our chat messages like the message and the sender. So we need to save this data

the sender. So we need to save this data or this information in our JavaScript.

Let's use a variable to save this data.

At the top of this component, we're going to create a variable using const and we'll name it chat messages

equals and we'll save it as an array by typing square brackets.

As a review, an array is a list of values. So here we want to save a list

values. So here we want to save a list of chat messages. So it makes sense to save it as an array.

Next, each chat message has multiple pieces of data, like the message and the sender. So, inside this array, we're

sender. So, inside this array, we're going to save each chat message as an object by typing curly brackets.

As a review, an object groups related values together. So, it's going to help

values together. So, it's going to help us group the message and the sender together.

And then inside this object, we're going to create a property called message colon and a string. And we're going to

use this to save the message. So let's

copy the first message. We'll select it and copy. And we're going to paste it in

and copy. And we're going to paste it in here.

And then we'll add a comma. And we're

going to add a sender property colon and a string. and we're going to save the

a string. and we're going to save the first sender which is the user.

So that's how we save the data for the first chat message in our JavaScript.

Now let's save the data for the second chat message.

So after the first object, we're going to type comma and create another object.

I will give this one a message property as well colon a string. and we'll save the second message.

We'll select this copy and then inside here we're going to paste.

Add a comma and a sender property colon and a string. And the second chat message is from the robot. So inside the

sender, we'll save robot.

Let's do the same thing for the third and fourth chat messages. we'll save

them in our JavaScript. Feel free to pause the video if you want to try it yourself.

So, for the third chat message, we're going to add a comma at the end and another object, a message property, a string,

and we're going to copy the third message, and paste it in here.

and a sender property. The third message is from the user.

And then we're going to type comma and another object the message property colon and a string. And we'll copy paste

the fourth message. So we'll select it, copy, and then inside here we're going to paste

and a sender property.

And the fourth message is from the robot.

So that's how we save the data or the information for the chat messages.

After we save the data, the second step is to generate the HTML. So we're going to use JavaScript to convert this data

into these components. So we don't have to type these components manually.

To do that, after the data, we're going to type the name of the data, which is chat messages.

And this is an array. And arrays have a feature called dot map and brackets.

As a review, do map lets us go through each value of an array and convert it into a new value.

To use dot map, we need to give it a function. So between these brackets,

function. So between these brackets, we're going to type a function using brackets, arrow, and curly brackets.

As a review, this is an arrow function.

It mostly works the same way as a function, but it's shorter. When we give a function to another function like map,

we usually use an arrow function because it makes the code a bit cleaner.

This is what React tutorials and documentations use.

Next, this function gets a parameter. So

at the top, we'll create a new parameter and name it chat message.

So now dom takes each value in this array and converts it into a new value.

The way it works is it starts with the first value and then it saves it in this parameter and runs this function and whatever we return from this function

will be the new first value. Then it

takes the second value. It saves it in this parameter and runs the function.

And whatever we return from the function will be the new second value. Then it

takes the third value, saves it, runs a function and whatever we return will be the new third value and so on. So map

basically goes through each value in this array, runs a function and converts it into a new value.

So here we want to convert each chat message object into a chat message component. So inside this inner

component. So inside this inner function, we're going to return a chat message component by typing brackets

and then here less than chat message/grater than to return a chat message component.

Next, each chat message component has two props, message and sender. So we're

going to add those props to this component.

So here we'll create a prop message equals and now what do we save in this prop?

Remember that map takes each object in this array and saves it in this parameter. So this parameter contains a

parameter. So this parameter contains a chat message object and each chat message object has a message and a sender. So we want to save the message

sender. So we want to save the message inside this prop.

To do that we're going to type curly brackets and inside we'll type this

object chat message and get the message property which is dot message.

This gets the message out of this object and saves it in the prop.

So why do we use curly brackets here instead of double quotes? If we use double quotes, it will save a string into this prop, which is not what we

want. But if we use curly brackets, it

want. But if we use curly brackets, it will save the result of this code into this prop.

So for the first chat message, the result of chat message dossage is going to be the string hello chatbot. So it's

going to take this and save it into the message prop here. For the second chat message, the result of this code is hello, how can I help you? And it will

save this into the message prop and so on. So using curly brackets we can put

on. So using curly brackets we can put any JavaScript code inside and it will save the result of this code into the

prop not just a string.

So next each chat message component has a sender prop. So here we're also going to add a sender

equals and again we want to save the sender property of this chat message object. So we'll type curly brackets and

object. So we'll type curly brackets and the object chat message dot sender.

So this will get the sender property out of each chat message object and save it in here. And that's it. Now map will

in here. And that's it. Now map will take each value of this array and convert it into a chat message component.

And here's what the result looks like.

Next, we're going to save the result of this code in a variable. So, up here, let's type const and we'll name the

variable chat message components equals this code.

And now we have an array of components or a list of components.

Finally, we're going to insert this array into the JSX.

So, down here, we can actually remove all of these chat message components because we're generating them now.

And we're going to type curly brackets, and we're going to insert this array.

In here, we'll type chat message components.

If we insert an array of components, React will just display all of these components on the page. If we save

and then go to our project, it displays all the chat message components that we generated with our JavaScript.

So now we're generating this HTML with JavaScript and we no longer have to type out each component manually.

Now, there's one more thing that's useful to know. Let's go back to our code.

And there's actually a shortcut that we can use here. Instead of saving this result in a variable, we can actually just insert this result directly in the

JSX.

So, we'll select this code and then cut.

And between the curly brackets, we're going to remove the variable and just paste that code.

And we'll remove the semicolon at the end.

And we'll select this code and press tab a few times to fix the indenting.

And finally, we can remove this variable up here.

Now we're just inserting the result of this code directly in the JSX.

This shortcut is used a lot in React tutorials and documentation. So it's

useful to know how it works.

Now let's save and then check our website.

And everything still works. So that's

how we generate the HTML.

Before we move on, there's actually an issue that we need to fix here. If we

look at our console and we scroll up, we'll see an error saying each child in a list should have a unique key prop. In

React, if we insert an array of components, we need to give each component a prop called key. The key

helps React track changes in the array.

So, we should give each component a key.

Let's go back to VS Code and for each chat message, we're going to add a prop called key equals.

And this key has to be unique. So, what

should we use as the key?

Usually when we have some data like this in the real world, each piece of data should have a unique ID that lets us

identify it. So let's add a unique ID to

identify it. So let's add a unique ID to each message to match what we would see in the real world. So for the first message after the sender, we'll add a

property called ID colon. And let's just make it a string ID1 to keep it simple.

For the second message, we'll add an ID with the string ID 2. For the third message, we'll make the ID ID3. And for

the fourth message, we'll add an ID string ID 4. So, we'll use these IDs for practice. They just have to be unique.

practice. They just have to be unique.

And now we'll use this unique ID as the key. So down here we'll set the key to

key. So down here we'll set the key to be equal to curly brackets and we'll get the chat message do ID.

So chat message id.

Again we use curly brackets here because we want to save the result of this code as the key. And now each component in

this array will have a unique key. Let's

save and check our website.

And now the error is gone from the console.

Let's go back to our code.

And now we have a lot of code in our app component.

To make our code easier to work with, we're going to separate this code into smaller pieces.

Notice that this code and this code are related to chat messages.

So it makes sense to separate these two pieces of code into a chat messages component.

So we'll scroll up above app. Let's create a new component

above app. Let's create a new component using function and we'll name it capital C chat capital M messages

brackets and curly brackets.

And now we're going to move all the code related to chat messages into this new component. So we'll select this code

component. So we'll select this code and cut.

And inside here, we're going to paste and create some new lines. And we're

going to select this code and cut.

And inside here, we're going to paste.

And at the end of this component, we need to return the HTML.

So at the end we're going to return open bracket and we'll remove the closed bracket for now and we're going to use a fragment to group all of these

components together. So we'll type less

components together. So we'll type less than greater than and at the end of this less than/greater than and we'll add the

close bracket at the end. And finally,

we can fix the indenting by pressing tab. And we'll remove the indent here

tab. And we'll remove the indent here and here as well, so that these are vertically aligned.

Finally, now that we have this chat messages component, we're going to insert this into our app. So, we'll

scroll down into app and remove these lines.

And to insert the chat messages component, we'll use the component syntax again. Less than capital C chat

syntax again. Less than capital C chat capital M messages slash greater than.

So now we just separated all that code into its own component and it makes our code much cleaner. Let's save

and check our website.

And everything still works. We just

reorganized our code into a chat messages component.

Okay, so far we saved the data and we generated the HTML. The last step to building a website is to make it interactive.

For example, when we click this send button, we want to add a chat message to the website. To make this website

the website. To make this website interactive, we're going to use event handlers.

An event handler lets us run a function when we interact with a website.

Let's do an example. We'll go back to our code and we're going to scroll up to the chat messages component

and then inside this fragment we're going to create a new line and let's create a new button using less than

button greater than and less than/button greater than and inside this button let's put the text send message.

So, we'll create a new button for practice.

Next, we're going to give this button a special prop. So, here we'll add a new

special prop. So, here we'll add a new prop called on capital C click equals curly brackets.

So, on click lets us run a function when we click this button. So, above this, let's create a function to run. So we'll

type function and let's name it send message brackets and curly brackets and inside this function let's just

console.log

console.log the string send message.

Now that we have this function we're going to save this function inside on click. So between these curly brackets,

click. So between these curly brackets, we're going to give the name of the function send message.

So notice that again we used curly brackets. Curly brackets lets us save

brackets. Curly brackets lets us save any type of value in a prop including a function.

Now that we gave on click this function, when we click this button, it's going to run this function and console.log this

message. Let's save

and we'll go to our website and try clicking this new send message button and this will run the function and display the message send message in the

console.

Let's go back to our code and we'll learn more details about event handlers.

So on click is known as the event and send message is known as the event handler. It does something when this

handler. It does something when this event happens or it handles the event.

Now there's two other things to note.

The event prop always starts with on and then the name of the event like click and the event prop must use camelc case.

As a review, camelc case means the first word is lowercase and all other words start with a capital. So that's why on is lowercase and click starts with a

capital C.

Another thing we should know is that here we should not run the event handler function. So we should not use brackets.

function. So we should not use brackets.

So this will run the function and then the result of the function will be undefined. and then it's going to save

undefined. and then it's going to save undefined into on click which doesn't work. Instead, we should just give the

work. Instead, we should just give the function directly to on click without running it.

So that's event handlers and event handler lets us run a function when we interact with a website and they make the website interactive.

Next, when we click this button, instead of just console.log, log. Let's add a new chat message. To do that, we can add

a new object to the chat messages array up here. So, inside this function, let's

up here. So, inside this function, let's remove console.log

remove console.log and then type the name of the array chat messages and then use the code.push

and brackets.

As a review, dot push adds a value to the end of an array. So inside here, we're going to add another object using curly brackets.

And each object will have a message property. So we'll type message colon

property. So we'll type message colon and then a string. And for our new message, let's just make the message test.

And we'll add a comma. And we'll add a sender property sender colon a string and this message will be from the user

comma and we'll give it an ID colon and let's just use the string ID5.

Now there's one problem with using ID5 in this situation.

Every message that we create when we click this button is going to have the ID ID5. But the ID should be unique. To

ID ID5. But the ID should be unique. To

create a unique ID, we can use some JavaScript code. So instead of ID5,

JavaScript code. So instead of ID5, we're going to use the code crypto dot

random capital U, capital U, capital I, capital D, and brackets.

So this is some JavaScript code that will generate a unique ID string every time we run this code. So now every message that we create using this button

will have a unique ID at the end. Let's create some new lines and let's console.log

the chat messages array to see if it has a new message. Let's save

and we'll go to our website and we'll click send message.

And now inside chat messages, we have five messages. So we added this last one

five messages. So we added this last one here. It has the message test. And

here. It has the message test. And

notice it has a unique ID. So we

successfully added a chat message when clicking this button.

Next, notice that even though we updated the data, it did not update the website.

So, it did not display a new chat message component on the website. To fix

this, we're going to learn one of the most important features of React called state. State is data that is connected

state. State is data that is connected to the HTML. When we update this data, it will update the HTML.

Let's go back to our code.

And if we scroll up, currently chat messages is just a normal variable. When we update chat messages,

variable. When we update chat messages, it will not update the HTML.

However, if we convert chat messages into state, when we update chat messages, it will update the HTML. So

now let's learn how to convert chat messages into state.

At the top of this component, we're going to use this code capital R react

dot use capital S state and brackets.

And between the brackets, we're going to give it the chat messages data. So,

we're going to select this data and cut.

and between these brackets we're going to paste.

So this will convert this data into state. So now if we update this data, it

state. So now if we update this data, it will also update the HTML.

So at the bottom here, we can remove the chat messages variable because we converted it into state.

Next, react doouse state returns an array. So at the front, let's save the

array. So at the front, let's save the result in a variable const array equals react. State.

react. State.

This array has two values. To get the first value, we can click here to collapse the code for now. And to get the first value, we're going to type the

name of the array. Array and then square brackets zero.

So remember, an array is a list of values and square bracket zero gets us the first value in the list or in the array.

So the first value we get from use state is the current data.

So here chat messages can change over time. It's going to start off as this

time. It's going to start off as this value which is the initial value and then we might add new chat messages in the future.

So the first value in this array gives us the current value of chat messages or the current data.

Let's save this in a variable so we can use it later. We'll do const and let's name it chat messages equals array zero.

So now we have the most current chat messages and we can use it down here to generate the HTML.

Next use state gives us a second value in this array. To get the second value we're going to type array square bracket 1.

And the second value of this array is a function that updates this data.

So let's save this function in a variable using const. And the naming convention for this function is a use

set. And then the name of the data which

set. And then the name of the data which is capital C chat capital M messages equals this value. And we should also

use camel case here. So the first word starts with a lowercase and every other word starts with a capital.

So this function lets us update the data. In React, we should not update the

data. In React, we should not update the data directly like we did down here using push. We should always use this

using push. We should always use this function to update the data. And that's

because this function tells React that the data changed and to update the HTML.

If we update the data directly, React will not update the HTML.

If we use this function to update the data, React will update the HTML. So we

should always use this function to update the data. This is also known as the updater function.

So now let's give it a try. Instead of

updating this data directly, we're going to use this updater function by typing

set chat messages and brackets.

And between the brackets, we're going to put the new value of chat messages.

So the way that this updator function works is it's going to replace the entire chat messages array with a new

array. So let's give it a try. First, we

array. So let's give it a try. First, we

need to make a copy of this array.

In React, we should not modify the data directly. We should always create a copy

directly. We should always create a copy of the data and then modify the copy.

This helps React be more efficient.

To create a copy, we're going to click between these brackets and create a new array using square brackets.

And to copy chat messages, we can use this code dot dot dot and the array that

we want to copy, which is chat messages.

As a review, this is a JavaScript feature called the spread operator. It

basically takes the values in an array and then copies them into a new array.

You can think of it like we're taking the values in this array and then spreading them out into this new array.

That's why it's called the spread operator.

The spread operator is used a lot in React tutorials and documentation. So,

it's useful to know how it works.

So, we created a copy of chat messages.

And now we want to add a new chat message at the end of this copy because we're trying to send a new message. To

do that, we can just add a comma at the end and then add a new chat message directly using curly brackets.

So each chat message has a message property colon and we'll give it the string test for now. And each chat

message has a sender property colon. And

let's make the sender the user.

And we'll give each chat message an ID.

And to create a unique ID we can use crypto random capital U capital U capital I

capital D and brackets.

So using the spread operator we made a copy of the chat messages array and then we added a value at the end of this new array.

And now this updater function will replace chat messages with this new array. And because we use this updater

array. And because we use this updater function, React will regenerate the HTML. So it will basically rerun all

HTML. So it will basically rerun all this code and it will update the website. So now let's save

website. So now let's save and let's check our website and we'll press send message.

it will create a new chat message in our data and it will also update the HTML.

So it will create a new chat message component and display it on the website.

Now let's go back and that is how state works. Let's do a short review. State is basically data

short review. State is basically data that is connected to the HTML. When we

update this data or we update the state, it will update the HTML.

To convert some data into state, we use react doouse state. So here it will convert this data into state and use

state gives us two values.

The first value is the current data and then the second value is a function to update this data. If we use the updater

function, it will also update the HTML.

So don't worry if state is a little bit confusing at first. The more you work with state, the more you'll get used to it. And we'll do more examples of state

it. And we'll do more examples of state in this course and in the exercises so you can get more practice.

Next, we're going to learn a shortcut called array destructuring.

Here we get the first value out of this array and save it in a variable called chat messages.

Now JavaScript actually has a shortcut for this. Above this we can type const

for this. Above this we can type const and then square bracket equals this array and inside the square brackets we can

type chat messages.

So this is similar to object dstructuring. This gets the first value

dstructuring. This gets the first value out of this array and saves it in a variable called chat messages. So this

code is a shortcut for this code. We can

also get the second value out of this array. At the end here we can type comma

array. At the end here we can type comma and then another variable name. Let's

use set chat messages.

So this gets the second value out of this array and saves it in a variable called set chat messages. So this code

is a shortcut for these two lines of code. And this shortcut is called array

code. And this shortcut is called array dstructuring because we're taking stuff out of this array. We're deconstructing

it. Now in array dstructuring the order matters. So this will always get the

matters. So this will always get the first value out of the array and this will always get the second value out of the array.

So now let's comment out these two lines. So we remember that this is just

lines. So we remember that this is just a shortcut. So we'll type double slash

a shortcut. So we'll type double slash at the front and here double slash at the front.

Now another shortcut we can use is instead of saving the result of use state in this variable and then dstructuring it we can just dstructure

this up here.

So instead of array we can just directly dstructure using square brackets and then the first value of u state is going to be chat messages

and the second value from state is going to be the updater function which is set chat messages.

So this code is a shortcut for this code. We just don't save it in a

code. We just don't save it in a variable in the middle.

So at the front of this code, let's also comment it out using double slash.

So that is array dstructuring. It gives

us an easier way to take values out of an array.

Now this shortcut is used a lot in React tutorials and documentation. So it's

useful to know how it works.

Next, instead of adding the same message test every time, we should add whatever message is in the text box. So, we'll

learn how to get the text in a text box.

In normal JavaScript, we might use the DOM to get the input element and then use a property called dot value to get

the text inside the text box.

However, in React, a best practice is do not use the DOM manually. That's because

React is managing the website. So, if we use the DOM manually, it might interfere with React.

Instead, we should use React features to get the text from a text box. One way to do this is we're going to scroll up to

the text box which is inside the chat input component and it's the input element here. So to get the text in this

element here. So to get the text in this text box we can use a prop called on

capital C change equals curly brackets.

Earlier we learned about the event on click which runs a function when we click an element. On change is another

event we can use in React. You can tell it's an event because it starts with on.

So onchange runs a function when we change the text inside an input.

So above this let's create a function to run. We'll type function

run. We'll type function and let's name it save input text brackets and curly brackets because

we're going to save the text inside this input.

And now let's save this function inside on change. So between the curly brackets

on change. So between the curly brackets we'll give it the function save input text. So again we use curly brackets

text. So again we use curly brackets here because we want to save a function inside this prop rather than just a

string. So now every time we change the

string. So now every time we change the text in this input it will run this function.

Next when onchange runs this function it's going to give this function one parameter up here called event.

event is an object and it contains details about the event or about the change. So one detail is event dot

change. So one detail is event dot target and this gives us the element that we're typing in or that we changed. So in this

case it's going to give us this input element. So React gives us access to

element. So React gives us access to this input element automatically using event.target. target.

event.target. target.

And now to get the text inside this input, we're going to use the property value.

So now let's console.log this to see what it looks like. console.log

and let's save our code and we'll go back to our website and we'll give it a try. So we'll click this text box and we're going to type

hello.

And you'll see that every time we type or change the text, it will console.log

the text in the text box. So that is how we get the text inside the text box using an onchange event.

Let's go back to our code.

And now we need to save this text so we can use it later when creating a chat message. To save this text, we're going

message. To save this text, we're going to use state. In React, we should use state to save data that changes over

time, like the text in the text box. So,

at the top of this component, let's use the code react dot use state and brackets.

And between the brackets, we're going to put the initial value. In this case, the initial value in the text box.

The text box originally starts as empty.

So let's set the value to the empty string.

Next, use state returns an array with two values. So at the front, let's use

two values. So at the front, let's use array dstructuring using const and we'll type square brackets equals this result.

And now to get the first value out of this array inside the square brackets we're going to type input text.

So this is the current data or the current text in the text box. So that's

why we name it input text.

To get the second value out of this array after this we can type comma and give a name for the second value. So the

naming convention is to use the word set and then the name of the data which is capital I input capital T text.

So this second value is an updator function. It lets us update the data.

function. It lets us update the data.

Now that we set up the state, every time we change the text, we're going to save it up here inside input text. To do

that, instead of console.log,

we're going to use the updater function set input text.

And now, every time we change the text, it's going to run this function. And

it's going to save the text inside input text.

Next, when we click the send button, we want to use this text to create a new chat message. First, we need to make the

chat message. First, we need to make the send button interactive.

To do that, inside this button element, we're going to add the prop on click equals curly brackets.

Again, on click lets us run a function when we click this button.

And now above this, let's create a function to run. We'll use function and let's name it send message brackets

and curly brackets and we're going to give this function to on click. So down

here we'll give the function name send message.

Now when we click this button it will run this function and let's just console.log input text to see what the

console.log input text to see what the value is. So in here we'll console.log

value is. So in here we'll console.log

brackets the input text and save.

And we'll go back to our website and in the text box we're going to type hello and then press send.

And you'll see that it console.logs the

text inside the text box.

Next, we're going to create a new chat message using this text. Let's go back to our code.

And if we scroll down in our code to the chat messages component, we already have code here that adds a new

message to chat messages. So, let's just select this code and we'll copy.

And at the top inside send message, we're going to paste. And we can remove this

paste. And we can remove this console.log.

console.log.

And we'll scroll back down.

And we created this function and this button for practice. But now we don't need it anymore. So we can actually remove this code

and remove this practice button.

Now, let's scroll back up and we're going to use this code to add a new chat message.

However, we have a problem here. We

don't actually have access to set chat messages inside this component because this is inside a different component. To

solve this problem, we're going to learn a technique called lifting the state up.

First we need to visualize the components in our app. So we have an app component which represents the entire application and inside we have a chat

input component and a chat messages component. Inside the chat messages

component. Inside the chat messages component we have some chat message components.

This is called the component tree because it looks like the branch of a tree and this helps us visualize the structure of the components in our app.

Currently, chat messages and set chat messages are located inside the chat messages component, but we want to use

it in the chat input component as well.

To solve this problem, we're going to move this state up into the app component and then app can share chat messages and set chat messages between

these two components.

This technique is called lifting the state up. By moving the state up to an

state up. By moving the state up to an outer component, it lets us share state between multiple components.

So, let's give this a try. First, we're

going to move the chat messages state up into app. So, in our code, we're going

into app. So, in our code, we're going to scroll down to the chat messages state, which is right here, and we're going to move it

into the app component. So, we'll select all this code, and then cut and remove these lines.

And then inside the app component, we'll create some new lines and paste.

So now we lifted the state up into the app component.

Next, we're going to share the state between the two components using props.

So first, the chat input component needs set chat messages and chat messages.

So down here, let's create two props for this component.

We'll create a prop called chat messages equals curly brackets. And we're going to save the value of chat messages from

the state. So we'll save chat messages.

the state. So we'll save chat messages.

And we'll give it another prop called set chat messages equals curly brackets.

And we'll give it the set chat messages function from the state.

So set chat messages.

By the way, notice that chat messages is an array. So using curly brackets, we

an array. So using curly brackets, we can save an array into this prop. So we

can save any type of value inside a prop.

And then inside chat input, we can access these two props by scrolling up.

And in the chat input component at the top, we'll type curly brackets and we'll get the chat messages prop,

and we'll also get the set chat messages prop.

And now this code has access to set chat messages and chat messages.

Next, let's scroll back down to the chat messages component.

So here we just need the chat messages array to generate the HTML. So let's

provide chat messages using a prop at the bottom at the chat messages component. We're

going to add a prop. chat messages

equals curly brackets and we'll give it the chat messages array. So here chat messages.

Now I want to talk about the naming convention used here. You'll notice that the component, the prop and the data all

use the same name. Instead of using names like this, this is the naming convention used in the React documentation.

The documentation tries to use the same name for many things like the component, the props, and the data. This keeps

things simple and consistent. We don't

have to come up with different names every time. And when we look at other

every time. And when we look at other people's React code, the names will be the same.

So, don't worry. It might be a bit confusing at first because many things use the same name. The more you work with React, the more you'll get used to

this naming convention, and we'll get lots of practice in this course.

Now to access this prop, we're going to scroll up and up here we'll type curly bracket

and we'll get the chat messages prop.

And now this code has access to everything that it needs. Let's save our code and then check our website.

And you'll notice that everything still works. We just lifted the state up into

works. We just lifted the state up into the app component and shared it between chat input and chat messages.

Let's go back to our code and we're going to scroll up to the chat input component.

So now that chat input has access to set chat messages, let's use it to create a new chat message. So when we click send,

we're going to run set chat messages and we're going to give it a copy of the chat messages array with a new message at the end. In this new message, instead

of test every time, we're going to use the text inside the text box, which is saved in input text. So, we'll remove

this and replace it with input text.

The sender will be the user because we sent this message. And we'll give the message a unique ID. And that's it. This

will update the chat messages array with this new message. And because we use the updater function, React will also update the HTML.

So, let's save.

And we'll go to our project.

Inside this text box, let's type hello and press send.

It will take the text in the text box, create a new chat message, and it will update the HTML.

Next, there is one improvement that we can make at this point. If we scroll up after we press send, we should also remove the text in the text box. So, we

don't have to manually remove it if we want to send another message.

To do that, we're going to learn a feature called controlled inputs.

Let's go back to our code.

And after adding a new message, we're going to remove the text in the text box. So after this, let's use the

box. So after this, let's use the updater function. Set input text

updater function. Set input text brackets will change the input text to the empty string.

So this will update the input text up here to be empty.

However, it will not update the HTML yet.

To update the HTML, we need to use this input text inside this HTML.

To do that, we're going to give the input element a prop called value equals curly brackets.

So value lets us change the value of this input or the text inside this input.

So we're going to set the value to whatever input text is.

So now if we set the input text to be empty, this will set the value to be empty as well and it will make the text box empty.

Let's save.

We'll go back to our website.

Inside the text box, we're going to type hello and press send.

And you'll notice that it makes the text box empty after we send. So let's go back to our code.

And this is called a controlled input.

Using the value prop, we can control the text inside this text box using our code.

The last feature we're going to work on in this lesson is if we scroll up after we send a message, we're going to get a response from the chatbot.

To get a response, we're going to use another external library. So, we'll

scroll up to the script elements up here. And to add another external

here. And to add another external library, we're going to add another script element.

And we're going to give this element the source attribute equals double quotes.

And we're going to give it the URL of the external library. Now, this is another external library that I wrote.

So, let's just copy one of these URLs up here with super simple dev. And we'll

copy.

And inside here, we're going to paste.

And then at the end, instead of react.js, we're going to load chatbot.js and save.

So now, let's take a look at the code in this URL.

On Windows, you can press control and click this link. And on Mac, you can press command and click this link.

If it doesn't open, you can also type the URL in the browser.

So again, an external library is just normal JavaScript code that someone else wrote. In this case, it's some code that

wrote. In this case, it's some code that I wrote. And this JavaScript code

I wrote. And this JavaScript code creates a simple chatbot.

This is an object and it has a method called get response.

We just have to give it our message and it will return a response.

So now let's use this external library.

We'll go back to VS Code and we'll scroll down to chat input. And

now after we send a message below this, let's use the chatbot external library to get a response. So the external

library creates a variable called capital C chatbot.

This is an object and it has a method called dot get response and brackets.

Between the brackets, we're just going to put the message that we sent, which is input text. So in here, we'll type input text

and get response will return a response.

So let's save it in a variable using const and we'll name it response.

equals this result. And next, let's just console.log the response to see what it

console.log the response to see what it looks like. console.log

looks like. console.log

the response and save.

And now let's go to our website and we're going to close the external library for now. And then we're going to click this text box and we'll type the

message hello and press send.

And now inside our console it will display the response from the chatbot.

And the chatbot responded with hello how can I help you? So using the chatbot external library we're able to get a response from the chatbot.

The last step is we're going to display this chatbot response on the website.

Let's go back to VS Code.

And to display the response on the website, we can just add another chat message using set chat messages.

Because this is an updater function from the state, React will automatically update the website as well. So down here we'll remove console.log

and let's just copy paste this code up here to create a new message. So we'll

copy and then down here we'll paste and here the message should be the response from the chatbot. So we'll

replace this with response and the sender is going to be the robot this time. and we'll give it a unique

this time. and we'll give it a unique ID.

So now let's save this code and try it out. We'll open the website and then in

out. We'll open the website and then in the text box we'll type hello and press send.

And if we look at the website, it sort of worked. It displayed the response

of worked. It displayed the response from the chatbot on the website.

However, it also removed our hello message. So why did this happen? Let's

message. So why did this happen? Let's

go back to VS Code.

And if we look at this code here, we updated chat messages by making a copy and adding a new message at the

end. However, in React, state does not

end. However, in React, state does not update immediately. The state is updated

update immediately. The state is updated after all of the code is finished.

So here all of the code is not finished yet. So chat messages is not updated to

yet. So chat messages is not updated to this new array immediately.

So when we get to this point in the code, this chat messages is still the old array without the new message that we added up here. And then we take the

old array and we add the chatbots response. And we essentially lost our

response. And we essentially lost our message.

So one way to fix this issue is to save this updated chat messages in a variable. So above this we're going to

variable. So above this we're going to create a new variable using const and let's name it new chat messages

equals and we're going to save this value. So,

we'll select this code and then cut.

And up here, we're going to paste.

And we'll set the chat messages to this variable, new chat messages.

So, this does the same thing as before, except we saved the new chat messages in this variable.

And then down here, instead of making a copy of chat messages, we're going to make a copy of new chat messages, which

contains our new message that we just added. So now it will have our message,

added. So now it will have our message, and we're going to add the chatbots response. So now let's save this code

response. So now let's save this code and go to our website.

In the text box, we're going to type hello and press send.

And it displays our message, hello, and the chatbot's response, hello, how can I help you?

Let's try another example. In the text box, we can type, "Can you flip a coin?"

and press send.

It will add and display our message and it will add and display the chatbot's response which is sure you got heads or tails and everything is working

correctly.

So as you can see state is another way that React helps us create websites easier. All we have to do is update the

easier. All we have to do is update the state and React will automatically update the website. We don't have to update the website manually ourselves.

And that's it. Using state, we created the functionality that we need for this project. In the next lesson, we'll style

project. In the next lesson, we'll style this with CSS to make it look like the final chatbot project.

And that's the end of this lesson. In

this lesson, we saved the data for our website using arrays and objects. We

generated the HTML using map and the key prop. We made the website interactive

prop. We made the website interactive using on click and onchange. We learned

state which is data that changes over time and is connected to the HTML. We

used the updater function to update the state and update the HTML at the same time. We learned the array destructuring

time. We learned the array destructuring shortcut. We learned a technique called

shortcut. We learned a technique called lifting the state up which lets us share state between components. We made the

chat input component interactive and created new chat messages. And we got responses from the chatbot.

Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to learn how to use CSS with React and we'll finish the chatbot project. Let's go back to our code

and we'll start by reviewing CSS.

CSS is another language and it lets us change the appearance of the website. To

use CSS with React, we just use CSS normally. So, one way to use CSS is to

normally. So, one way to use CSS is to create a style element.

So, we'll scroll to the top of our code to the head element and then inside here, we'll create a style element.

So, the style element doesn't appear on the website. That's why we put it in the

the website. That's why we put it in the head section.

And the special thing about the style element is we can write CSS code inside.

In here we'll type the CSS code button and curly brackets. And inside we'll type background dash color

green and semicolon.

So this is some CSS code. As a review, this code at the front is called the CSS selector. This tells a computer which

selector. This tells a computer which elements we want to change the appearance. And inside we have CSS

appearance. And inside we have CSS styles. This tells a computer how to

styles. This tells a computer how to change the appearance of these elements.

The left side is called the CSS property. This is what we're changing.

property. This is what we're changing.

And the right side is called the CSS value. This is what we're changing the

value. This is what we're changing the property to. So this code changes all

property to. So this code changes all buttons on the website and changes their background color to green. If we save

and then check our website, you can see that it changed the background color of the button to green.

Let's go back to our code.

And one problem here is button will style all buttons on the website. But

usually we want to just style a specific button. For example, let's scroll down

button. For example, let's scroll down to the chat input component and we're going to scroll down to this send button

here. So let's say we just want to style

here. So let's say we just want to style this send button. As a review to style a specific element, we can add an HTML

attribute called class. In React to set the class attribute, we're going to give this element a prop called class capital

N name equals double quotes.

And we'll give it the class send dash button.

In React, we use class name to set the class. That's because React is actually

class. That's because React is actually just JavaScript code and JavaScript already has a feature called class. So

class is a reserved word and we can't use it. That's why React uses class name

use it. That's why React uses class name to set the class.

Now that this button has the class send-button, we can style this specific element.

We'll go to our CSS and in here we're going to remove button and we're going to type dot and then the

class send dash button.

As a review, if we start the CSS selector with a dot, it will only style elements with this class. So this will

only style elements with the class send-ash button. If we save

send-ash button. If we save and check our website, it styles our send button because we gave it the send-button class.

If we open the console and go to the elements tab and then we look at our HTML here and we find the send button,

you'll notice that it has the class attribute. So class name in React is

attribute. So class name in React is converted to class in HTML.

Now that we reviewed CSS, we're going to style this button to look like the final design. So, first we're going to put the

design. So, first we're going to put the final design and our website side by side so it's easier to compare. So, I'll

take the final design here and I'll put it on the bottom left and I'll take our website and put it in the top left. And

I'm going to resize our code editor so we can see everything side by side.

And I'll hide the sidebar.

Next, to style our send button to look like the final project, we just have to style it one by one with CSS. So, we

already made the background color green.

Next, let's make the text color white.

To do that, we'll type the CSS property color colon and set it to white and save.

And that will make the text color white.

Next, let's make our button bigger. To

do that, we'll add space on the inside of the button. As a review, space on the inside of an element is called padding.

So in our CSS we're going to add padding colon and we'll give the padding two

values 12 px and 20 px.

So the px here stands for pixels. A

pixel is a unit of measurement in computers. For example, my computer

computers. For example, my computer screen is about 3,800 pixels wide. So 12

pixels and 20 pixels looks like this.

The first value is the vertical space inside this button. And the second value is the horizontal space inside this button. So we're going to add space all

button. So we're going to add space all around the inside of this button. So

let's save.

And it adds space on the inside.

And I think that looks close enough.

Next, let's add some space on the outside of this button on the left. As a

review, space on the outside of an element is called margin.

So, in our CSS, we'll add margin dash and we'll add it on the left colon. And

let's add 10 pixels of margin. And save.

And that looks close enough.

Next, our button has a border around the button, but in the final design, there is no border. To remove the borders,

we'll type the property border colon and set it to none and save.

And that will remove the borders.

Next, the corners of the button in the final design are round. To make our corners round, we're going to use the

CSS property border dash radius colon and then how round we want the corners

to be. Let's try 10 pixels and save.

to be. Let's try 10 pixels and save.

And I think that looks close enough.

Next, the text in the button is a little bigger in the final design. To change

the size of the text, we'll use the CSS property font dash size colon and let's

try 15 pixels and save.

And that looks pretty good. Next, if we put our mouse over our button, we no longer have the hand pointer icon that

we see here. to use this hand pointer icon. We're going to set the property

icon. We're going to set the property cursor colon pointer and save.

And now if we put our mouse over the button, we have the hand pointer icon again.

Finally, the background color of our button is a little different from the final design. So to get this exact green

final design. So to get this exact green color, we can go to the final project.

And then we're going to rightclick this button and then click inspect.

And we can click these three dots here and click this icon to open the console in a different window.

And we're going to go to the elements tab and we'll find the send button in the HTML. And we're going to look at

the HTML. And we're going to look at these styles. So you can see that this

these styles. So you can see that this button here has a background color of this RGB value. So we're going to select this RGB value and we're going to copy

it.

And in our code, instead of the color green, we're going to paste this RGB color.

As a review, RGB stands for red, green, blue, and it's a way to measure color in computers. Computers can create any

computers. Computers can create any color using a combination of red, green, and blue. The first value here is how

and blue. The first value here is how much red we want in the color. The

second value is how much green we want in the color. And the third value is how much blue we want. And each value goes from 0 to 255.

So this color combines a little bit of red, a lot of green, and a bit of blue to get this exact green color. So let's

save our code.

And now our button matches the final project.

And that's how we style the send button.

We just style it one by one using CSS until it looks like the final design. So

this is just a review of CSS. If you

want to learn CSS in more detail, you can check out my HTML and CSS full course in the video description.

Next, we're going to style this text box to look like the final design. Again,

we're just going to style it one by one with CSS.

First, we need to add a class to this element so we can select it in our CSS.

We'll go to our code and we're going to scroll down to this text box which is inside the chat input component and it's

this input element here. So to add a class we're going to use class name. So

inside the input element we'll add a class name equals double quotes and

let's give it the class chat dash input.

Now, let's scroll back up to the CSS.

And below these styles, we're going to type dot to select a class. And we're going to select the

class. And we're going to select the class we just added, which is chat dash input and curly brackets. And now we're

ready to style the text box.

The first thing we'll change is there's a lot of space on the inside of this text box in the final design. So again,

space on the inside of an element is called padding.

In our CSS, we'll add padding colon. And

let's do 12 pixels for the vertical space and 15 pixels for the horizontal space. Now let's save.

space. Now let's save.

And that adds space on the inside of our text box. And I think that looks close

text box. And I think that looks close enough. Next, we'll make the corners

enough. Next, we'll make the corners round. To do that, we'll use border dash

round. To do that, we'll use border dash radius colon. And let's try 10 pixels

radius colon. And let's try 10 pixels and save.

And that looks pretty good. Next, our

border is too thick compared to the final design. To change the thickness of

final design. To change the thickness of the border, we'll use border dash width

colon. And let's change it to 1 pixel

colon. And let's change it to 1 pixel and save.

So that looks pretty good. Finally, the

text is bigger in the final design. To

change the size of the text, we can use font dash size colon. And let's use 15 pixels again. So 15px

pixels again. So 15px and save.

And I think that looks good enough for now. So we styled the text box one by

now. So we styled the text box one by one to look like the final design.

Next in the final design, the text box is wider. And this text box is also

is wider. And this text box is also flexible. That means if we resize the

flexible. That means if we resize the browser, the text box will also resize.

To make our text box flexible, we're going to review a feature of CSS called flexbox.

Flexbox lets us create a flexible layout. Layout means how the elements

layout. Layout means how the elements are positioned on the website.

Here we have a horizontal layout where the elements are beside each other. And

also this element is flexible. So

flexbox helps us create this flexible layout. To use flexbox we need to do

layout. To use flexbox we need to do three steps. The first step is to create

three steps. The first step is to create a container around the elements that we want to position. So let's go back to our code and we're going to scroll down

to the chat input component and we'll scroll down to the HTML.

So here we want to position the text box and the button. So we need to create a container around these two elements.

Right now we have a fragment around these two elements. However, we cannot style a fragment with CSS since fragments don't actually appear on the

website.

Instead, we're going to switch this container to a div element because we can style a div element. So, inside

here, we'll type div and at the end, we'll do slash div to convert this container to a div element.

And now we have a container around the elements.

The second step is to add the property display flex to the container.

First, let's add a class name to this container so we can select it in our CSS. In here, we'll type class name

CSS. In here, we'll type class name equals double quotes and we'll give it the class chat-input

dash container.

And then we'll scroll up to our CSS.

And at the end we'll type dot to select a class and we'll select the class chat-input

dash container and curly brackets.

And finally we'll add the property display colon flex and that will turn this container into a flexbox.

The third step is to use flexbox features. Flexbox has many features we

features. Flexbox has many features we can use to control the layout or to control how these elements are

positioned. One feature is called flex

positioned. One feature is called flex grow. Flex grow makes an element grow

grow. Flex grow makes an element grow and take up the remaining space. So here

we want this text box to grow and take up this remaining space.

So we'll go to the styles for the chat input or the text box and we'll add the property flex dash grow

1 and save.

And now the text box will grow and take up the remaining space.

If we resize the browser, the text box will also resize to take up the remaining space.

So now we created the layout for the chat input that we see in the final design.

Next we'll create the layout for the overall app. Notice in the final project

overall app. Notice in the final project if we resize the browser and make it wider the app is limited to a certain

width. So it's not going to get wider.

width. So it's not going to get wider.

To create this in our project, we'll set a maximum width for our app.

So, let's go to our code and we're going to scroll down to the app component, which is down here, and we'll go down to the HTML.

And currently, the app is contained in a fragment. And remember, we cannot style

fragment. And remember, we cannot style a fragment since fragments don't actually appear on the website.

So again, we're going to switch this to a div element so we can style it. So in

here, we'll type div and at the bottom we'll type /ash div. And now we can style this.

First we'll add a class to this div using class name equals double quotes.

And let's give it the class app dash container.

and we'll scroll up to our CSS.

And at the bottom here, we'll type dot to select a class. And

we'll select the class app dash container and curly brackets.

And to set a maximum width of our app, we can just use the property max dash

width colon. and let's try 600 pixels

width colon. and let's try 600 pixels and save.

So now if we resize our browser the app will be limited to 600 pixels just like the final design. Next in the final

design notice that the app is centered on the website. Now there are several ways to center an element in CSS.

One way is to use margin. So we'll go back to our code and in the app container, we're going to

add the property margin dash left colon and we'll set it to auto. And we'll also

set the margin dash right colon auto.

So this will automatically add a space on the left and right of this element until it is centered. So if we save our

code and check our website, you'll notice that the entire app is now centered on the website. And now we

created the layout for the overall app.

Next, we're going to create the layout for the chat messages. If you don't have any chat messages in your final project, you can add some by typing in here and

then pressing send. So notice that the chat messages from the user are on the right while the chat messages from the

robot are on the left. So we're going to create this layout. First, we need to give class names to these chat messages

so we can style them.

So, let's resize our browser for now.

And we'll go to our code. And we're

going to scroll down to the chat message component. And we'll

scroll down to the HTML.

And we'll give each chat message a class name equals. And we're going to do

name equals. And we're going to do something different this time. We'll

type curly brackets. So here we want to give a different class name depending on if the sender is a user or the sender is a robot. This will let us position the

a robot. This will let us position the chat messages differently on the right or on the left. To give this a different class name depending on the sender.

We're going to use a feature of JavaScript called the turnary operator.

As a review, the turnary operator looks like this. And it works like an if else

like this. And it works like an if else statement.

If value one is true, then the result is value two. Else the result is value

value two. Else the result is value three.

The turnary operator lets us insert an if else statement directly in the JSX.

So using a turnary operator, we can give a different class name depending on the sender.

Inside here, we're going to type the if condition. So, we'll check if the sender

condition. So, we'll check if the sender is equal to the string user. And then

we'll type question mark. If the sender is the user, we'll set the class name to the string chat-

message dash user.

And then we'll type a colon. So, this

means else. So if the sender is not the user, we're going to give the class name the string chat-

message dash robot.

So again the way this code works is if the sender is equal to user, we'll set the class name to chat message user.

Else we'll set the class name to chat message robot. As you can see, the

message robot. As you can see, the turnary operator lets us insert an if else statement directly in the JSX. And

notice that we used curly brackets here because we want to save the result of this code into class name instead of just a string.

Before we continue, we can add some new lines to this code to make it easier to read. So, at the beginning, we can add a

read. So, at the beginning, we can add a new line. And then we'll add a new line

new line. And then we'll add a new line before the question mark and press tab.

And we'll add a new line before the colon. And we'll add a new line at the

colon. And we'll add a new line at the back.

And remove some spaces so that this is vertically aligned.

So, this makes the code a bit easier to read. We have the if condition and then

read. We have the if condition and then the first value and then else the second value. Now let's save

value. Now let's save and we'll go to our website and let's check the HTML. So in our console, we

can click these three dots here and then click this icon to open the console in another window. And we'll go to the

another window. And we'll go to the elements tab and we'll click this pointer on the top left and we'll select

one of these chat messages and click it.

And if we scroll down here, you can see that each chat message now has a class.

And messages from the user have the class chat message user. And messages

from the robot have the class chat message robot.

So now that we added a class to each of these chat messages, let's style these chat messages.

We'll go to our code and we'll scroll up to our CSS.

And at the end, let's type a dot. And

first let's select the class chat dash message dash user and curly brackets.

And now for chat message user we want to position these elements the text and the profile image on the right. To create

this flexible layout we can use flexbox.

Again remember there are three steps to use flexbox. First, we already have a

flexbox. First, we already have a container around the elements. It has a class chat message user or chat message robot.

Next, we need to add display flex to this container. So, for chat message

this container. So, for chat message user, we'll add display colon flex.

And now we can use flexbox features.

Another feature of flexbox is we're going to type justify dashcontent colon.

Justify content controls how the elements are displayed horizontally.

If we want these elements to be displayed on the right, we're going to give this a value end.

So it will display these elements at the end of this row or on the right.

So now let's save our code.

And now the chat messages from the user are on the right. And we created the layout for the chat messages.

Next, we're going to style the text in the chat messages.

First, we need to add a class name to this text so we can style it.

Let's go to our code and we're going to scroll down to the chat message component and we're going to scroll to the text

which is here. So currently this text is not inside an element. So first we're going to put this text inside an element

so that we can style just the text.

Above this, we'll put this in a div by typing less than div greater than and below it less than slashd greater than.

And we'll add an indent at the front to show that this text is inside this div.

And now let's add a class to this div so we can style just the text. So, we'll

give this a class name equals double quotes. And let's give it the class chat

quotes. And let's give it the class chat dash message dash text.

So now let's style this with CSS. We'll

scroll up to our CSS and at the end we'll type a dot and we'll style the class chat dash message

dash text and curly brackets.

So the first thing we'll style is we're going to change the background color to this gray color. To get this exact color, we're going to rightclick on this

text and then click inspect.

and we'll find this text in the elements tab and we're going to go into the styles and we'll get the background color. So, we'll copy this RGB color

color. So, we'll copy this RGB color and we'll go into our code and we'll set

the background dash color colon and we'll paste the RGB color and save.

And now we'll have the exact color in our final design.

However, after we saved, it kind of messed up our layout. So, the chat message user looks okay, but the text for chat message robot is now appearing

below the profile image and it's taking up the entire line.

So, what happened? Remember that we just surrounded this text in a div element.

Normally a div element takes up an entire line by itself because a div is a block element.

However, remember that we also made chat message user a flexbox. When a block element is inside a flexbox, it no

longer takes up the entire line. It only

takes up as much space as it needs to.

So that's why this div only takes up as much space as it needs because it's inside a flexbox.

One way to fix this layout problem is we can make chat message robot a flexbox as well. We'll go back to our code and

well. We'll go back to our code and below chat message user let's type dot

and we'll style the chat- message dash robot and curly brackets and we'll also give it display colon

flex so it will match the layout for the chat message user.

Let's save.

And now because this div is inside a flexbox, it only takes up as much space as it needs. So now the background color

and the layout looks good. Next, the

style of text or the font is different in the final design.

To change the font, we'll go to our code and we'll add the property font dash family colon And in the final project, I

use the font Ariel.

Let's save.

And now our font matches the final design.

Now, usually we don't set the font for just one element. We set the font for the entire website because we want the

entire website to use the same font or the same style of text. to set the font for the entire website. We can style the

body element. So, we'll scroll to the

body element. So, we'll scroll to the top of our CSS.

And here we'll style the body element curly brackets and we'll set the font

dash family colon to area.

So this sets the font for all elements inside the body, which is basically the entire website. So now we can scroll

entire website. So now we can scroll back down and we can remove this style because we're going to set the font for

the entire website instead.

Let's save.

And now we set the font for the entire website to Ariel.

Next, let's add space on the inside of this text, which is padding.

So, here we'll add padding colon. And let's try 15 pixels of

colon. And let's try 15 pixels of vertical space and 20 pixels of horizontal space. And save.

horizontal space. And save.

And that looks pretty good.

Next, we'll make the corners round.

To do that, we'll use border dash radius colon and 10 pixels and save.

And that looks pretty good. Next, let's

add space on the outside of the text on the right. So, we'll add margin dash

the right. So, we'll add margin dash right colon and let's try 10 pixels and

save.

And that looks close enough.

And here, if we scroll down to a chat message from the robot, we'll add some space on the left of the text. So, in

our code, we'll add margin dash left.

And let's try 10 pixels and save.

And that looks pretty good. Finally,

let's add some space on the bottom of the text so we can separate them. Here

we'll add margin dash bottom colon. And

let's try 20 pixels and save.

And I think that looks close enough.

However, we now have a problem here, which is the profile image seems to be stretching.

This happens because this container is a flexbox. And by default, elements inside

flexbox. And by default, elements inside a flexbox will stretch vertically.

So, if this text gets longer because we added some margin, this image will stretch.

To fix this, flexbox has another feature called align items. So in our CSS in chat message user,

we'll add the property align dash items colon and align items controls how the elements are displayed vertically. By

default, align items is stretch. That's

why the elements stretch vertically.

Instead, we're going to change align items to start.

This will display the elements at the start or at the top vertically, and it will no longer stretch. Same thing for

the chat message robot. We're going to give it align dash items colon start and save.

And now the elements in the flexbox will appear at the start or at the top vertically.

The last thing we'll style for the text is if we go to our final project and inside the text box we type test and

press send.

You'll notice that the response from the chatbot has a maximum width. So in our project, we're also going to add a

maximum width to our text. So in our code, we'll go to the chat message text

and let's add a max dash width colon.

And let's try 300 pixels and save.

And now if we go to our text box and type test and press send and scroll down, the text has a maximum width and

it matches the final design.

Now we finish styling the text in the chat messages.

Next, we'll style the profile images. So

in our code, let's scroll down to the profile image which is inside the chat message component

and it's these two image elements here.

Currently, we're using an attribute to set the width of this image. However, a

best practice is to use CSS for styling instead of attributes. So let's remove this attribute and we'll remove it down

here as well and we'll add a class to these profile images so that we can style them with CSS. So here we'll add

class name equals double quotes and we'll give it the class chat- message dash profile.

And we'll also add this class to the profile image for the user.

We'll give it the class name equals double quotes chat dash message dash profile.

So now we can style this with our CSS.

We'll scroll up to our CSS and at the end we'll type a dot and

we'll style the class chat dash message dash profile and curly brackets.

So previously we set the width to 50 pixels. So let's do that again using

pixels. So let's do that again using CSS. This time we'll set the width colon

CSS. This time we'll set the width colon to 50 pixels.

and save.

Now, if we look at the final design, it looks like the profile images here are a little bit smaller than our profile images. So, let's make this

profile images. So, let's make this width smaller. Let's try 45 pixels

width smaller. Let's try 45 pixels instead.

And save.

And I think that looks close enough. And

now our profile images are the same size as the final design.

The last thing we're going to change in this design is we're going to move the text box to the bottom so that it matches the design of other popular chatbots.

In the final project, we're going to make this a little taller. Now, we can move this text box to the bottom of the

page by clicking this link.

And now let's create this design in our project.

First I'll open our project and then move it back to the same window so that we can see this side by side a little easier. And to put the text box at the

easier. And to put the text box at the bottom of the page, the first step is to move the text box below the chat messages. We'll go to our code and we're

messages. We'll go to our code and we're going to scroll down to the app component which is here and we'll scroll to the

HTML and we're just going to move this chat input below the chat messages. So

we'll select this component and we'll cut and below chat messages we'll paste

and save.

And now the chat input will be below the chat messages. And that looks pretty

chat messages. And that looks pretty good. Next, we also want to put this

good. Next, we also want to put this chat input at the bottom of the browser here. So there are several ways to do

here. So there are several ways to do this in CSS. One way is to use flexbox again. Now before we use flexbox, we're

again. Now before we use flexbox, we're going to make the app container stretch to the bottom of the browser. So right

now if we click inside here and we rightclick and inspect and we go to the elements tab and we

scroll up and look at the app container.

Notice that the app container stops at the chat input section. And that's

because this is all the content that we have. So the app container only has the

have. So the app container only has the height that it needs. However, we want to stretch the app container to the bottom of the browser so that we can put

the chat input at the bottom. To do

that, we're going to set the height of the app container. So, we'll go back to our code and we'll scroll up to our CSS

and we're going to find the styles for the app container which is right here.

And at the end, we're going to set the height colon.

And now we want the height of the app container to stretch to be the same as the height of the browser here. To do

that, we're going to give this a special value 100 VH.

So VH stands for viewport height. This

gives us the height of the browser or the part of the page that is visible.

100 VH means 100% of the height of the browser. So this means the app container

browser. So this means the app container will be 100% of this height.

So now let's save and we'll go to our website and we'll open the console again by right-clicking and inspect

and go to the elements tab and we'll scroll up to the app container again.

And now you'll notice the app container stretches to the bottom of the browser.

However, the app container is actually a little too tall. So it actually stretches below the bottom of the page.

And now we can scroll a bit here. The

reason it's a little bit too tall is because by default the body element here has a default margin of 8 pixels on all

sides. So the app container is the same

sides. So the app container is the same height as the browser, but then we add another 8 pixels on the top and bottom.

To fix this issue, we can just remove the default margin from the body. So,

we'll go back to our code and scroll up to the styles for the body. And at the end, let's remove the

body. And at the end, let's remove the margin at the top and bottom by typing margin- top colon. And we'll set it to

zero pixels. And we'll also set the

zero pixels. And we'll also set the margin dashbottom

colon to zero pixels and save.

So now after we remove the default margin from the top and the bottom, the app container is now exactly the

same height as the browser.

Now that the app container stretches to the bottom of the browser, we can use a flexbox to make the chat messages grow

and push the chat input to the bottom.

Again, there are three steps to use a flexbox.

So here we want to position the chat messages and the chat input. So we need a container around these elements and we already have a container for this which

is the app container.

The second step is to add display flex to the container. So we'll go back to our code and we're going to scroll to

the app container styles which is right here and below this we'll add display

colon flex. Let's save our code.

colon flex. Let's save our code.

And unfortunately, it totally messed up our design. So what happened? By

our design. So what happened? By

default, flexbox positions our elements horizontally. So it takes all the

horizontally. So it takes all the elements inside the container and then squeezes them into a row like we see here.

However, this time we want to position the elements vertically, not horizontally.

To position the elements vertically, we're going to use a flexbox feature called flex direction.

So in here, we'll type flex dash direction. colon

direction. colon flex direction determines which direction the elements are positioned.

So flex direction is row by default.

That means it positions the elements horizontally like we see here.

Now we're going to change flex direction to column.

So this positions the elements vertically in a column. If we save our code and check the website, the elements in

the flexbox are now positioned vertically from top to bottom.

Next, we're going to use flex grow.

Again, as a review, flex grow makes an element grow and take up the remaining space.

Here, we want to make the chat messages section grow and take up all the remaining vertical space. And this will push the chat input down to the bottom.

To use Flex Grow, we're going to add a class to the chat messages section.

We'll go to our code and we'll scroll down to the chat messages component which is right here. And currently this component

right here. And currently this component uses a fragment. And remember, we cannot style a fragment since fragments don't

appear on the website. So again, we're going to switch this to a div element.

and at the end slash div so that we can style it.

And now we'll give this div a class using class name equals double quotes

and we'll give it the class chat dash messages dash container.

And now let's style this class. We'll

scroll up in our CSS and at the end here we'll type dot and we'll style the class chat dash messages

dash container and curly brackets and we'll use the flexbox feature flex dash grow

1.

So now let's save.

And this makes the chat message container grow and take up the remaining vertical space. And this will push the

vertical space. And this will push the chat input to the bottom of the browser.

So that's how we use a flexbox to position the chat input at the bottom.

Finally, if we look at the final design, we have some space at the top of the app and at the bottom of the app. So let's

add that space at the top and bottom to our website.

We'll go to our CSS and currently the app container has a special height of 100 VH. So let's avoid

changing this. Instead, let's add space

changing this. Instead, let's add space above the Chad messages container. So,

we'll scroll down to the chat messages container and we'll add some space at the top using margin dash top colon 20

pixels.

And we'll also add some space below the chat input container. So, we'll scroll up to the chat input container which is

right here. And we'll add space at the

right here. And we'll add space at the bottom using margin dash bottom colon.

And let's try 60 pixels and save.

And now that looks pretty good. And now

if we look at our website and compare it to the final design, you can see that it looks the same as the final design. So, we finished

styling our project to look like the final design using CSS.

Next, we're going to make the chat messages scrollable. In the final

messages scrollable. In the final project, if we have more chat messages than we can see in the browser, we can actually scroll to see all of the chat

messages. Now, you may need to add more

messages. Now, you may need to add more chat messages down here in order to see this feature. So, we're going to create

this feature. So, we're going to create this feature in our project. If we go to our project and we add some more

messages like test and press send, notice if we have too many messages, it starts to push the chat input down.

To make our chat messages scrollable, we're going to go to the CSS and we're going to find the chat messages container, which is right here.

And at the end we'll add a property overflow colon scroll.

So now if the chat messages overflow or there's too many to be displayed, it will start to scroll instead of pushing

things down. Let's save our code

things down. Let's save our code and then add another message test and press send.

And you may need to add a few more messages to see this feature. Now, if we have too many messages, we're able to scroll up and down to see all the messages.

Now, before we continue on Windows, we have a small problem, which is we start to see these thick scroll bars on the sides, which doesn't look very good. To

hide these scroll bars, we can go back to our CSS and at the end we can use the

property scroll bar dash width colon nut.

So now let's save.

And if we add a message test and press send and you might need to add more messages for your project. Now, if we

have more messages than we can see, we can scroll and we hide the scroll bars.

So, that's how we make the chat messages scrollable.

The last feature we're going to add to our project is auto scrolling. For

example, if we go down here and add the message test and press send, notice we have to manually scroll down

to the bottom ourselves. But if we go to the final project and at the bottom add a message test and press send,

notice that it automatically scrolls to the bottom of the chat messages. So,

we're going to add this autoscrolling feature.

Let's go back to our website.

And to create autoscrolling, we're going to learn one of the most important features of React called hooks.

Hooks let us insert React features into our component. And we've actually used

our component. And we've actually used hooks before. React.US

hooks before. React.US

state is a hook. It inserts a React feature called state into our component and state automatically updates the HTML

when the data changes. Now, React has other hooks that we can use and every hook starts with a word use.

Another hook is called use effect. Use

effect lets us run some code after the component is created or updated.

So in our project after we add a chat message we want to run some code to scroll to the bottom. So this is a

perfect situation for use effect.

Inside our code we're going to scroll down to the chat messages component which is here.

And at the top of the component, we're going to type the code capital R react dot use capital E effect

and brackets.

By the way, in React, we should put our hooks at the top of the component and they should not be inside anything. So,

don't put a hook inside an if statement or inside a function.

Next, we'll give use effect a function.

So, inside these brackets, we'll type a function using brackets, arrow, and curly brackets.

As a reminder, when we give a function to another function, we usually use an arrow function because it's a bit cleaner. So, React will run this

cleaner. So, React will run this function after the component is created

and every time the component is updated inside here. Let's try console.log

inside here. Let's try console.log

the string updated and save.

And now if we go to our project and we look at the console. So we'll rightclick inspect and we go to the console.

You'll see that after the component is created, it runs a function and displays updated. And then we're going to go to

updated. And then we're going to go to our website and we're going to add a new message like hello and press send.

So now after the component is updated, React runs the function again. So, as

you can see, use effect lets us run some code after the component is created or updated.

So, now let's go back into our code and we'll give use effect a second parameter. So, at the end we'll type a

parameter. So, at the end we'll type a comma and we'll give a second parameter which is an array.

So, this array controls when use effect runs. If we give it an empty array, use

runs. If we give it an empty array, use effect will only run once after the component is created.

Now, inside this array, we can also put some data such as our chat messages. So,

we'll type chat messages.

And now, React will also run this function every time our data changes or every time our chat messages changes.

If we save and we look at the console, use effect runs after the component is

created. And now if we add a message

created. And now if we add a message like hello and press send, use effect also runs after chat messages

changes.

So now let's go back to our code.

And this is called a dependency array.

It lets us control when use effect runs.

A best practice is to give use effect a dependency array to avoid running this function too often.

So now we learned hooks and the use effect hook. And now we can run some

effect hook. And now we can run some code after the chat messages changes.

The last step is after the chat messages changes, we want to automatically scroll to the bottom. To scroll to the bottom,

first we need to get the HTML element that we want to scroll into our JavaScript.

Let's go back to our code. And inside

this function, instead of console.log,

log we need to get this div chat messages container into our JavaScript.

Now in normal JavaScript we might use the DOM to get this element but remember in React we should not use the DOM

manually. Instead we should use React

manually. Instead we should use React features to get this element to get this element using React. We're

going to use another hook called use ref. So at the top of this component,

ref. So at the top of this component, we're going to type the code capital R react dot use capital R ref and

brackets.

Use ref lets us automatically save an HTML element from the component.

So this code creates a ref. A ref is a container with special React features.

One special feature is we can give this ref or this container to React and React can automatically save an HTML element

inside this ref or inside this container.

So between these brackets, we're first going to put the value null.

So this is the initial value that is saved inside this ref or inside this container. So the ref is going to start

container. So the ref is going to start out as empty. So that's why we use null.

Now let's save an HTML element inside this ref. To do that, first we're going

this ref. To do that, first we're going to save this ref in a variable. So at

the front we'll create a variable using const and we'll name it chat messages ref equals this result.

And then we're going to go to the HTML element we want to save, which is this div, the chat messages container.

And we're going to give this element a special prop called ref equals curly brackets. And between the curly

brackets. And between the curly brackets, we're going to give it the ref that we created above, which is chat

messages ref.

So now React will take this HTML element and save it inside this ref or inside this container.

To access the HTML element saved inside a ref, we're going to go to use effect and we're going to type the name of the

ref, which is chat messages ref and then current.

Now the reason we put this code in use effect is because remember use effect runs after the component is created. So

we need to wait for the component to be created first and then we can access this HTML element.

So now let's console.log this value to see what's inside this ref. So at the

front we'll console.log log open bracket and close bracket and save.

And we'll open the console for our website.

And you'll see that React saved the chat messages container inside our ref.

Now that we have the HTML element, we need to scroll. Let's learn how to scroll it to the bottom. Let's go back to our code

and first we're going to save this HTML element in a variable. So we'll remove this and at the front we'll create a

variable const and let's name it container lm equals this result.

So ending the variable name with lm tells us that this variable contains an HTML element.

and I'll resize my code editor so we can see more of the code.

Next, we'll create a new line. And it's

a good idea to check if this element actually exists before we scroll it. So,

we'll check if brackets container lm.

Finally, we'll type curly brackets.

And to scroll this element to the bottom, we can use this code container

lm dot scroll top and we'll make it

equal container lm dot scroll height.

So scroll top means how far from the top should we scroll and scroll height gives us the total height of the element. So,

if we set the scroll top to the total height, it's going to scroll all the way down to the bottom, which is exactly what we need. So, now let's save this

code and we'll go to our website and we'll add a message test and press send.

It runs the use effect function because chat messages changed and it automatically scrolls to the bottom.

Now, depending on the height of your browser, you might need to add a few more messages to see this effect. So, we

can also scroll up and then add another message like thank you and press send.

It runs use effect again and it automatically scrolls to the bottom. And

that's all the major features that we need for this project. I'll leave some extra features like removing these default messages and creating the

loading spinner as exercises.

And that's it. We created all the styling and features that we need and we finished the chatbot project. In the

next lesson, we'll learn how to do a proper React setup so we can organize our code into different files and folders instead of putting everything

into one HTML file. And this will help us work on bigger React projects.

And that's the end of this lesson. In

this lesson, we learned how to use CSS with React. We styled the chatbot

with React. We styled the chatbot project. We reviewed flexbox which lets

project. We reviewed flexbox which lets us create a flexible layout. We learned

the turnary operator which lets us insert an if else statement directly in the JSX. We learned hooks which lets us

the JSX. We learned hooks which lets us insert React features into our components. We learned the use effect

components. We learned the use effect hook which lets us run some code after the component is created or updated. We

learned the use ref hook which lets us automatically save an HTML element from the component and we created the auto scroll feature

for the chat messages.

Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to learn how to do a proper React setup. Right now,

all of our HTML, CSS, and JavaScript code is combined into one HTML file, chatbot.html.

chatbot.html.

Now, it's not good to combine all of our code in three different languages into one file because if we work on bigger projects, this file might contain thousands of lines of code, and it will

be almost impossible to manage all of that code if we put it all in one file.

Instead, we're going to do a proper React setup that will let us split up this code into different files and folders.

To create this React setup, we'll need to use the command line. So, first let's review the command line. We're going to go to VS Code and I'm going to make this

full screen.

And to open the command line, we're going to click the menu at the top and we're going to click the terminal menu and we're going to open a new terminal.

So here we can give an instruction or a command to the computer. For example,

we're going to type the command mkdir.

mkdir means make directory. A directory

is another name for a folder. So make

directory creates a new folder.

Then we'll type a space and we'll give this folder a name like test.

If we press enter, it creates a new folder named test. So

if we open our files on the left, you'll see that it created a new folder named test.

If that does not work for you, you can check the troubleshooting steps in the description.

So on this line here we can give instructions or commands to our computer and that's why this is called the command line

and a terminal basically lets us use the command line and it also lets us view the output of the command line up here.

So we created a new folder using this command. Now you might be wondering why

command. Now you might be wondering why did the folder get created here inside our project folder. As a review, the command line runs inside a specific

folder.

To see which folder the command line is currently running in, we can go to the bottom and type this command pwd or

print working directory and press enter.

And this command tells us the command line is currently running in the react-course folder which is our project folder right here. That means any

commands that we give to the computer will be done inside this folder. If we

make a directory, it will create the new directory inside this folder like we see here. If we give it another command like

here. If we give it another command like ls or list and press enter, it will list everything inside this

folder. So it will list everything here.

folder. So it will list everything here.

As you can see, the command line runs inside a specific folder.

Now this folder that the command line is running in is called the working directory or the working folder.

The last thing we need to review about the command line is how to change the working directory. To do that, we're

working directory. To do that, we're going to go to the bottom and we're going to type the command cd or change

directory and then press space and then the name of the folder we want to change to like test.

the command line will look for this folder in the working directory which is here and then it's going to go into this folder. So now if we press enter and

folder. So now if we press enter and then type print working directory and press enter it will tell us the command line is now

running inside the test folder.

So the command line basically went inside this test folder and it's running inside here. By the way, this is known

inside here. By the way, this is known as a file path. The slash here means that the test folder is inside the

react-course folder.

So now if we give a command like ls and press enter, it will list everything inside the test folder because the command line is

running inside this test folder and it tells us there's nothing inside the test folder.

Finally, to get out of the test folder, we can type cd or change directory and then space and use the special value dot

dot. Dot dot represents the outer

dot. Dot dot represents the outer folder.

If we press enter, the command line will go out of the test folder and back into the react-course folder.

If we type the command pwd or print working directory and press enter, it will tell us the command line is

running in the react-ourse folder again.

So using cd or change directory, we can change which folder the command line is running in and we can basically move around our computer. So this is just a

review of the command line.

The second thing we need for the React setup is NodeJS.

So, we're going to review NodeJS.

First, make sure you have the correct version of NodeJS installed. To do that, you can click this link in the description.

Scroll down to lesson 5 and follow the instructions here to install the correct version of NodeJS.

After Node.js is installed, let's go back to VS Code. And if you just installed Node.js, we need to restart VS Code to make sure that Node.js is

loaded.

So, we're going to click X in the top right of the terminal and then close VS Code.

And then we're going to open VS Code again.

And we're going to open our project folder React-Course.

and we're going to open a new terminal.

So, in the top menu, we're going to go to the terminal section and then open a new terminal.

Now, when we install NodeJS, it's going to add a new command to our command line called node.

So, the node command lets us run JavaScript code outside of a browser.

For example, here we have a file called react-basics.js and inside we have some simple JavaScript code. If you don't have this

JavaScript code. If you don't have this file, feel free to pause the video and create this file. Now we can give this file to node and it will run the

JavaScript code in this file. So here

we'll use the node command and type space and give it the file to run which is react-basics.js and press enter.

So this will run the JavaScript inside this file and a console.logs hello. So

as you can see the node command lets us run JavaScript code outside of our browser.

Now when we install Node.js, it also adds another command to our command line called npm.

npm stands for node package manager. A

package is basically an external library. So npm lets us install external

library. So npm lets us install external libraries or packages into our project.

To do that, we can use the command npm space install and then space and then the name of an

external library or package.

As an example, we'll install the package super simple dev.

This is a package that I created that we can use as an example and press enter.

On Windows, if you get an error like this, you'll need to run this command first and then run npm install super simple

dev again.

If that still does not work for you, you can check the troubleshooting steps in the description.

Once npm install finishes, npm will download this external library or this package into a folder called node

modules. If we open this folder, we see

modules. If we open this folder, we see the super simple dev package and inside this contains the code that we've been using in the chatbot project like

react.js and chatbot.js.

and chatbot.js.

npm contains millions of packages that we can download and use in our project and you can search for packages on the npm website.

So this is just a review of NodeJS and npm.

Now that we reviewed NodeJS and npm, we're ready to do a proper React setup.

We just learned that npm has millions of packages available to use. Some of these packages also add a command to our

command line. For example, there's a

command line. For example, there's a package called create-vit.

If we install this package, it also adds a command to our command line called create-vit.

The create-vit command helps us set up a new React project.

To use the create-v command, we need to do two steps. Number one, we need to install the create-vt package. And

number two, we're going to run the create-v command in the command line.

Now, npm actually has a shortcut for this called npx.

npx does these two steps in one step.

The x means execute.

So let's go to our command line and let's type the command npx create-vt.

And then we'll also type the at symbol.

At means we're going to use a specific version of the create-vit command. For

this video, we're going to use a specific version so that you have the same code that I do and you can follow along.

To get the version of create-vt we're going to use, we're going to click this link in the description.

Go to lesson 5 and here you'll find the version of create-vt we're going to use.

You can also find the full command here.

By the way, the version that you see in this video might be different than the version you see on your page. You should

always use the version that you see on your page. I did this because it's hard

your page. I did this because it's hard to update the video. So, this lets me easily update the version in the future.

So, select the version on your page.

Copy.

And in our command line, we're going to paste it after the at.

So again, this command will install the create-vt package and then it will run the create-vit command. The create-v

command will help us set up a new react project.

By the way, in some tutorials, they might use the command npm create vit.

This is just a shortcut for npxcreate-vit.

Now let's press enter.

If it says it needs to install this package, we can press y for yes and press enter.

Now the create-v command will ask us some questions. First it will ask us for

some questions. First it will ask us for a project name. So let's name it chatbot dash project and press enter.

And then it will ask us what technology we want to use in our project. So we're

going to press the down arrow and select react and press enter.

And it will ask us what other tools we want in our project. We're going to press down and just select JavaScript and press enter.

and create vit will create an empty React project at this location or this folder right here.

Next, we're going to go into this folder with our command line. To do that, we can use the command cd or change

directory and give it the folder name chatbot dash project and press enter.

If we type pwd and press enter, it will tell us the command line is now running inside of the chatbot project

folder. So, it's running inside of here.

folder. So, it's running inside of here.

The next thing we're going to do is we're going to run the command npm install.

Inside our chatbot project folder, we have a special file called package.json.

So, package.json JSON contains a list of all the packages that are needed for this project. So, npm install is going

this project. So, npm install is going to install all of these packages at the same time.

So, we'll go back to the command line and scroll down and we'll run the command npm install and press enter.

Now, this might take a while because it's going to install a lot of packages.

So, we just got to wait until it finishes.

After npm install finishes, all of the packages here are going to be downloaded into the node modules folder. So, if we open this, you'll see that we have a lot

of packages here. Now, you'll notice that there's more packages here than we have in the package.json file, and that's because some packages require

other packages. So, npm helps us install

other packages. So, npm helps us install everything that we need.

The last step is to run the command npm rundev.

So, this will start up our new React website. Let's press enter.

website. Let's press enter.

And now we can view this website by opening this URL in our browser. So,

we're going to select this URL and copy and then open our browser.

And I'm going to make it full screen so we can see more of it. We'll create a new tab and paste and press enter.

And now we have a new React website that we can work with. So that's how we do a proper React setup using the command

line npm and vit.

Now that we created a proper React setup, let's go back to VS Code and we'll learn what each of these files

and folders do. As a review, the node modules folder is where npm installs all of the packages.

Next, we're going to look at the src or the source folder.

This folder contains the code for our website. So, all our JavaScript and CSS

website. So, all our JavaScript and CSS code goes in here. And remember, when using React, we write JSX code rather

than normal JavaScript code. So, the

files here end with JSX instead of JS.

Next, this assets folder contains images that we want to display on our website.

So, here we have an image of the React logo in SVG format.

The last folder here is the public folder. The public folder contains files

folder. The public folder contains files that should be available to the public.

Public means we can access these using a URL. That means that when this website

URL. That means that when this website is on the internet, I can give you a URL to this image and you'll be able to access it.

So here they just put this vit image in the public folder as an example. So now

we understand the folders that we have in this setup.

Next let's learn about all the files in this react setup. The first file.get Git

ignore is used by a tool called git. Git

helps us track changes in our code. For

this chatbot project, we're not going to use git. So this file doesn't do

use git. So this file doesn't do anything. So we don't need to change

anything. So we don't need to change this file.

The next file here is eslint.config.js.

So this is used by a tool called eslint.

eslint highlights problems in our JavaScript code. Let's do an example. If

JavaScript code. Let's do an example. If

we open the source folder and we open the file app.jsx

and let's say that here I accidentally misspell setc count by removing the last t.

My VS code doesn't really tell me that there is a problem here. But ESLint will tell me very clearly that there is a

problem. To use ESLint, we need to

problem. To use ESLint, we need to install the ESLint extension. So we can go to the extension section

and we'll install the extension ESLint and we'll install it.

After it's installed, if we go back to app.jsx

app.jsx now, it's going to tell me with a red underline that this variable name does not match the variable name down here.

So, if we scroll up and we fix the spelling by adding back the t, that red underline or that error will go away.

As you can see, eslint is a really useful tool that highlights problems in our JavaScript code. So, if we go back to the eslint.config.js,

this file configures eslint, it tells it what to check for. So, this

configuration file is actually good enough for now. So, we don't need to change this file.

The next file in our setup is index.htm.

html.

This contains all the HTML code for our React website. So, this is the same

React website. So, this is the same thing as chatbot.html.

The main difference is instead of putting all of our code inside the HTML file index.html loads our JavaScript from a different

file.

So this is the one file that we may need to change inside this setup. If we want to change the HTML for our website,

for example, we can change the title at the top of the tabs by removing this and let's change it to chatbot

project.

If we save, vit will automatically refresh our page just like live server does. And if we open our website, you'll see that the

title at the top changed.

Let's go back.

So the index.html contains the HTML code for this website.

The next file in this setup is package-lock.json.

package-lock.json.

As a review, package.json has a list of packages that we need to install to run this project. What package lock.json

this project. What package lock.json

does is it saves the version numbers of all the packages that we installed. So

the next time we run npm install, this file makes sure that we get the same versions for all of these packages.

Now npm automatically updates package lock.json. So we don't need to change

lock.json. So we don't need to change this file. The next file in the setup is

this file. The next file in the setup is package.json. JSON and this basically

package.json. JSON and this basically contains the list of packages that we need in our project as well as some other information about our project.

When we npm install a package, it will automatically update this list of packages. So we don't need to change

packages. So we don't need to change this file.

Next, we have the file readme.md.

So this is just text. It provides more information about this project. And this

is not code. This is just forformational purposes. So we don't need to change

purposes. So we don't need to change this file.

Finally vit.config.js

configures vit. Vit is the tool that we used to set up this project. Vit also

helps us build the website. That means

it takes all the JavaScript and CSS and then loads them into the HTML file. Vit

also creates a server. A server puts our website at a URL. For example, here it put our website at the URL localhost 5173.

So this lets us view the website in a web browser like a real website. When we

were building the chatbot project in the previous lessons, we used an extension called live server. Live server

automatically refreshes the website when we change some code. The VIT server also refreshes the website when we change some code. So the VIT server is actually

some code. So the VIT server is actually a replacement for the live server that we used earlier. So those are three main features of Vit and you can see that

it's really helpful for setting up and developing a React website. We'll go

back to VS Code.

So the vit config.js file basically configures vit. So this config file is

configures vit. So this config file is good enough. So we don't need to change

good enough. So we don't need to change this file. And that's it. Now we

this file. And that's it. Now we

understand all the files and folders in this react setup. As you can see most of these files are just configuration files

and we don't need to change them. The

only files we need to focus on and change are the HTML file and the files in the source folder which is our CSS

and JavaScript files.

Now that we understand all the files and folders in this React setup, let's move our previous chatbot project into this

setup. First, we can close the chatbot

setup. First, we can close the chatbot project folder for now. And let's

actually remove the node modules folder that we created earlier for practice. So

we'll delete this folder and let's also delete the test folder that we created for practice and also the package lock.json and

package.json.

Next, let's go into the chatbot project folder and we'll open the source folder and we'll start with this file app.jsx.

So notice that in this file we have a react component called app and this component represents the entire application.

Now previously in chatbot.html we also created an app component.

So all we have to do is to replace this app component with our previous app component. So let's go to our code and

component. So let's go to our code and we're going to open chatbot.html and we're going to scroll down till we see the app component which is down

here. So we're going to select the app

here. So we're going to select the app component and make sure you don't select the code down here. We just want to copy the

down here. We just want to copy the component over. So, we're going to copy

component over. So, we're going to copy this and then go back to app.jsx

and we're going to remove this app component. So, we'll select it

component. So, we'll select it and remove it and we're going to paste the app component from our previous project.

And now we're going to scroll up and eslint is going to tell us we have some errors here. So we'll go through these

errors here. So we'll go through these errors one by one.

First for this error eslint is going to tell us that react is not defined.

Before we loaded the react external library using a script tag and this provided a variable called react.

However, now that we're using NodeJS, we usually don't use script tags to load the external libraries. Instead, we

download these packages into Node modules and then load it from node modules. With node modules, we can use a

modules. With node modules, we can use a JavaScript feature called modules to only load the parts of the external

library that we need. So when using npm, a best practice is to load external libraries from node modules. Instead of

using a script tag to load an external library from node modules, we use the word import. And

then we tell the computer which external library or which package we want to load from by typing from and then the name of

the package like the string react. If we

just type a name directly like this and we don't start with dot slash or slash, this tells the computer to look inside node modules for the React package. So,

it's going to look in here and it's going to find the React package in here and load it from here.

Also, when importing from node modules, we don't have to import the entire React library. we can just import what we

library. we can just import what we need. For example, here we just import

need. For example, here we just import the use state feature from React.

So now that we imported use state, we can just use this directly here instead of doing react dot use state. So we can

remove react dot and use state directly.

Next, these two lines import images that were used in the example website. So,

we're no longer using these images. So,

ESLint displays an error. To fix this, we can just remove these imports.

Next, let's scroll down and it's going to tell us that the components chat messages and chat input are missing and they don't exist in this

file. So, let's actually just copy them

file. So, let's actually just copy them over from chatbot.html.

So, we'll go back to the previous project and in chatbot.html, HTML. We're going

to scroll up and above the app component, we're going to copy over all of our other components. So, we're going to select

components. So, we're going to select all this code and we're going to copy

and let's go back to app.jsx

and we'll scroll up above the app. We're

going to paste all of the other components that we created.

And now if we scroll down and look at our app component, you can see that there's no more errors because we moved these components into this file. So now

we've moved the app component into this new React setup.

After copying over all of our other components, we now have some more ESLint errors. So, let's scroll up to the top

errors. So, let's scroll up to the top and we'll fix these errors one by one.

First, you might see an error here for the props.

ESLint tells us that these props are missing props validations.

Props validation was an older feature of React. Newer versions of React don't use

React. Newer versions of React don't use this feature. So, we can actually turn

this feature. So, we can actually turn off this check in eslint.

To turn off a check in eslint, we're going to go to the eslint config.js file, and we're going to scroll down to

the rules section here. A rule tells ESLint what to check for. At the bottom of this object, we're going to add the

string react slprop-types colon and we'll set it to the string off and save.

So, this will turn off this particular rule or this particular check. And now,

if we go back to app.jsx, jsx. We no

longer have those eslint errors because we turned off the check.

Next, remember that we're no longer using react.

We can just use state directly. So, we

can remove react dot.

Next, let's scroll down and eslint will tell us that chatbot does not exist in this file. So, previously we loaded the

this file. So, previously we loaded the chatbot using a script tag. But

remember, now that we're using npm, a best practice is to load the chatbot from node modules.

First, we need to download the chatbot into node modules. To do that, we're going to install the package super simple dev. Let's go back to the command

simple dev. Let's go back to the command line.

And currently, it's running the vit server. So, we're going to stop the

server. So, we're going to stop the server by pressing control C on Windows or control C on Mac. Note that on Mac,

it's control C, not command C. So, this

will stop the V server and bring us back to the command line. Usually, to exit something from the command line, we can

press control C in both Windows and Mac.

Next, we're going to npm install the package super simple dev. So, this

package contains the chatbot code that we were using earlier. Let's press

enter.

It's going to install the super simple dev package inside node modules. And now

to load it from node modules, we're going to scroll up in our code and at the top we're going to import

and type curly brackets. So we're going to import the chatbot object and we're going to import it from a string and

we'll import it from the package super simple dev. So this will load the super

simple dev. So this will load the super simple dev package from inside node modules and get the chatbot out of it.

And now that we have this chatbot object, if we scroll down, we have access to it. So it's no longer giving us an error.

Finally, we're going to scroll down to the chat messages component.

And here it's telling us that React does not exist. So just like with use state,

not exist. So just like with use state, we can import use ref and use effect directly as well.

So let's remove the react dot from here and remove react dot from here.

And we're going to scroll up and at the top we're already importing from the React package. To import

multiple things we can just add a comma at the end. and import use ref and add

another comma and import use effect.

This gets these two features out of React and now we can use them directly in our code.

And now we've fixed all the ESLint errors in our app component. If you did the exercises in the previous lesson, you may have some more ESLint errors.

So, make sure you fix any other errors that you have. And finally, let's save this file.

Next, we're going to look at the file main.jsx.

main.jsx.

So, this code sets up React. It calls

create root, gives it a container, and then renders the app component onto the website. If we open our chatbot.html

website. If we open our chatbot.html HTML and we scroll to the very bottom.

You notice that we do the same thing. We

call create root, give it a container, and then render the app onto the website. So main.jsx

website. So main.jsx

does the same thing as this code. It

sets up React and displays the app onto the website.

Now, instead of copying this code over to main.j jsx. We're just going to use

to main.j jsx. We're just going to use the code in this file because it basically does the same thing. It just

uses an ID for the container instead of a class. The one other difference in

a class. The one other difference in this code is it wraps the app in a component called strict mode. Strict

mode is a special component provided by React. Strict mode basically gives us

React. Strict mode basically gives us some additional checks and warnings when developing our app.

And that's it. We moved all of our JavaScript code into this new setup.

Now, let's open this app in our browser to see what it looks like. We'll go down to the command line and let's make sure

we're running inside the chatbot project folder by typing pwd and press enter.

So, that looks good. And we're going to start the VIT server by typing npm rundev

and press enter.

And we'll open this URL in our browser.

I already have it open.

So I'll open my browser and refresh this page. And now the website displays our

page. And now the website displays our previous chatbot app. in the text box.

If we type a message like hello and press send, it will display a response from the chatbot.

However, obviously it doesn't look right, and that's because we haven't moved our CSS code and images over into the new setup. So, we're going to do

that next.

Let's move our CSS code into this new React setup.

We'll go back to VS Code and we're going to open chatbot.html and we're going to go to the top of this file right here.

So at the top we have all of our CSS code. We're going to move this CSS code

code. We're going to move this CSS code into app.css.

into app.css.

So, we'll select all of this CSS all the way to the bottom and we're going to copy it and then open app.css

and we're going to remove this default CSS. So, we'll remove this and then

CSS. So, we'll remove this and then paste our CSS code and save.

And now how does this CSS code get loaded on the website? If we open app.jsx,

app.jsx, notice at the top we import/app.css.

So dot slash means the current folder.

It means the folder that contains this file, which is the source folder. So

it's going to start from source and look for a file called app.css.

and it finds it here and it will load all the CSS code in this file onto the website. So you might be wondering how

website. So you might be wondering how can we import a CSS file like this?

Doesn't import only work for JavaScript files. So this is actually a feature of

files. So this is actually a feature of Vit. Vit lets us import any type of file

Vit. Vit lets us import any type of file like a CSS file or even an image file.

Depending on the type of file, it will behave differently. If we import a CSS

behave differently. If we import a CSS file, vit will load all the CSS code in this file and apply it to the website.

So that's how this works. We use Vit to load the CSS code inside app.css CSS.

And this allows us to separate our CSS code into its own file to make our code more organized.

Next, you'll also notice that in here we have an index.css

file.

This CSS file is loaded by main.jsx

here using this import. So why do we have two CSS files? A best practice is to split up our CSS into different

files. All the CSS for the app component

files. All the CSS for the app component go inside the app.css file. All the CSS for the overall website should go inside

index.css.

index.css.

If we open app.css

and we scroll to the top, the body styles here are not related to the app component. This styles the

overall website. So a best practice is

overall website. So a best practice is to split up this code and move this into index.css.

index.css.

So we'll select this code and then cut and save and then inside index.css CSS.

We're going to remove this default code and paste those body styles and save.

If we go back to app.css,

the rest of this code is related to the app component. So, it makes sense to

app component. So, it makes sense to leave it in app.css.

And now we moved all of our CSS into our new React setup. So, let's open our project again in the browser to see what it looks like.

And now it's looking pretty good. It's

looking like our previous chatbot project. And we have the layout and

project. And we have the layout and styling that we need. The last thing we're missing here are the images. So,

we're going to move those. Next,

let's move the robot image and the user image into the new React setup. We'll go

back to VS Code and we're going to scroll down and we're going to select the robot.png image and

we'll copy it by pressing control C on Windows or command C on Mac.

And let's scroll up and we're going to put it inside the source/assets folder. So, this is typically where we

folder. So, this is typically where we put our images. So, let's click on this assets folder and we're going to paste the image by pressing controlV on

Windows or commandV on Mac.

And now we have the robot image in our new setup. Let's do the same for the

new setup. Let's do the same for the user image. So, we'll go down and select

user image. So, we'll go down and select user.png and we'll copy and then select the assets folder and

we'll paste.

And now we need to load these images into our app. Let's open app.jsx.

And to load this image, we can actually just import it. So at the top, let's type import

and we'll give this image a name like robot profile image. And we'll import it

from a string. and we're going to locate this image file. So inside here, we'll start by typing dot slash, which means

the current folder or the folder that contains app.jsx,

contains app.jsx, which is the source folder. So we're

going to start from the source folder and then we're going to go into the assets folder. So, we'll type assets.

assets folder. So, we'll type assets.

And to go into this folder, we're going to type a slash. And then we're going to look for the file robot.png.

So, we'll type robot.png.

So, this is a file path. It tells the computer how to locate this file.

So also notice that in this import we just gave it a name instead of using curly brackets.

This is called a default export and we'll review this later in the lesson.

But for now just remember that when we import an image we just give it a name without curly brackets.

Let's also load the user image. So,

we're going to import and give it a name, user profile image, and we'll import it from a string. And we're going

to locate the user.png file. So, we'll

start from the current folder using dot slash. We'll look for the assets folder

slash. We'll look for the assets folder and then slash to go into this folder.

And we'll look for the file user.png.

So remember this is a feature of vit.

Vit lets us import any type of file including an image file. When we import an image like this, vit gives us a file

path to that image. So this contains a file path like this. And we can use this directly in an images source attribute.

So, let's scroll down to the chat message component. And in here, we have

message component. And in here, we have our two image elements. So, in the source attribute, instead of robot.png,

we're going to give it those images that we imported by typing curly brackets.

And here for the robot, we'll insert the variable robot profile image. And we'll

do the same thing for the user. We'll

remove the source attribute and type curly brackets. And we'll

insert the user profile image. So that's

how we import images using Vit and use them. Now let's save

them. Now let's save and we'll check our website.

And now all of the images are loaded.

So, let's try adding a message to make sure this is working. We'll type the message hello and press send.

And that's it. We finished moving our chatbot project into this new React setup.

We'll go back to VS Code.

And the big advantage of this setup is we can separate our code into different files instead of combining everything into one file like we had before. Right

now we already separated our code a bit.

We separated the app component into app.jsx

app.jsx and we separated the code that sets up React into main.jsx.

Now we're going to separate our code even more. So, inside app.jsx,

even more. So, inside app.jsx,

if we scroll to the top, notice that there's many other components in this file, like the chat input component. A best practice is to

input component. A best practice is to separate each component into its own file. This makes our code easier to work

file. This makes our code easier to work with because each file only focuses on one component.

So, let's separate the chat input component into its own file.

First, we're going to go to the source folder and we're going to create a new folder in here to group our components together. So, we'll click this folder

together. So, we'll click this folder and we're going to click this icon to create a new folder and we'll name it components

and press enter.

And inside this components folder, we're going to create a new file for our chat input component. So in here, we'll click

input component. So in here, we'll click it and then click this icon to create a new file. And we'll give it the same

new file. And we'll give it the same name as the component. So we'll name it capital C chat capital I input.jsx

and press enter.

And now we're going to move the chat input component into this file. So we'll

open app.jsx

and we'll select the code for chat input which is down here.

And we're going to cut and then open chatinput.jsx.

And in here we'll paste.

and we'll scroll up and we're going to fix these eslint errors. We'll start

with this one. Use state currently doesn't exist in this file. So, we need to import it again.

Let's go back to app.jsx.

And at the top, let's copy this import.

So, we'll select it and copy.

And we'll go to the chat input file. And

at the top of this, we're going to paste the import.

Now that we imported the use state, we're able to use it and there's no longer an error. Now, eslint also tells us that we're not using use ref or use

effect in this file. So, we can remove these.

Next, we're going to scroll down in this file and we'll see that the chatbot object doesn't exist anymore in this

file. So again, we'll go back to app.jsx

file. So again, we'll go back to app.jsx

and let's move this import. So we'll

select it and chatbot is not used anymore in this file. So this time we're going to cut

and inside chat input at the top we're going to paste that input.

And now we have access to the chatbot.

The last error here is that the chat input component is not being used. To

fix this, we need to review a feature of JavaScript called modules.

By default, any variables or functions that we create in a file only exist in that file. So chat input only exists in

that file. So chat input only exists in this file. It cannot be used outside

this file. It cannot be used outside this file. This helps us avoid naming

this file. This helps us avoid naming conflicts because if we use the same variable name in different files, it won't cause an error. Now, if we want to

use this variable outside of this file, we need to export it first. To do that in front of this function, we can just

type export.

And now this error is gone because ESLint assumes that we're going to use this component outside of this file. So

now let's save.

And to use chat input in another file, we need to import it. So we'll open app.jsx.

app.jsx.

And at the top, we're going to import and type curly brackets. And in here,

we'll import the chat input component.

And we'll import it from a string. And

we're going to locate the chat input file.

At the front, we'll type dot slash to start in the current folder, which is the source folder. And then we're going to go to the components folder.

And we'll type a slash to go into this folder. And we'll locate the file chat

folder. And we'll locate the file chat input.jsx.

input.jsx.

By the way, when importing a JavaScript file or a JSX file, if we're using Vit, we don't have to add.js or JSX at the

end. Vit will actually add this

end. Vit will actually add this automatically. So, as a shortcut, we can

automatically. So, as a shortcut, we can remove this.

Also, a common practice is to import from packages at the top and then JavaScript files and then other types of files. So now we learn how to create

files. So now we learn how to create these imports ourselves using the JavaScript modules feature and the word

export. And we can use chat input in

export. And we can use chat input in this file.

Next, let's move the rest of these components into separate files. First,

we'll move the chat message component.

In the components folder, we'll click it and we'll click this icon to create a new file.

And let's name it the same as the component. Capital C chat, capital M

component. Capital C chat, capital M message.jsx,

message.jsx, and press enter.

And now we're going to move the code over. So we'll open app.jsx JSX and

over. So we'll open app.jsx JSX and we'll select this component and cut.

And then inside chat message.jsx,

we're going to paste the component.

And again, we'll scroll up and fix the ESLint errors. So, first it's telling us

ESLint errors. So, first it's telling us we're not using this component in this file. To fix this at the front, we're

file. To fix this at the front, we're going to export this component so it can be used in other files.

If we scroll down, ESLint tells us that these images are missing. So, we need to move those imports into this file. We'll

go back to app.jsx JSX

and at the top we're going to select these two image imports and we're going to cut and inside chat message.jsx

we're going to scroll to the top and paste.

Now one thing we need to be careful about is that we may need to update these file paths. So now this file is

inside the components folder. That means

dot slash is going to start at the components folder. It's not going to be

components folder. It's not going to be able to find the assets folder anymore.

To fix this at the front, we're going to use dot dot slash.

So just like in the command line, dot dot represents the outer folder. This

means it's going to go out of this components folder and into the source folder. And then it's going to look for

folder. And then it's going to look for the assets folder. It's going to find it and it will go into the assets folder and find robot.png.

And we need to make the same change for the user image. At the front, we'll use dot dot to go out of the components folder into source. And then we can

locate the assets folder.

And now these imports will work correctly. And we finished moving the

correctly. And we finished moving the chat message component into its own file.

Let's save.

And we'll go back to app.jsx.

And we'll move the chat messages component into its own file. Inside the

components folder, we'll click it. We'll

click this icon to create a new file.

And let's name it the same as the component capital C chat capital M messages.jsx

messages.jsx and press enter.

We'll go back to app.jsx JSX and we'll select the code for this component which is till here and we're going to cut.

And inside chat messages we're going to paste.

Let's scroll to the top.

And this component needs use ref and use effect. So let's move those imports into

effect. So let's move those imports into this file. We'll go to app.jsx.

this file. We'll go to app.jsx.

We'll select this import at the top and copy.

And in chat messages at the top, we're going to paste that input.

And in this component, we do not use use state. So we can remove it.

state. So we can remove it.

Let's scroll down. And in this component, we also use the chat message component. So let's import that. We'll

component. So let's import that. We'll

scroll up and at the top, we'll import curly brackets the chat message

component from a string and we'll locate this file using dot slash. So it starts in the current

slash. So it starts in the current folder which is the components folder and we'll look for the file chat message

and remember we don't have to add JSX at the end. Vit can automatically add it.

the end. Vit can automatically add it.

Finally eslint tells us this component is not used in this file. So we need to export it. However we're going to do

export it. However we're going to do something different this time.

Instead of typing export at the front of this function, we're going to scroll down to the bottom and at the end, we're

going to type export default and then what we want to export, which is the chat messages component.

As a review, this is called a default export. It's useful if we want to export

export. It's useful if we want to export one thing from a file. So now let's save.

And to import this, we're going to go to app.jsx.

app.jsx.

And at the top, we're going to import.

And for a default export, we can just type a name without curly brackets. So

we can type chat messages.

We'll import it from a string and we'll type dot slash to start in the current folder. So for this file, we're

current folder. So for this file, we're in the source folder and then we're going to go into the components folder components slash and locate chat

messages.

So this imports whatever the default export is from this file and names it chat messages. This feature is called a

chat messages. This feature is called a default export. When we import and we

default export. When we import and we use curly brackets like up here, this is called a named export.

So some people like using default exports because it encourages each file to focus on one thing. However, it's up to you which style of export you want to

use. You'll also find that some packages

use. You'll also find that some packages use named exports while other packages use default exports.

So, this is just a review of JavaScript modules. If you want to learn about

modules. If you want to learn about modules in more detail, you can check out my JavaScript full course in the video description.

Next, let's fix these last few errors.

So we're not using use ref or use effect in this file anymore. So we can remove these.

And finally, this app component is already in a file called app.jsx.

So we can just leave it in this file.

And usually we put the app component outside of the components folder because app represents the entire application.

It's sort of the most outer component of our application. So it makes sense to

our application. So it makes sense to put it in the outer folder.

So now let's save this file.

And let's make sure that all these other files are saved. And now we'll open our website in the browser and try it out.

And it looks pretty good. Let's refresh

just to be safe. And we'll give it a try. We'll click this text box and type

try. We'll click this text box and type the message hello and press send.

So, it's working correctly just like before. So, we'll go back and now we

before. So, we'll go back and now we separated each component into its own file. And this makes our code easier to

file. And this makes our code easier to work with because each file only focuses on one component and each file contains less code.

The last thing we're going to do in this lesson is to separate the CSS into different files. So, let's open app.css.

different files. So, let's open app.css.

And you'll notice that in here it contains CSS for multiple components.

So, we're also going to separate the CSS so that each component has its own CSS file.

For example, this CSS code is related to the chat input component. So, we'll go to the components folder and click it.

And we'll click up here to create a new file. And we're going to name it the

file. And we're going to name it the same as the component, capital C, chat, capital I input

CSS, and press enter.

and we'll move all the CSS related to the chat input component in here. So in

app.css,

we'll select this code for the send button, the chat input, and the chat input container.

And we'll cut and chat input.css,

we're going to paste that code and save.

And now to load this CSS code, we're going to open chatinput.jsx.

And at the top, we're going to import a string and the CSS file we want to load, which is this one. So we'll type dot slash to

start in the current folder, which is components, and we'll load chat input.css.

input.css.

and save.

As a review, this is a feature of Vit.

If we import a CSS file, it will load all the CSS in the file and apply it to the website.

Next, let's go back to app.css.

And these styles are for the app component. So, it actually makes sense

component. So, it actually makes sense to leave them inside the app.css file.

Below this, these styles are for the chat message component. So, let's create a CSS file for the chat message component. We'll go into the components

component. We'll go into the components folder and click here to create a new file. And we'll name this chat

file. And we'll name this chat message.css

message.css and press enter.

And we'll go back to app.css CSS and we're going to select the styles for the chat message user, the chat message robot, the text, as well as the chat

message profile and cut.

And then inside chat message.css,

we're going to paste the CSS code and save.

And we're going to load this by going into chat message.jsx JSX and at the top we're going to import a string and we'll

import this file using dot slash chat message CSS and save.

We'll go back to app.css.

Finally, these styles are for the chat messages component.

First, we'll create a CSS file for this component. So, we'll click this folder

component. So, we'll click this folder and click here to create a new file and we'll name it chat messages.css

and press enter.

And in app.css,

we're going to select this code and cut.

And in chat messages.css, CSS. We're

going to paste and save.

And we'll load this by opening chat messages.jsx.

messages.jsx.

And at the top, we will import a string.

And we'll locate the file dot slash chat messages.css

messages.css and save.

And finally, we'll go back to app.css

and make sure that we save all of our files.

Now, let's open our website in the browser.

And everything should look and work correctly.

Let's go back to our code.

And that's it. We split up our JavaScript and our CSS code into separate files. And now each component

separate files. And now each component has its own JavaScript file and its own CSS file. This makes our code a lot

CSS file. This makes our code a lot easier to work with because each file is focused on only one component and each

file contains less code.

In the next lesson, we'll use this new React setup to work on a bigger React project, which is an ecommerce website that has multiple pages and more

advanced features. And that's the end of

advanced features. And that's the end of this lesson. In this lesson, we created

this lesson. In this lesson, we created a proper React setup using the command line, npm, and vit. We reviewed the

command line, which lets us give commands to our computer. We reviewed

npm which helps us download and use external libraries or packages. We

learned the create vit package which helps us create a proper React setup. We

moved our chatbot project into the new React setup. We learned how to use

React setup. We learned how to use eslint which highlights problems in our JavaScript code. We reviewed JavaScript

JavaScript code. We reviewed JavaScript modules which lets us separate our code into different files. And we separated

each component in the chatbot project into its own JavaScript and CSS files.

Thanks for watching so far. If you find this course valuable, you can support the channel by liking this video, leaving a comment, and subscribing.

You can also check out the premium version of this course where you'll get all the lessons ads free broken down into small videos as well as additional lessons and more projects that are not

in the public react course. Currently,

the premium course contains 11 lessons and I'll be adding more lessons in the future. You can also get a certificate

future. You can also get a certificate of completion, create comments or questions on specific topics, get progress tracking, search and course

notes. You can also check out the

notes. You can also check out the membership where you can get this course ads free separated by each lesson, AI videos, backend tutorials, and more.

Thanks again, and let's continue with the course. Here are some exercises to

the course. Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to start a bigger project using React and we'll learn an important feature called routing.

By the way, if something in this lesson does not work for you, you can check the troubleshooting guide in the description.

First, let's take a look at the project we're going to build. In our browser, we're going to create a new tab.

And at the top, we're going to go to supersimple.dev/proscommerce.

supersimple.dev/proscommerce.

And we can close these other tabs.

This is an e-commerce project or an online shopping project. We can add products to our cart.

And then we can click here to view our cart.

And this page will display all the products in our cart. It will calculate the total for our order. and it will also calculate a delivery date. And then

we can create an order.

And this page will list all of the orders that we created. We can also click this button to track the order. So

depending on the delivery date, it will show you the progress of the delivery.

And we'll click here to go back to the orders page.

So notice that this project has multiple pages. So, it's much bigger than the

pages. So, it's much bigger than the chatbot project. And we're working with

chatbot project. And we're working with more data than before. So, we have products, we have a cart, and we have orders.

By the way, if you ever need to reset the cart or the orders, you can click this reset button here in the bottom right, and it will reset everything back

to the default data. So, let's click the top left to go back to the main page.

And now that we introduced the project, we're going to build this with React.

We'll go back to VS Code and we'll collapse the chatbot project folder.

And before we create a new React project, let's group these older files into a folder. We'll click this HTML

file and we'll create a folder. And

let's name it React-basics.

and we're going to move all these files into this folder. Now, a shortcut here is to click this file and then press shift on your keyboard and click the

bottom file and it will select all the files between those two and we can drag this into the folder and we'll collapse it. So, that just

helps us stay a little more organized.

Next, we're going to set up a new React project using VIT. To do that, we're going to go to our terminal.

If you have the VIT server running, you can close it by pressing Ctrl + C on Windows or control C on Mac.

So, if you're continuing from the previous lesson, the terminal should be running inside the chatbot project folder. To confirm that, we can run

folder. To confirm that, we can run print working directory or pwd.

And it will tell us that we're inside the chatbot project folder. Now, to set up a new React project, we want to be inside the React-Course folder. So, to

get out of the chatbot project folder, we can run the command cd dot dot.

And if we press pwd, we should be inside the react-course folder. Another way to do this is to

folder. Another way to do this is to just start a new terminal.

Now we'll use vit again to set up a new react project.

In the command line, we'll run the command npx create-ash vit and we'll type at and give it a version. So, you can find the version in

version. So, you can find the version in the description by clicking this link and going to lesson six and you'll find the version of vit that we're going to

use as well as the full command.

By the way, the version that you see in this video might be different than the version you see on your page. You should

always use the version that you see on your page. I did this because it's hard

your page. I did this because it's hard to update the video. So, this lets me easily update the version in the future.

So, select the version on your page.

Copy.

So, I'm going to paste the version here and press enter.

For the project name, let's name it ecommerce- project. Press enter.

project. Press enter.

And from this list, we'll press the down arrow and select React.

And from this list, we'll press down and select JavaScript.

And it will set up a new React project inside our React-Course folder, which we see right here. And now we need to go

into this folder using the command cd ecommerce- project.

And we're going to run npm install to install all of the packages inside package.json.

package.json.

So we'll run npm install.

Once we have everything installed, we can run this project using the command npm rundev.

And now we can open this project using this URL in the browser. So we'll select this URL and copy.

And in the browser, we're going to create a new tab.

And then here we'll paste.

And now we have a new React project.

Before we start updating the code, we're actually going to review a tool called Git. Git helps us track changes in our

Git. Git helps us track changes in our code, and it's useful in bigger projects because we're going to be making lots of changes, and it's easy to forget what we

changed. So, Git will help us track our

changed. So, Git will help us track our changes.

We're going to go to our code and we're going to open the Git section here.

If you already have Git installed, it should say initialize repository. If you

do not have Git installed, you can click this link in the description, go to lesson six, and follow these instructions to install Git.

Once you have git installed, we'll click initialize repository.

Now, a repository is just a folder where git is tracking changes. At first, git will tell us that all of these files or

everything inside our react-ourse folder is new. And that's because a repository

is new. And that's because a repository starts out as empty. So, git considers all of these files as new files.

We'll go back to the git section and we'll scroll up and we're going to save all of these files into git. At the

top, we'll type a message to describe our changes. So, let's type the message

our changes. So, let's type the message add the starting files and press commit.

Commit means we're going to save these changes into git.

Now, you might run into an error when using git and it tells you you have to configure your username and email. To do

that, you can run these two commands in the command line and choose your username and choose the email you want to use and try to commit again. And now

it should work.

If it asks to confirm, you can press yes.

And now git will start tracking any new changes that we make. For example, if we go into our code and open the e-commerce

project and change some of these files, we type test and save.

And in the source app.jsx, we type test and save.

And then we can go to the git section.

And now git will tell us everything that we changed in these two files. So as you can see git helps us track changes in our code.

Also git lets us undo our changes. So to

undo this change we can click this arrow button here.

And to undo all of our changes at the top we can click this arrow button here.

So, that's a review of how Git works. It

can track our changes and it lets us easily undo our changes. Let's go back to our files and remember that in our React setup, we

have a file called.git

ignore. So, now we can learn what this file does.

Git ignore tells git which files and folders to ignore or not to track changes. For example, in this file we

changes. For example, in this file we can see the folder node modules. So this

tells git that if there are any changes inside node modules it will not be tracked. The reason we ignore node

tracked. The reason we ignore node modules is because this folder is very large and none of the changes inside

this folder are changes that we make.

Instead, we generate this folder using a package.json and npm install. So,

package.json and npm install. So,

because this folder is generated, it doesn't make a lot of sense to save this in git. So, that's a review of Git. Git

in git. So, that's a review of Git. Git

helps us track changes in our code and doggit ignore tells Git which files and folders to ignore or to not track changes.

Now we're ready to start the project.

First, we're actually going to download the HTML and CSS for this project. We'll

click this link in the description and then click here.

And this will open GitHub.

And this contains all the HTML and CSS for the e-commerce project. The reason

we're going to use some starting code is because this course is focused on React.

By using this code, we can focus on learning React features rather than spending our time writing HTML and CSS.

If you want to practice HTML and CSS, you can try to recreate the design on your own after this course.

Another reason we're using some starting code is in the real world, we often work on an existing project rather than a new project. So this will give us some

project. So this will give us some practice working on an existing project.

So to download the starting code, we're going to click this code button here and we'll click download zip

and we'll open our downloads folder.

For me, it's here. And we're going to unzip this file. On Windows, we're going to rightclick and click extract all

and extract.

And on Mac, you can just doubleclick the zip file.

And then we're going to open this folder.

And we're going to move all of these files and folders into VS Code. First,

let's go into VS Code.

And we're going to organize all of those files into a new folder. So, we'll click the e-commerce project and create a new

folder.

And we'll name this starting dashcode.

And we'll open our downloads folder again.

And we're going to move all of these files into this new folder. So we'll

select it. And we're just going to drag it into starting code.

And let's save these changes into Git.

So then Git will start tracking any new changes that we make.

We'll open the git section and here we added all of the starting code and at the top let's type the message add the

starting HTML and CSS code and commit.

Let's go back to our files and we're going to go to the starting code and look for index.html and we're going to rightclick this file

and we're going to open with live server.

And you'll see we have all the HTML and CSS for this project. So now we're going to create this using React. We'll start

by creating this main page. We usually

call this the homepage.

By the way, a page or a web page is a single page like the homepage or the cart page. A website is a group of web

cart page. A website is a group of web pages.

To create this homepage, we're going to move all of the HTML and CSS into React.

We'll go back to VS Code and we'll open the starting code index.html.

index.html.

And this file contains the HTML for the homepage. And we're going to move this

homepage. And we're going to move this HTML into the index.html here for the e-commerce project. So,

let's actually drag this index.html HTML and we'll open it at the bottom so we can see these files side by side

and we'll move the HTML in the starting code into our project one by one.

We already have the doc type HTML inside here. So we don't need to move it. And

here. So we don't need to move it. And

we also have the HTML and head elements.

The first thing that we do need to move is this title. So we'll select this title and then cut.

And inside the projects HTML file, let's replace the title here.

And now we'll keep going one by one.

Next, this meta viewport element makes the website look good on smaller screens. Now, we already have this

screens. Now, we already have this inside our React setup, so we do not need to move it over. Let's actually

select this code and delete it so that we can keep track of our progress.

Next, this code loads a font or a style of text called rooto.

We're going to use this font in the e-commerce project. So, we're going to

e-commerce project. So, we're going to move it over. Let's select this code and cut.

And inside our e-commerce project, we're going to paste.

And if you need to, you can fix this spacing by selecting these lines and press shift tab a few times.

Next, these lines of code load the CSS for our project. Now, remember, when using VIT, we actually import our CSS files.

So, we're not going to move these over for now, but we'll keep these for later.

Finally, if we scroll down, the HTML inside the body creates the contents of the page. Now, the contents of the page

the page. Now, the contents of the page should be created by React.

So, let's move this into a React component.

First, we'll create a component for the homepage. So, we'll scroll up to the

homepage. So, we'll scroll up to the source folder and we'll click this folder and we'll create a new file.

Usually, we create a component for each page of the website. So, let's name this file capital H home capital Page.jsx.

Now, this website has multiple pages.

So, let's create a folder to group all the pages together. We'll create a folder and we'll name it pages.

And we're going to move the homepage into the pages folder.

And now let's create a component for the homepage using function. and we'll name it capital H home capital P page

brackets and curly brackets and we're going to return brackets we're going to return the HTML for the

homepage which is right here. So we're

going to copy all of this HTML into our new component. So, one trick we can do

new component. So, one trick we can do is on the left, we're going to click this arrow to collapse this element. And

we're going to click this arrow to collapse this element as well. And now

we can select all of this HTML code and cut.

And inside homepage.jsx,

we're going to paste that code.

And now we're going to scroll up and fix all of these errors.

First, if we collapse this code and collapse this element, you can see we're returning two elements from this component.

But remember, we can only return one element from a component. To fix this, we can wrap this in a fragment. So, at

the top, we'll create a fragment using less than, greater than, and delete this closing tag. And at the bottom, we'll

closing tag. And at the bottom, we'll create the closing tag less than slashgreater than. And let's also fix

slashgreater than. And let's also fix the indenting here. We can select all of this code and press tab a few times until there's an indent before the

fragment. And for the first line, we're

fragment. And for the first line, we're going to remove an indent. And that will fix the indenting.

Next, we'll fix these errors. We'll

expand these elements.

And remember in React, we have to use class name instead of class. So to fix these errors, we need to change all of these to use class name. To do that, we

can press CtrlF on Windows or command F on Mac to find some code. And we're

going to search for the code class equals. And then we're going to click

equals. And then we're going to click this arrow on the left. And this will open the replace menu. So this lets us replace class equals with something

else. We'll replace it with class

else. We'll replace it with class capital N name equals and then press this button to replace all.

And now you'll see that we fixed all of the ESLint errors. Finally, we're going to scroll to the top and we need to export this component so we can use it

in other files. At the front, we'll type export and save.

So, we moved all the HTML from the homepage into our component and we fixed all these errors. Now, let's use this component in our app. We're going to go

to app.jsx JSX

to app.jsx JSX and we'll remove this default HTML.

So we'll select it and delete it and we'll insert our homepage component.

First we need to import it.

at the top. We'll import curly brackets the home page from a string and we'll locate this

file. So, we're going to type dot slash

file. So, we're going to type dot slash to start in the current folder which is the source folder and we'll go into pages slashhome

page.

And now we'll insert the homepage into our app. So here we'll type less than

our app. So here we'll type less than homepage slashgreater than. And next we'll fix

slashgreater than. And next we'll fix these eslint errors. The react logo and vit logo are not used anymore. So we can

remove them.

Count and set count are also not used anymore. So we can remove them.

anymore. So we can remove them.

and use state is not used anymore. We

can remove this as well and save.

And now let's make sure that we saved all of our other files. So we'll open index.html and we'll save it.

And let's open the starting code index.html and we'll save this file.

And now let's take a look at our website. We'll open the browser.

website. We'll open the browser.

And we can close GitHub for now. And

we'll open the e-commerce project.

And you'll see that we have the HTML and the text for the e-commerce project homepage.

Now, obviously, this doesn't look very good. So, let's move over the CSS. Next,

good. So, let's move over the CSS. Next,

to move the CSS into our React project, we're going to go back to our code and we're going to open the starting code index.html.

code index.html.

And here we're going to scroll up and we load three CSS files. So, we're going to move these three files into our React

project. We'll start with general.css.

project. We'll start with general.css.

If we open styles/shared which is here and shared and open general.css

general.css and this file contains CSS for the overall website. CSS for the overall

overall website. CSS for the overall website goes into the index.css file in React.

So we'll click general.css CSS and we'll press control A on Windows or command A on Mac to select all of this code and

we'll copy and index.css in the e-commerce project

and index.css in the e-commerce project we're going to remove all of this default code and paste

and save.

And now if we go back to the starting code, we've moved over general.css and

we can delete this file.

And now we'll go back to the starting code index.html.

code index.html.

And we can remove this line.

And we'll move header.css and index.css

into our React project. So both of these style the homepage. So, we'll just move these files beside our homepage component.

First, we'll go into styles, shared, and header.css,

header.css, and we're going to drag this file into our pages folder.

So, we keep our CSS beside the component that it styles.

And we'll scroll down and find styles/pages.

And we'll move index.css CSS beside the homepage as well.

So header.css styles the header at the top of the page and index.css

styles the main part of the homepage.

Now a best practice is to use the same name as the component here. So we'll

rightclick index.css CSS and we'll rename it capital H home capital P page.

Next, to load these styles, we need to import them. We'll open homepage.jsx

import them. We'll open homepage.jsx

and at the top, we're going to import a string and we'll import the file dot /

header.css. CSS

header.css. CSS

and we'll also import a string slashhome page.css

page.css and save.

And now if we go back to the starting code index.html, we moved all of the HTML and CSS into

our project. So now we can delete this

our project. So now we can delete this file.

Finally, we'll open app.css.

And these styles were for the default React website. So we don't need these

React website. So we don't need these anymore. So we can select all of the CSS

anymore. So we can select all of the CSS and just remove it and save.

So make sure that we saved all of our files. And now we're going to view the

files. And now we're going to view the website.

And now it's looking really good. We

have the structure and the styling that we need. The only thing that's missing

we need. The only thing that's missing are the images. So let's move the images next.

To move the images, we'll go back to VS Code and we'll go to the starting code and find the images folder. So this

contains all the images that we need.

So, we're going to move this into the React project.

Now, usually we put images in the assets folder and then we import the images.

However, to save time, we're going to move this folder into the public folder.

So, we're going to move it up here and into the public folder.

The reason we move it into the public folder is because if we look at homepage.js, jsx and we look at an image. Notice the source attribute

image. Notice the source attribute starts with images slash. When using

vit, if we start with a folder name like this, vit will look for this inside the public folder. So, it finds it here. So,

public folder. So, it finds it here. So,

by moving our images into the public folder, we don't have to change any of this code and it just saves time in the video. We can move these images into the

video. We can move these images into the source/assets folder and import them later as an exercise.

So now let's open our website and all of the images are loaded. So

that's how we move an HTML website into a React website. We just move over the HTML, CSS, and images one by one.

Let's go back to VS Code and we'll save our changes into Git. We'll open the Git section. And here we moved all the HTML,

section. And here we moved all the HTML, CSS, and images for the homepage. We're

going to type a message at the top. Move

the home page into React and press commit.

Next, we're going to move the checkout page to the React setup. We'll go to our browser and we're going to open the final

project at superimple.dev and we're going to click the cart icon in the top right.

This will open the checkout page where we can see our cart and we can place an order. So notice that this is a separate

order. So notice that this is a separate page from the homepage and this page is also on a different URL/checkout.

So how do we create multiple pages in React? To do that, we're going to learn

React? To do that, we're going to learn a feature called routing. Routing lets

us create multiple pages in React.

Let's go back to our code and we'll open our files here.

and we're going to scroll down first to the starting code folder.

So, normally to create multiple pages, we need to create multiple HTML files like here. Each page has its own HTML

like here. Each page has its own HTML file like the checkout page and the orders page. However, inside these

orders page. However, inside these files, notice that there's a lot of repeated code. So, each file has the doc

repeated code. So, each file has the doc type. it has some meta and link elements

type. it has some meta and link elements and in the orders.html it has the same meta and link elements.

So this is not great because if we want to change something on one page we have to change all of the pages. On the other

hand, routing lets us create multiple pages using one HTML file, and this lets

us reuse our HTML code. To use routing, we're going to install an MPM package called React Router. So, let's reopen

our terminal. You can click here and

our terminal. You can click here and drag up or press control J on Windows or command J on Mac to open this terminal.

Now we currently have the Vit server running. So we'll press control C on

running. So we'll press control C on Windows and Mac to stop the V server.

And to install React Router, we're going to run the command npm install react-rowout.

And we'll also type at. So for this video, we'll use a specific version of React Router just to make sure that it works with the video. So click this link

in the description, go to lesson six, and here you'll find the version of React Router that we'll use, and you'll also find the full command. So again,

you should always use the version that you see on your page.

So select the version on your page and copy it. And then in our command line,

copy it. And then in our command line, we're going to paste that version and press enter to install.

So now, how do we use React Router? Like

most packages, React Router has a documentation page that tells you how to use it. You can find the documentation

use it. You can find the documentation in the description, but for the video, I'm going to show you the parts of the documentation that we need. According to

the documentation, to use React Router, we need to load it when we render the app component.

So, in our project, we're going to scroll up and open main.jsx,

and I'll close these other files so we can see more of the code.

So, in this file, we set up React. We

render our app component on the page.

According to the documentation, we need to wrap this in a component called browser router.

So at the top first we're going to import curly brackets the browser router

from a string and we'll import it from the package react router.

As a review, if we just start with a name like this without dot slash, this means it's going to load it from node modules from the React router package.

And now around the app, we're going to create less than browser router greater than.

And we're going to put the app inside here. So we'll cut this

here. So we'll cut this and paste it in here.

Let's save.

Next, we need to do a bit more setup.

According to the documentation, inside our app component, we need to add a component called routes.

So, let's open app.jsx.

And at the top, we're going to import curly brackets the component routes

from a string. And we'll import this from the package react-outer.

And inside this component, we're going to insert the routes component using less than routes greater than.

So the routes component tells React all the pages that are in our website. So to

add a page to our website, we're going to use another component called route. A

route is basically a page.

So first we need to import that at the top. We're already importing from React

top. We're already importing from React Router. So we're going to add a comma

Router. So we're going to add a comma and import the route component.

So inside routes, we're going to add less than route greater than. So again,

a route basically adds a page to our website.

And we're going to give this route two props. The first prop is called path

props. The first prop is called path equals double quotes. This tells React the URL path of this page.

The URL path is the last part of the URL like /checkout or slash orders. So first

let's add the homepage. For the

homepage, the URL path is empty.

To set the URL path as empty, we're going to set it to slash.

And then we're going to give route a second prop called element equals curly brackets. So this tells React which

brackets. So this tells React which element or component to display when we go to this URL path for the homepage. We

want to display this homepage component.

So let's select it and cut.

And inside here we're going to paste.

So this tells React that when we go to the URL path slash or empty, it's going to display our homepage. So let's try it

out. We'll save this file

out. We'll save this file and then inside the terminal, we're going to start the VIT server using npm rundev.

And we'll visit this URL.

I already have it open. So I'll open my browser.

And now if the URL path ends with slash or empty, it's going to display the homepage.

Next, let's use React Router to add a checkout page. We'll go back to our code

checkout page. We'll go back to our code and to add another page to our website, we're going to use the route component

again. So, we'll create less than route

again. So, we'll create less than route greater than and we'll give it two props. the path equals double quotes.

props. the path equals double quotes.

And for the checkout page, we'll set the URL path to checkout.

This means this page will be displayed when we go to /checkout.

And we'll give it another prop element equals curly brackets.

And right now, we didn't create a component for the checkout page yet. So

let's just create a div here just to make sure that this is working. So we'll

create a div element and inside let's type test checkout page and save.

So now if we go to our project and in the URL path we're going to go to slash checkout and press enter.

It displays the div with the text that we created.

So, as you can see, routing is actually pretty simple. We just tell React which

pretty simple. We just tell React which pages we want in our website and then what to display for each page.

Now, let's learn some more details about routing. If we look at our code, we now

routing. If we look at our code, we now have multiple pages in our website. And

all of these pages use one HTML file which is index.html.

So this HTML is shared between all of our pages and this reduces repetition.

By the way, this is called a single page application or an SPA. This means we only have one HTML file and instead we

use React to create multiple pages.

Next, we'll use some shortcuts with React Router. The first shortcut is

React Router. The first shortcut is instead of path equals slash, React Router has a prop for this called index.

So, this does the same thing as path equals slash. The second shortcut is

equals slash. The second shortcut is currently we don't have anything inside these route components. So, we can use the self-closing element shortcut. We'll

remove the closing tag.

And at the end here, we'll add a space and a slash. And same thing here, we'll remove the closing tag.

And add a space and slash and save.

And now we'll save these changes into Git. We'll open the git section.

Git. We'll open the git section.

And here it tells us we installed React Router.

And in app.jsx jsx. We added some routes or some pages to our website. In

main.jsx,

we loaded the React router. So, let's

create a message to describe these changes. Create multiple

changes. Create multiple pages using React-Router and commit.

Now, let's move the checkout page into our app. We'll go back to our files

our app. We'll go back to our files and first we'll open app.jsx.

And instead of displaying a div when we go to / checkout, let's remove it.

And let's create a component for the checkout page. Just like the homepage in

checkout page. Just like the homepage in the pages folder, we'll click this and we'll create a new file and we'll name

this capital C checkout capital P page.jsx.

page.jsx.

And inside here, we'll create a new component using function checkout page brackets and curly brackets. and

we'll return brackets and we'll move the HTML for the checkout page in here. So, we'll go to the

starting code folder and we'll open checkout.html.

So, this is the HTML file for the checkout page.

We're going to scroll down to the body element first and we're going to move over this HTML.

So we'll click here to collapse this code and click here to collapse this code as well and we'll select all this

HTML and we'll cut and then inside checkout page inside the return we're going to paste

and let's scroll up and we'll fix these errors.

So first if we collapse these two elements remember we're returning two elements from this component which causes an error. To fix this we'll wrap this in a fragment

and we'll fix the indenting. Now you can fix it manually like we did before but you can also use this shortcut. We can

press controlshiftp on Windows or commandshiftp on Mac and this will open up a list of commands that we can use in VS Code. So we're going to search for

VS Code. So we're going to search for the command format document and we can click it or press enter and it will automatically format the

code in this document and fix the indenting.

Next, if we expand these elements, remember in React, we have to use class name instead of class. To replace these,

we'll press control F or command F to find code. And we'll find the code class

find code. And we'll find the code class equals and click this arrow. And we're

going to replace it with class name equals and click replace all.

And finally the last eslint error here is this component is not used in this file. So we need to export it

file. So we need to export it and save.

And now let's use this component in our route. We'll open app.jsx JSX

route. We'll open app.jsx JSX

and at the top we'll import the page using import curly brackets the checkout page

from a string and we'll import dot slash pages slashcheckout page

and we'll use it inside this route using less than checkout page slashgreater and save.

And now let's check our website.

And if we go to the path /checkout, you can see we have the HTML for the checkout page.

Now, let's add the rest of the code for the checkout page. We'll go back to VS Code and we're going to go to the starting code and open checkout.html.

and we're going to move this over one by one. So, first, what do we do for this

one. So, first, what do we do for this title? Right now, all of our pages are

title? Right now, all of our pages are sharing one HTML file here. So, all of the pages have the same title,

e-commerce project. However, we want

e-commerce project. However, we want each page to have a different title. So,

how do we do that? Well, in React, it's actually pretty simple. We just have to take this title and move it into our page component. So, we'll select this

page component. So, we'll select this and cut.

And then we'll scroll up and open checkout page.jsx.

checkout page.jsx.

And if we want this page to have a different title, all we have to do is to paste the title at the top and save.

So, if we look at our website now, the checkout page has the title checkout in the tabs. So, we'll go back to our code.

And we're also going to set the title in the homepage. So we'll open the

the homepage. So we'll open the homepage.

And in the homepage, let's create a title.

And we're going to set the title to ecommerce project and save.

And now we can scroll down to the index.html HTML and we can remove this title because we're going to set it using React

and save.

And now let's move the rest of the HTML in the checkout page.

If we scroll down here, these meta and link elements have already been moved to index.html.

index.html.

So this is being shared across all of our pages. So, we actually don't need to

our pages. So, we actually don't need to move this over anymore because it's shared. So, we can remove all of this

shared. So, we can remove all of this code.

And finally, we're going to move over the CSS for this page for general.css.

for general.css.

Remember that we already copied these styles into index.css,

so we don't need to move this anymore.

And now we'll just move checkout header.css CSS and checkout.css into our

header.css CSS and checkout.css into our React project.

So, we'll go to styles/pages/checkout and we'll move checkout header.css

into the React project into here and scroll down. And we'll also move checkout.css CSS into our React project

checkout.css CSS into our React project beside the component.

And now that we moved everything over, we can delete the checkout.html file.

So, we can delete this file.

Finally, let's scroll up and we're going to rename the CSS file to match the component name. So, we'll

rightclick and rename.

checkout page.css.

And now we'll load these two CSS files using import. So in checkout page.jsx

using import. So in checkout page.jsx

at the top, we'll import a string and we'll import the CSS file slash checkout- header.css.

header.css.

And we'll also import dot slashcheckout page.css

page.css and save.

We'll go to our website.

And now everything looks really good. So

we finished moving all the HTML and CSS for the checkout page into our React project.

Let's go back to our code and we'll save these changes into git. We'll open the git section and in app.jsx

we use the checkout page component for /checkout and then we moved over the CSS files and in here we moved over the HTML code as

well as the title. Let's type a message to describe these changes.

move checkout page into React and commit.

Before we continue moving pages, there's an issue that we need to fix. If we open the website and click the top left icon,

normally this should take us to the homepage, but now it's blank. So why is this not working? Notice in the URL the path is /index.html.

Before this website was split up into multiple HTML files and index.html created the homepage.

But now we're using routing. So we set the URL paths ourselves. In our project we set the path slash to be the

homepage. and we set the path /checkout

homepage. and we set the path /checkout to be the checkout page. So, we need to go into our code and update all of the

links to go to the correct URL path.

We'll go back to VS Code.

And to update all of our links, we're going to go to the search section of VS Code. We can press control shift F on

Code. We can press control shift F on Windows or commandshift F on Mac.

And here we can search inside all of our files. First, let's search for the code

files. First, let's search for the code index.html.

index.html.

This will give us a list of a elements or link elements.

And href means where these links should go. So now instead of index.html,

go. So now instead of index.html, these links should go to slash. To

replace index.html HTML in all these places. We can click this arrow on the

places. We can click this arrow on the left to open the replace menu. And we'll

replace this with slash. And then click here to replace all. And confirm.

And let's replace the links for the other pages as well. So up here, we'll also search for checkout.html.

And in this search result, we have a link element with the href checkout.html.

checkout.html.

And in our router, we set the URL path for the checkout page to /checkout.

So we'll replace all of these with slashcheckout and replace all.

And we'll do the same thing for the orders page, which is orders.html.

And here we'll change it to slash orders and replace.

And finally, we also have a tracking page. So here we're going to search for

page. So here we're going to search for tracking.html and replace it with slash tracking and

replace all.

And now all of our links should work correctly because they match our router.

If we open the website and at the top we change the URL path to /checkout it opens the checkout page. If we click

the top left icon this should now go to the URL path slash or empty and it will open the homepage.

So let's save this into Git. We'll open

the git section and we just updated all the links in these files to match the router.

Let's type the message update links to match the router and commit.

Next, let's move the orders page into our React project. Feel free to pause the video if you want to try it yourself first. So, we'll go back to our files

first. So, we'll go back to our files and first let's create a component for the orders page. Inside the pages

folder, we'll create a new file and we'll name it orders page.jsx

and press enter.

And inside here we'll create a component function orders page brackets and curly brackets.

And we'll return brackets and we'll move over the HTML. So we'll

go back to the starting code folder and open orders.html.

open orders.html.

We'll start with the body. So we'll

scroll down and we can collapse these two elements and we'll select the HTML and cut

and inside the orders page inside the return we'll paste.

We'll scroll up and collapse these elements and we're going to wrap these in a fragment less than greater than and

remove this. and at the end less than

remove this. and at the end less than slashgreater than.

And to fix the indenting, we can use the shortcut control shiftp or commandshiftp and search for the command format

document and press enter.

Again, we need to rename class to class name. So, we'll press control F or

name. So, we'll press control F or command F to find code. We'll search for class equals. Click here and replace it

class equals. Click here and replace it with class name and replace all.

And finally, at the top, we'll export this component.

Let's save this file.

Let's go back to orders.html.

Scroll up and we'll move over this code.

So, for the title, we're going to move it into the component. We'll select it, cut, and at the top in orders page,

we're going to paste it at the top.

Let's go back to orders.html.

And these meta and link elements are already inside index.html.

So, we can remove this.

And finally, we'll move the CSS files over. So, general.css CSS was already

over. So, general.css CSS was already moved into index.css.

We already moved over header.css up

here. So, we just need to move the orders.css.

orders.css.

So, inside starting code, we'll go into styles/pages and we'll move this orders.css file.

So, we'll move it up here beside the orders page component.

And now we moved over everything inside orders.html.

orders.html.

So we can scroll down and delete this file.

Next, we should rename orders.css

to match the component name. So we'll

rightclick and rename orders page.css.

orders page.css.

And finally, we'll load the CSS files.

So, in orders page.jsx

at the top, we're going to import a string. And remember, this requires the

string. And remember, this requires the header and the orders page CSS.

So, first we'll import dot slash header.css.

header.css.

And we'll also import dot slash orders page.css. CSS and save.

And now we moved over all the HTML and CSS for the orders page.

So now let's create a route for this page. We'll go to app.jsx.

page. We'll go to app.jsx.

And first at the top we're going to import curly brackets the orders page

from a string. and we'll locate dot slashpages slash orders page and then down here we're going to add another

route. So at the end we'll add less than

route. So at the end we'll add less than route greater than and we can remove this and use the self-closing element

shortcut and we'll give it two props. We'll set

the path equals double quotes and we'll put the orders page on the path slash orders and we'll give it an element to display

equals curly brackets. And for the orders page, we'll display the element less than orders page slashgrater than

and save.

And now let's view the website. We'll

open the website and on the homepage we're going to click this orders link to go to slash orders

and it displays the orders page. So that

looks pretty good. And now we finished moving the orders page into React.

So let's go back to VS Code.

And in the starting code, there's one more page to move over, which is the tracking page. But I'll leave this as an

tracking page. But I'll leave this as an exercise.

So now let's save these changes into Git. Open the Git section.

Git. Open the Git section.

In app.jsx, we added a new route for the orders page and we moved over the CSS and the HTML.

So we'll type the message move orders page to React and commit.

Next, we're going to separate our page into smaller components.

For example, if we look at our website, notice that on the orders page, there's this header at the top. And if we click the top left and go to the homepage, we

have the same header at the top of the page. So, it's a good idea to separate

page. So, it's a good idea to separate the header into a component so we can reuse it between these pages. We'll go

back to VS Code and we'll open our files and we're going to open homepage.jsx.

And at the top here, we have the HTML for the header. If we collapse it, this is all the HTML for the header.

Let's separate this into a shared component.

Now, because this component is shared between multiple pages, we usually put shared components in a folder called components. So, inside our source

components. So, inside our source folder, we're going to click it and create a new folder and we'll call it components.

So the components folder is for shared components and the pages folder is for components that are specific to a page.

Inside the components folder, we'll create a new file.

And let's name it header.jsx.

And in here we'll create a component for the header using function header brackets and curly brackets. And

we'll return brackets.

And we'll move over the HTML.

So we'll open homepage.jsx JSX

and we're going to select the HTML for the header and cut inside header.jsx.

inside header.jsx.

Inside here, we're going to paste.

And we'll fix the indenting by pressing control shiftp or command shiftp and search for format document and press

enter.

And we'll scroll to the top. And lastly,

we're going to export this component to remove this error.

Next, we should also move over the CSS for the header. Now, luckily the CSS for the header has already been separated into header.css.

into header.css.

So, we can just move this over to beside the component.

So, we want to keep the CSS close to the component so it's easy to find. So at

the top of this we can import the CSS using import a string and we'll import dot slash header.css

and save.

So now that we created this header component, we can reuse it in the homepage and the orders page. We'll open

homepage.jsx.

And at the top first, we don't need to import the header anymore. It's already

done by this component. So we can remove it. And let's import the component using

it. And let's import the component using import curly brackets. The header

from a string.

And now we need to locate this file. So

currently we're inside the pages folder.

So we need to get out of this folder using dot dot slash and then go into the components folder. components slash

components folder. components slash header.

And now we'll use this component in the HTML. So down here

HTML. So down here we'll insert less than header slashgreater than and save.

So now this HTML is a bit easier to work with because we split it up into smaller pieces. Let's do the same thing with the

pieces. Let's do the same thing with the orders page. We'll open the orders page.

orders page. We'll open the orders page.

jsx and at the top we don't need to import header.css CSS and instead we'll import

header.css CSS and instead we'll import curly brackets the header component from a string and we'll locate dot dot slash

components slash header and down here instead of this HTML we can remove this and just use the

component less than header slashgrater than this helps us reuse and save a lot of code. Let's save

of code. Let's save and then view the website.

The header looks good in the homepage.

And if we click here to go to the orders page, the header also looks good in the orders page. So, we're able to reuse the

orders page. So, we're able to reuse the header component.

Next, there's a small issue with the header. when we click a link like this

header. when we click a link like this link in the top left, it actually reloads the page when we go to another

page. So by default, link elements or a

page. So by default, link elements or a elements reload the page. Now this made sense before when our website had

multiple HTML files. To go from one file to another file, we have to reload the page. However, now that we're using

page. However, now that we're using routing and a single page application, we don't have to reload every time, we can just use JavaScript to switch

between pages.

To do this, React Router provides a component called link. So, we'll go back to our code

and we'll open the header component and at the top we're going to import curly brackets

the link component from the package react-rowout.

So, the link component lets us go to another page without reloading.

To use it, we just have to replace our link elements or a elements with this link component. So here, let's replace

link component. So here, let's replace this with link and at the end slash link.

And also instead of the href attribute, the link component uses a prop called

to. So this will link to this page.

to. So this will link to this page.

Let's scroll down and in the header we have two other links, the orders link and the cart link. So we'll switch both of these as

link. So we'll switch both of these as well. So here we'll switch it to link

well. So here we'll switch it to link and slashlink and we'll switch the href to two.

And finally, switch this to link and slashlink and switch href to two and save.

And now let's open our website to try it out.

If we click this link to go to the orders page, you'll notice it's a little bit faster because now it's using JavaScript to essentially display a

different page without reloading.

So when using React Router, we should use the link component instead of the A element because the link component lets

us go to another page without reloading.

Now let's save these changes into git.

We'll go to the git section and here we split up the header into a separate component. And then inside the

separate component. And then inside the header, we switch to using the link component to switch between pages.

Let's type the message split header into a component

and use link and commit.

In the next lesson, we'll add a backend to this project and make it interactive.

So, we'll be able to display a list of products and add products to a cart and create an order. And that's the end of this lesson. In this lesson, we started

this lesson. In this lesson, we started the ecommerce project using React and Vit. We reviewed Git, which helps us

Vit. We reviewed Git, which helps us track changes in our code. We learned

routing, which lets us create multiple pages in React. We created the homepage, the checkout page, and the orders page

in React. We updated all the links to

in React. We updated all the links to work with routing, and we separated the header into a component.

Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to start making our e-commerce project interactive and then we'll learn how to use a backend with this project.

By the way, if something in this lesson does not work for you, you can check the troubleshooting guide in the description.

First, if we look at our website, currently we only have three products on this website, but in the final project,

we have a lot more products. So, we're

going to add all of these products to our website. So, let's go to the code

our website. So, let's go to the code for the homepage.

We'll open our code and go to the files and we're going to find the pages folder and open homepage.jsx.

So this component represents the homepage. And we're going to scroll down

homepage. And we're going to scroll down and find the element with a class product-container.

And we're going to click here to collapse this element. And we're going to collapse this other product container. and this other product

container. and this other product container as well.

Each product container represents one product on the page. To add more products, we could make a copy of this code and add each product manually.

However, that would be very repetitive.

Instead, we can generate this HTML using React. We already learned this technique

React. We already learned this technique in the chatbot project where we generated a list of chat messages on the page. So, we're going to review how to

page. So, we're going to review how to generate the HTML.

First, we need to save the data for these products in our JavaScript. To

save time, I already did this. So, if we go to our files and we go to the starting code folder and we open this data folder inside

products.js, JS I already saved the data for the products in this array. So we

can just use this as our data.

Each object in the array represents one product. So it has a name, an image, and

product. So it has a name, an image, and a price and some other details. The next

step is to use this data to generate the HTML. We'll go back to the homepage

HTML. We'll go back to the homepage and first we're going to import that products array. So at the top we're

products array. So at the top we're going to import curly brackets the products array from a string and we're

going to locate that file. So first we need to get out of the pages and source folder using dot dot dot slash and then we'll find the starting code folder and

the data folder. starting dashcode slash data slash and the products file.

Next, we're going to loop through this products array. So, at the bottom here

products array. So, at the bottom here above these product containers, we're going to insert using curly brackets the

products array dot map and brackets. And

we're going to give map a function brackets arrow and curly brackets.

As a review, do map takes each value in an array and transforms it. In this

parameter, we get each value in this array, which is a product.

So again, a product is just this object and it has some details about the product inside.

So, we'll go back and we're going to transform this product object into this HTML.

To do that, we're just going to copy this HTML and inside map, we're going to return brackets

and paste that HTML.

And to fix the formatting, we're going to press control or commandshiftp and then search for format document

and press enter.

And let's scroll up.

And remember, whenever we loop through an array like this, we need to give each element a key prop equals curly brackets. So the key helps React keep

brackets. So the key helps React keep track of changes in this array. Now the

key has to be unique. So looking at the data, each product has a unique ID property.

So we'll go back and we're going to use the product. ID as the key. So this

the product. ID as the key. So this

basically takes each product object and transforms it into this HTML.

So now let's save and we'll check the website.

And as you can see, we took each product and transformed it into some HTML.

Now, obviously, we don't want the product to be socks every time. So,

let's insert the details of each product. We'll go back to our code, and

product. We'll go back to our code, and instead of displaying the socks every time, we're going to remove this. and

insert.

And each product object has a name property. So we'll insert the

property. So we'll insert the product.name.

product.name.

And let's also replace the product image. So instead of showing the socks

image. So instead of showing the socks image every time, we'll remove this and we'll insert the product.

Property.

Next, we'll insert the ratings. The way

this works is that each rating has an image. And we just have to multiply the

image. And we just have to multiply the rating by 10 to get the image name. So

for this one, we're going to put open curly bracket and close curly bracket around this value. And we're going to change this to a template string using

back ticks and back ticks. And then

instead of 45 every time, we're going to insert. And remember for template

insert. And remember for template strings to insert we use dollar curly brackets. So in here we're going to

brackets. So in here we're going to insert the product dot rating dot stars and then multiply it by 10. And this

should give us the ratings image that we need. Next we're going to replace the

need. Next we're going to replace the rating count. So curly brackets and

rating count. So curly brackets and we'll insert the product.

count.

Next, we'll insert the price. So,

instead of this price every time, we'll insert the product dot price sets. And

we usually save money in cents because many programming languages have trouble calculating decimal numbers. Now, when

we display it on the website, we want to display it as dollars. So to convert this back to dollars, we're going to

divide by 100 since $1 is equal to 100.

And that's it. We inserted the details of each product into this HTML.

This is the same technique that we used in the chatbot project, except our data is just a little more complicated. Now,

let's save and check the website.

And now we have a list of different products on the page and we generated the HTML for these products. Now there

is a small problem here which is for these socks it's showing the price 10.9 but usually for price we want to show 10.90.

To fix this, we'll go back to our code and we're going to scroll down to where we insert the price. And to force this to show two decimals, we're going to

wrap this in a open bracket and a closed bracket. And then outside of this

bracket. And then outside of this bracket, we'll use the method dot two capital Fixed and brackets.

So this converts the number into a string and inside these brackets we can tell it how many decimals to show. So

we'll put two and save.

Now if we check the website all the prices show two decimals. So

that's a review of how to generate the HTML using some data. Let's go back to our code.

And now that we're generating all this HTML, we can scroll to the bottom and remove this default HTML that we had

before and save.

And now let's save these changes into git. We'll go to the git section and at

git. We'll go to the git section and at the top we'll use a message generate the

HTML for the home page and commit.

Now, we're going to take this project to the next level and go beyond what we did in the chatbot project. We're going to add a backend to this project. So, first

we'll learn what a backend is and why we use a backend. So, right now, if we look at our files, notice that all the products are saved

in a file on our computer called products.js. JS.

products.js. JS.

The problem with this is an e-commerce website or an online shopping website might have thousands of products and it does not make sense to save everything

on our computer or on the customer's computer. We might not have enough space

computer. We might not have enough space on our computer. So, what the company or the store does is they set up another

computer in their office or in what we call a data center. And this computer saves all the thousands of products that they offer. And then when we visit the

they offer. And then when we visit the website, this computer sends us only the products that we need to display. So

this computer is called the backend.

It's just another computer that's owned by the company and it manages all the data.

Here's another example of why we use a backend. Later in this course, we're

backend. Later in this course, we're going to add products to a cart. So,

where do we save this cart? It does not make sense to save the cart on the customer's computer because if the customer uses a different computer to visit the website, they would no longer

have access to their cart. Instead, we

save the cart in the back end as well.

When they access the website, the backend sends the cart to the website.

So, the back end also lets us share data between computers.

So again, the backend is another computer that manages the data. And this

is how a React website works in the real world. We usually contact a backend to

world. We usually contact a backend to get the data. So we're going to practice that in this course. We're going to learn how to add a backend and then we're going to learn how to use the

backend in React. So you can see how we use React in the real world.

Now that we learned what a backend is and why we use a backend, let's add a backend to our project. We're going to click this link in the description. Go

to lesson 7 and click this link to open the backend code.

And this is a backend that we can use with our project. I called it the e-commerce backend AI because this was built with AI. And I show you how to do

that in another video. But for this video, I recommend downloading this version to make sure it works with a video. You can try to recreate the back

video. You can try to recreate the back end as an exercise. So, we're going to click this code button here and we'll click download zip.

Once that finishes downloading, we're going to open the downloads folder. So,

for me, it's right here. And then we're going to unzip this. On Windows, we're going to rightclick the file and then click extract all.

And on Mac, you can just doubleclick the zip file.

Then we're going to move this back end into our project. So we'll open our code.

And then we're just going to drag this folder into our project. But first, I'm going to collapse these folders for now.

And we're going to drag this folder to the outside and click copy folder so that the backend code is right beside

our website. By the way, we call the

our website. By the way, we call the website or what the user interacts with the front end.

We're also going to rename this folder.

So, right click and rename.

and we'll just rename it the e-commerce backend to make it easier to understand.

Next, we're going to start this backend.

So, we're going to go to our terminal or our command line and we'll click here to create a new tab. And then in here, first we're going to change directory

into the e-commerce backend folder. So,

we'll cd ecommerce dashbackend.

So now the command line is running inside this folder and the process for starting the back end is very similar to the website or the front end. So first

we're going to npm install to install all the npm packages that we need and then we'll run npm rundev to start

the back end.

So, this tells us the back end is running on port 3000, which is localhost col 3000. To test it, we're going to go

col 3000. To test it, we're going to go to our browser, and at the top, we're going to create a new tab, and we're going to go to

localhost col 3000 /s.

And the back end should send back some data.

And this is actually the data for the products.

I can also click this checkbox here to show it in an easier to read format. And

you can see this is the same products array that we were using before except this is coming from the back end. So the

way a backend works is when we access the backend using a URL, it will send back some data. So this is working.

So now let's go back to our code and we'll save these changes into git. Open

the git section and we'll use the message add ecommerce backend and commit.

Next we're going to learn data fetching.

Data fetching means to get data from the back end using our code. So, first we're going to go to our files and let's go

back to the e-commerce project. And

we're going to open our homepage, which is right here.

And we'll scroll to the top. And one way to fetch data or to get data from the back end is to use the function fetch

and brackets.

So fetch is a built-in function. It's

provided by JavaScript.

between the brackets, we're going to create a string and we're going to put the URL that we want to get data from. So, if we go back

to our browser, remember that this URL gave us the products data. So, we can just select

products data. So, we can just select this URL and copy.

And in our code, we're going to paste it into fetch.

And make sure you have http col double slash in front. It doesn't show in the browser, but we need this in order for our code to work. So if we fetch data

from this URL, this should give us the products data that we saw earlier.

However, we cannot save this data in a variable like this. And that's because when we contact a backend, it takes time

for this code to reach the back end and to get a response. So this code does not finish right away. It finishes at some

point in the future. As a review, we call this asynchronous code.

Asynchronous code means code that does not finish right away. So how do we handle this situation?

fetch returns a promise and a promise lets us wait for asynchronous code to finish.

So a promise has a method called dot then and brackets and we give dot then a function brackets arrow and curly brackets.

The way this works is that this code contacts the backend to get some data but it takes some time for the backend to respond. So the code is going to keep

to respond. So the code is going to keep going line by line. Then at some point in the future, this is going to finish.

We're going to get the response from the back end. When it finishes in the

back end. When it finishes in the future, it will run the function inside.

So that's a review of how a promise works. So next when fetch gets a

works. So next when fetch gets a response from the back end it will save it as a parameter in this inner function called response.

By the way when we contact the back end using fetch this is called a request.

When the back end responds with some data this is called a response. So this

parameter contains the response from the back end. And inside here, let's just

back end. And inside here, let's just console.log

console.log the response to see what it looks like.

We'll save and then check our website and we'll open the tab for our website and we're going to open the console.

Rightclick inspect and the console.

And you can see that we got the response from the back end. So inside here we have some information like the URL that we accessed and a status code. 200 means

it was successful.

However, notice that we don't have the products data in this response. To get

the products data, we're going to go back to our code and this response object has a method called response.json

called response.json JSON and brackets.

So,JSON gives us the data that is attached to the response. In this case, it gives us the products data. Now, the

tricky part about this is response.json

is also asynchronous. So, again, we can't save this in a variable. Instead,

this is also a promise. So we have to use dot then again and give this another function brackets arrow and curly brackets

and then inside this inner function we have access to the data that we get from the back end. So in this case this is

the products data.

So if we console.log log the data and save and then check the console.

You'll see that the backend gave us an array of products to display on the page. So, this is the same thing as the

page. So, this is the same thing as the products array that we saved in our file, but this data is coming from the back end.

Let's go back.

And that's how we fetch data or get data from the back end. We use the built-in function fetch and give it the URL of

the back end and then we use dot then to wait for a response.

Now one shortcut we can use is instead of doing dot then inside another dot then we can also return the

response.json JSON and then move this

response.json JSON and then move this dot then to the outside.

So this code does the same thing as before. This waits for this to finish

before. This waits for this to finish and then runs this function. So this is just a shortcut that we can use with promises.

Another thing to note is the back end can also run on the same computer as the website or the front end. So right now this back end is actually running on our

own computer. Locost means our own

own computer. Locost means our own computer. So when we contact the back

computer. So when we contact the back end, we're actually just contacting our own computer. We do this during

own computer. We do this during development because it's easier. But

once this website is on the internet, the back end will be another computer.

So now let's save this code and we'll save this into git. In the get section, we'll use the message fetch

data from the back end and commit.

Next, notice that using fetch is still a little hard to read. We use a and then we use response.json and then another.

To make this code cleaner, we're going to use an npm package called Axios.

Axios is a cleaner way to make requests to the back end. First, we're going to go to our command line and we'll open the tab for the front end. And here

we'll press Ctrl C to stop the V server.

And we're going to npm install Axios and type at and we're going to give it a version. So, we can click this link in

version. So, we can click this link in the description and then go to lesson 7.

And this is a version of Axios we're going to use. So, again, you should always use the version that you see on your page.

So, select the version on your page and copy it and then paste it in our code and press enter to install Axios.

Once that's installed, we're going to run mpm rundev to restart the vit server.

And then to use axios in our code, we're going to go to the homepage. And at the top, we're going to import axios without

curly brackets from a string axios.

And now instead of using fetch, we're going to use axios.get.

So this does the same thing as before except the data from the back end will be saved directly inside the response.

So instead of doing all these steps, we can just get the data using response.

So let's console.log this to see if it works. So console.log and save.

works. So console.log and save.

And then if we open the console, you'll notice it gets the same products data as before.

But if we look at our code, it's a lot cleaner because we can just get the data directly from the response. So as you can see, Axios is a cleaner way to make

requests to the back end. So now let's save this into git. In the get section, we'll use a message use Axios to fetch

the data and commit.

Now, let's use this data from the back end to generate the HTML instead of using the products file that we had before. But first, we have a problem.

before. But first, we have a problem.

This code is directly inside the homepage component. That means whenever

homepage component. That means whenever the homepage changes or rerenders, it will run this code again and send another request to the back end.

However, we just need to load the products once on this page. We don't

need to load the products over and over again. To make this code run once, we

again. To make this code run once, we can put it inside a use effect. At the

top, we're going to import curly brackets use effect from React.

And above this code, we're going to do use effect brackets and give this a function brackets arrow and curly brackets.

Use effect lets us control when some code runs. We're going to move this code

code runs. We're going to move this code inside the use effect. So we'll cut and in here we'll paste.

And I'll select these lines and press tab to reformat.

By default, use effect runs this code every time the component is created or updated. But we can control this. At the

updated. But we can control this. At the

end of this function, we're going to add a comma and an empty array. As a review, this is called a dependency array. The

dependency array lets us control when use effect runs. If we use an empty array, that means this code will only

run once after the component is created.

And that's exactly what we need here. We

just need to load the products once on this page. By the way, you might notice

this page. By the way, you might notice in the console that use effect runs twice instead of once. So, this is totally normal and it's caused by using

strict mode in our app. Strict mode runs use effect twice to help us catch bugs and it only does this during development.

So now that we have the data, how do we use it in this loop down here to generate the HTML?

To do that, we need to save the products data inside the state. So at the top, we're also going to import use state

from React.

And at the top of our component, we're going to do const square bracket equals use state and brackets.

As a review, use state gives us an array with two values. The first value is the name of the data. In this case, we'll

name it the products. And then we'll type a comma. And the second value of use state is the updater function. The

updater function lets us update this value and then it will regenerate the HTML. We usually name the updater

HTML. We usually name the updater function set and then the name of the data capital P products.

And finally between these brackets we're going to put the starting value of the products. Let's just use an empty array.

products. Let's just use an empty array.

And now after we get the products from the back end, we're going to save it into the state.

So instead of console.log, we'll use the updater function set products. This will

save the products data into here. And

then it's going to use this to generate the HTML. So now we're using data from

the HTML. So now we're using data from the back end to generate the HTML. And

we don't need to import this file here anymore.

So the only thing to note is that the name of the data has to match the name that we use down here. So that this code is actually using the state.

Now let's save and we'll check the website.

And everything still works except now we're using data from the back end to generate this HTML.

We'll go back to our code and we'll save this into git. In the git section, we'll create the message use

data from the back end to generate the HTML and commit.

Next, if we look at the website in the homepage, we also need to get the cart from the back end because we need to display this quantity number up here.

To do that, we'll go back to our code and we're going to make another request to the back end to get the cart. So,

below this request, we're going to use axios again. Axios.get get brackets a

axios again. Axios.get get brackets a string and we'll give it the URL http colhost

col 3000 slash API/cart- items. The way this works is the back end is

running on http localhost col 3000 and after this we add a URL path. Each URL

path gives us different data. For

example, the URL path/ API/proucts gives us the products data. The URL

path/ API/cart items gives us the cart data. So the URL path can actually be

data. So the URL path can actually be anything we want. Whoever creates the backend decides what the URL paths will

be. In the description, you can find a

be. In the description, you can find a documentation page for my backend.

And this lists all the URL paths that we can use. A common naming convention is

can use. A common naming convention is to start the URL path with slash API.

API means application programming interface. Starting with / API makes it

interface. Starting with / API makes it clear that these URL paths are specifically for interacting with the backend.

So we already learned how to use / API/roucts.

Now we're going to learn how to use / API/cart items. And remember whenever we make a request to the back end it's going to take some

time to get a response. So we need to wait for this code to finish using then we'll give this a function and the response is going to be saved in

here.

So when we make a request to /appi/cart items, we're going to get the cart in the response. So in here, let's

the response. So in here, let's console.log

console.log the response data to see what the cart looks like. We'll save

looks like. We'll save and we'll check the console.

And you might need to refresh. And the

back end responded with an array. And

this array represents the cart that we have on the website. So each item in the cart contains the product ID that we want to buy and the quantity of that

product. So next we're going to use this

product. So next we're going to use this to calculate the quantity and display it on the page. So we'll go back to our code and first we need to save this cart

into state so we can use it to create the HTML.

At the top, we'll create another state const brackets equals use state brackets.

And this state will save the cart, comma, and the updater function set capital C cart.

And let's set the starting value of the cart to an empty array. And we'll scroll down. And now once we get the cart from

down. And now once we get the cart from the back end, we're going to save it in the state. So instead of console.log,

the state. So instead of console.log,

we're going to use the updater function set cart. And now the cart from the back

set cart. And now the cart from the back end will be saved inside this variable.

And remember that the quantity for the cart is inside the header. So we need to pass the cart into the header using a

prop. So here we'll add a prop. cart

prop. So here we'll add a prop. cart

equals curly brackets and we'll give it the cart.

Let's save this file and we'll go into our code and go to components header.jsx

components header.jsx and then inside the header we're going to get the cart from the props. To do

that at the top, we'll type curly brackets and the cart. As a reminder, this is a shortcut for this code.

And now we're going to calculate the total quantity in this cart. So at the top, let's create a variable. Let total

quantity equals zero to start. And then

we'll loop through the cart using cart for each brackets. And we'll give it a function.

And the inner function will get one parameter which is each item in the cart. So, we'll call this the cart item.

cart. So, we'll call this the cart item.

And then each cart item has a quantity.

So, we're going to add that to this total quantity up here. We'll do total quantity plus equal the cart item.

And now we can scroll down till we see the cart quantity down here.

And instead of three every time, we're going to insert the total quantity and save.

And now if we look at our project now, it will display the total quantity using data from the back end. So now

let's go back to our code.

And if we scroll up, you might see an error here for props validation. Again,

this is an older feature of React. So,

we can disable this check by going into our files and opening eslint.config.js.

And then we'll scroll down inside this rules object. We're going to add a

rules object. We're going to add a string react/prop- types colon the string off. So, make

sure it's inside this rules object. We

can save.

And now if we go back to the header, the props validation error should be gone.

So now let's save this code into git.

We'll open the git section and we'll create a message get cart from the back

end and display quantity and commit.

Next, if we go back to the homepage, so in our files, go to pages and homepage and scroll up. Notice that for each

request, we're sending it to localhost 3000. So, we can actually set up a

3000. So, we can actually set up a shortcut in Vit. So, we don't have to type localhost 3000 every time. So, we

can actually remove these and save.

And then we're going to go to our files and we're going to open vit.config.js.

And inside here we're going to add the property server colon and an object. And

inside we'll add the property proxy colon another object.

And in here we'll add a string slash API colon. And we're going to give this an

colon. And we're going to give this an object. And inside we'll add a target

object. And inside we'll add a target property colon and the string http colon

double slash localhost colon 3000.

So this is called a server proxy configuration. This just means that if

configuration. This just means that if the URL path starts with / API like we had it before, the request will automatically go to localhost 3000. So

we don't have to type it every time.

Another thing we can set up is when we load images, we also want to load them from the back end. Remember the back end should manage the data including the

product images. So in here we'll also

product images. So in here we'll also add a comma and add a string slash images colon and an object

and we'll give it the same target. So

we'll select this and copy and in here we'll paste and save.

And we need to do one more thing. We're

going to go inside index.html HTML and in the head we're going to add less than base slashgreater than and we're going

to give this an attribute href equals double quotes and a slash.

So this adds slash in front of any relative urls. All the image URLs start

relative urls. All the image URLs start with images and this will convert them into slash images so that our redirect

will work. Let's save

will work. Let's save and we'll go back to the vit config.

So now when we get images, we're going to get them from the back end. And now

because we changed the vit configuration, it's a good idea to stop the server with control c and then restart the server using mpm rundev.

And now let's check the website to make sure everything is working. So I'll just refresh this to make sure. And

everything still looks good. So now

we'll go back to our code and we'll save these changes into git. Inside git,

we're going to type the message add server proxy config for slash API and slash images

and commit.

Next, we're going to move on to the checkout page. So, let's open the

checkout page. So, let's open the website and we'll click the cart icon in the top right and we're going to work on this page.

So, on this page, we also need the cart to generate this HTML.

So, we'll go back to our code and we'll open our files and we're going to open checkout page.jsx.

And now inside here we could do another axios.get/appi/cart

axios.get/appi/cart again. But remember we already loaded

again. But remember we already loaded the cart on the homepage. It does not make sense to reload the cart whenever we switch pages. We just need to load

the cart once for the entire website. To

do that, we're going to go to the homepage and we're going to share this cart between the two pages using the technique lifting the state up. As a

review, this means we move the cart state up to an outer component. In this

case, the outer component is the app component here, which contains a homepage. So, we're going to lift the

homepage. So, we're going to lift the cart up into the app component. And from

here, we can share the cart between the homepage and the checkout page. So,

first, let's go into the homepage again.

We're going to select this cart and cut and go back to the app. And we're going to lift it up in here by pasting it. And

we also need the code that loads the cart. So in the homepage,

cart. So in the homepage, we're going to select this code and cut and save

inside app.jsx.

inside app.jsx.

Below this, we're going to paste.

And remember, we need to put this inside a use effect so that it only runs once.

So use effect brackets, give it a function, and a empty array at the end. And we're

going to select it and cut. And inside

here paste.

And I'll select these lines and press tab to reformat them. And next, we'll need to import this code. So at the top,

we're going to import curly brackets, use state, and use effect from React.

And we'll also import axios. So at the top again, we're going to import axios from the string axios.

So now that we have the cart, we're going to share it between these two pages using a prop. So for the homepage, we'll add a prop. Cart equals curly

brackets and we'll give it the cart. And

for the checkout page as well, cart equals curly brackets. and we'll save the cart.

Let's save this file.

And we'll go into the homepage.

And at the top, we need to access the cart from the props using curly brackets, the cart, and save.

So, the code should work the same as before, except we're just getting the cart from the props. Now, let's open our website to make sure it works. We're

going to go to the homepage and refresh.

And that looks good. We'll go back to our code. So now that we lifted the

our code. So now that we lifted the state up, we can just load the card once for the entire website instead of reloading it on every page. We'll open

the get section and we'll give it the message lift cart up and share it

between pages and commit.

Next, we're going to use the cart to generate the HTML for the checkout page.

So, first make sure that we pass the cart to the checkout page using this prop. And now we're going to open the

prop. And now we're going to open the checkout page, which is here. And we're

going to access the cart from the props using curly brackets and the cart.

And I will use this cart to generate the HTML down here. Now inside this code, we're going to press Ctrl+F to find some code. And we're going to search for

code. And we're going to search for cart- item-container.

And here we're going to collapse this element. And we'll collapse this element

element. And we'll collapse this element as well.

So each of these represents a cart item on the page. So let's generate this using the cart. Above this we're going

to insert cart map brackets and we'll give it a function brackets arrow and curly brackets. And this inner function

curly brackets. And this inner function gets one parameter which is the cart item. And for each item we're going to

item. And for each item we're going to return brackets some HTML.

So for each cart item, we want to generate this HTML. So let's just select it and copy. And inside here, we're going to paste.

And to fix the formatting, we're going to press control or commandshiftp and run format document.

Now let's scroll up.

And remember, when we loop through an array, each element needs a key property.

Each cart item has a product ID which is unique. So we're going to save the key

unique. So we're going to save the key as cart item.

ID.

And now instead of showing the same product every time, we're going to insert the details from each cart item.

However, there is a problem here.

Remember that the cart looks like this.

It doesn't have any product data on it.

To fix this, we're going to go to the app component where we load the cart.

And at the end of this URL, we can add question mark expand equals product.

So this is called a query parameter. A

query parameter lets us add additional information to our request. When the

backend receives this query parameter, it's going to add product details to the cart. So, it's going to expand the cart

cart. So, it's going to expand the cart with product details. So, now let's save this file and we're going to open the website and

we're going to go to the checkout page and we're going to open the console. So,

we'll rightclick inspect and inside the console we're going to open the network tab.

So, I'm going to remove any search that I have. And in here, we can see all the

I have. And in here, we can see all the requests that we make to the back end and the responses. So, by the way, requests only show up here if the

console was open before the request. So,

we may need to refresh to get the request to show up in the network tab. And now we can see our

network tab. And now we can see our request to cart- items. If you don't see it, you may need to search for it up here by typing cart. And we have it

here. So we can open this by clicking it

here. So we can open this by clicking it and then go into the response tab. And

here you can see the response from the back end. So now you can see that each

back end. So now you can see that each cart item has a property called product.

And this contains all the product details that we need for this page.

So now let's go back to our code.

And we're going to go to the checkout page.

And now instead of the socks every time, we're going to remove this and insert the cart item.

And we'll also replace the image. So

we'll remove this and insert the cart item.

image and down here we're going to insert the price. Now, if we go to the homepage, remember that in the homepage, we wrote

some code here to display the price. So,

let's actually move this code into a function so we can reuse it. Inside our

files, we're going to click the source folder and we'll create a new folder and let's call it utils for utilities.

And inside the utmost folder, we'll create a new file and we'll name it money.js.

money.js.

So this file contains utilities or code that helps us work with money. So in

here, let's create a function and we'll name it format money brackets and curly brackets.

And we're going to copy the code from the homepage. So, inside the homepage,

the homepage. So, inside the homepage, we're going to take all of this code and copy it.

And inside money.js, inside here, we'll paste it.

And now we're going to turn this into a string. At the front, we'll type backick

string. At the front, we'll type backick and at the end a back tick to create a template string. And remember in

template string. And remember in template strings to insert something, we need dollar curly brackets. And now,

instead of getting the product.pricent

price cents. We're going to pass it into this function. So, let's name the

this function. So, let's name the parameter amount cents. And we're going to remove this and replace it with

amount cents. So, this function lets us

amount cents. So, this function lets us convert any amount cents into this format. At the end, let's return this

format. At the end, let's return this value from the function. and we'll

export it so we can use it in other files and save.

So now we can go back to the homepage and at the top we're going to import curly brackets the format money function

that we just created from a string and we're going to locate the utils folder.

So, we'll go out of this folder with dot dot slash utils slashmoney.

And now we'll scroll back down and instead of this code, we're going to remove it and insert format money

brackets and we'll give it product.pric

sets and save.

And now let's reuse this function in the checkout page. So, we'll open the

checkout page. So, we'll open the checkout page, and at the top, we're

going to import curly brackets, the format money function from a string, and we're going to locate this file. And for

me, I'll go out of this folder using dot dot slash utils/money.

Now, if you did the exercises from the previous lesson, this file might be inside a folder called checkout. In that

case, make sure you have two dot dot slash in front. And now we're going to scroll back down and we're going to replace this money

with curly brackets.

Format money brackets. And we're going to give it the cart item.

price sets and we'll replace the quantity. So, insert

quantity. So, insert cart item dot quantity and save.

And now if we go back to the website, now we are generating these cart items using data from the back end. And this

was the default HTML we had before. So

now we can go back to our code and we can scroll down and we can remove the default HTML

and save.

So now let's save these changes into git. We'll open the get section

git. We'll open the get section and at the top we'll type the message generate

HTML for the cart items and commit.

Next, we're going to generate the HTML for the delivery options. So, we'll go back to the checkout page and we'll scroll to the top of this component. And

here we'll load the delivery options from the back end. So first let's import

Axios. At the top we'll import Axios

Axios. At the top we'll import Axios from the Axios npm package. And we'll

also need import curly brackets. Use

state and use effect to save the delivery options. So import it from

delivery options. So import it from React.

And now inside the component we'll create some state to save the delivery options const

bracket equals use state and brackets and we'll name this delivery options colon and the updater function set

delivery options and we'll set the starting value to an empty array. Next, we'll get the

empty array. Next, we'll get the delivery options from the back end. So

here we'll do use effect brackets and we'll give it a function brackets arrow and curly brackets. And at the end we'll give it a comma and an empty dependency

array so that this code only runs once on this page. And inside here we're going to call axials.get

get brackets and the URL to get the delivery options is slash API slashd delivery-options and then we're going to wait for the

response to come back using then brackets and give it a function brackets arrow and curly brackets and inside the function the response from the back end

will be saved as the response parameter.

So once we get this response, we're going to save it in the delivery options up here using set delivery options brackets

response.

Now let's save this code and we're going to check the network tab to see if it works. So, we'll open the console and

works. So, we'll open the console and we'll open the network tab. And we might need to refresh to make sure we get the request and we'll remove this and search

for delivery options. And we'll click one of these and then look at the response tab. So, the backend responded

response tab. So, the backend responded with three delivery options. Each

delivery option has the number of days it takes to deliver and the price in cents. However, if we open our website,

cents. However, if we open our website, notice that each delivery option also has a estimated delivery time. So, we

could use this delivery days to calculate this date on the front end.

But remember, it's generally the backend's job to manage the data and do these calculations.

So, if we go back to our code, this URL path also supports a query parameter called expand. So at the end

we'll add question mark expand equals and I called it estimated delivery time.

So when the back end sees this expand parameter it will calculate the estimated delivery time for us and then give it back in our response. If we save

and check the console and refresh and open the response and now you'll see that each delivery option now has an

estimated delivery time in milliseconds.

So now we'll go back to our code and we have what we need to display the date.

As you can see it's generally the backend's job to manage the data and to do the calculations. And now the front end's job is to present that data in an

easy to read way on the website.

So now let's use these delivery options to generate the HTML. We're going to click in this file and press Ctrl+F to search for code. And we'll search for

delivery dash options.

And inside here we should see an element with a class name delivery option. So

we're going to collapse this element and also collapse the other delivery options and each of these represents one delivery option on the page. So let's

generate this HTML using React. Above

this we'll insert and we'll run the code delivery options dot map brackets and give it a function brackets arrow and

curly brackets and the parameter will be each delivery option and here we're going to return brackets

some HTML for each delivery option. So

we want to return this HTML. So we can select it and copy. And inside here we'll paste.

And we can fix the formatting using control or commandshiftp and press format document.

And let's scroll up. And as always, we need a key prop whenever we're looping through an array. So we'll add key equals curly brackets. And each delivery

option has a unique ID. So we'll just set it to the delivery option ID.

Next, we're going to replace these values here. So first we'll do the

values here. So first we'll do the delivery date. Currently, we only have

delivery date. Currently, we only have the delivery time in milliseconds. So

how do we display it as a date like this? To do that, we can use another npm

this? To do that, we can use another npm package called Dayjs.

So, we're going to go to the terminal and go to the tab that's running our front end. And we can press Ctrl C to

front end. And we can press Ctrl C to stop the server. And we're going to npm install dayjs. And we'll type at to give

install dayjs. And we'll type at to give it a version. And we're going to click this link in the description to get the version of day.js we're going to use.

And we'll copy that version and paste it in here and press enter to install day.js.

day.js.

And after that we're going to npm rundev to restart the server.

So the dayjs package helps us work with dates and it helps us display a date in a particular format. To use it, we're

going to scroll to the top and at the top we're going to import dayjs from the package day js.

And now we'll scroll back down or we can control F and search for delivery options.

And we'll scroll down here. And now

above this date, we're going to insert.

And we're going to run day JS and brackets. And we're going to give Day.js

brackets. And we're going to give Day.js DJs a time in milliseconds which we actually have inside delivery option dot

estimated delivery time ms or milliseconds.

And now that we wrapped this in dayjs we can format it into this format. So after

this bracket here, we're going to use the method dot format and brackets and give it a string. To show the time in

this format, we're going to type D four times, which is the day of the week. And then

we'll type a comma to show this comma and a space. And we'll type capital M four times to show the month and a space. and we'll

type capital D which will show this date. And now we can remove this code.

date. And now we can remove this code.

Next, we're going to replace this price.

If the price is free, we'll show free shipping. Otherwise, we're going to show

shipping. Otherwise, we're going to show the price dash shipping. So, we're going to scroll up to the inside of this loop here,

and we're going to create a variable for the price. So, we'll do let price string

the price. So, we'll do let price string equals a string. And to make it easier, we're going to set this to a default of

free shipping.

And then we're going to overwrite this if we have a price. So, below this, we're going to check if brackets the

delivery option.

Sense is greater than zero.

curly brackets. So if it is not free, we're going to overwrite this price string equals a template string

and inside we're going to insert and remember we have the format money function to display the price. So as I here we'll call format money and

brackets and we're going to give it the delivery option price sets.

And at the end we're going to add a dash and shipping.

And now we can scroll back down and instead of free shipping every time we're going to insert the price string.

Next, we're going to scroll up a bit and there's a few things that we need to replace for this input type radio element. So, this represents the

element. So, this represents the selector and there's a few special attributes that we need to replace. The

first one is the name attribute. So, the

name groups the selectors together. So,

each set of selectors should have a unique name. This makes sure that for

unique name. This makes sure that for each product we can only select one of them. So here instead of doing delivery

them. So here instead of doing delivery option one every time we're going to replace this with a product ID because each set of selectors should belong to

one product.

So in this code we're going to replace it using curly brackets and change this to a template string using a back tick and a back tick and

instead of one every time we're going to insert and we'll insert the product ID.

Now in this code we actually have access to the cart item from above. So inside

here we can just insert the cart item.

ID.

Next we also need to update this checked property. So this determines if the

property. So this determines if the selector is checked. So we don't want the selector to be checked every time.

Each cart item has a delivery option ID and this is the one that should be checked. So, inside here, we're going to

checked. So, inside here, we're going to add a new line. And we're going to make check equal and insert some code. And

we're going to compare if this delivery option do ID is equal to the cart items.

Option ID.

So only the delivery option that matches the delivery option ID in the cart will be checked. So that's all the things

be checked. So that's all the things that we have to replace in the delivery options. So now let's scroll down and we

options. So now let's scroll down and we can remove this default code and save

and let's check the website.

And now we're generating these delivery options and the correct ones are checked and we have the estimated delivery dates for each displayed in an easyto read format.

The last thing we need to generate is this delivery date up here. So, we'll go back to the code and we're going to scroll up

um to the cart item and we're going to find the cart item container and this delivery date here. So, this date is determined by whichever delivery option

is selected. So, first we need to find

is selected. So, first we need to find the delivery option that is selected.

So inside this loop, we'll create a variable const for the selected delivery option and equals.

And to find this, we're going to get the delivery options and then use the method dot find and brackets.

And find gets a function. So brackets,

arrow, and curly brackets.

And in this inner function, it receives each delivery option. So we'll call it delivery option.

And I'll just add a new line here and select this code and press tab to format it a little bit.

So the way that find works is it's going to loop through each delivery option.

And the first function here that returns true is going to be the result. So

that's how we find something. And then

it's going to save it in this variable.

So inside here we want to return the delivery option id that is equal to the cart items

dot delivery option id. So the delivery option that matches what is inside the cart item will return true and that's going to be saved in here. And now we

can replace this date. So we'll type curly brackets and we'll use day js brackets and the selected

delivery option dot estimated delivery time ms and outside this bracket we'll use a

method dot format brackets and give it a string and to get this date format we'll

give it d four times a comma and capital M four times space and capital D.

And now we can remove this date here.

And before we run this code, there is one small problem here because remember the delivery options start out as empty.

So if they are empty, we might not find the selected delivery option. To fix

this in front of this code, we're going to check if delivery options.length

is greater than zero and type and and as a review. This works like an if statement. It will check if delivery

statement. It will check if delivery options.length is greater than zero and

options.length is greater than zero and then only if it's true, it will run the rest of the code. So now we can save and check the website.

And now we're generating everything here using data from the back end. So let's

go back to our code and we'll save this into git. Inside the

git section, we'll type the message generate the HTML for the delivery options

and commit.

Next, if we go back to the website, we're going to generate the HTML for the payment summary here. Now, we could calculate all these numbers inside

React. However, we're going to use the

React. However, we're going to use the back end to calculate these numbers.

Remember, the backend's job is to manage the data and to do the calculations. The

front end's job is to present the data in an easy to read way. So let's go back to our code and we'll go back to the checkout page and we'll scroll to the

top and we're going to create a state for the payment summary. So here we'll type const square brackets equals use

state and brackets and we'll name this payment summary, and the updater function set payment

summary.

And as a starting value, we're going to use null because the payment summary is going to be an object. And it's a little easier to check if the object is not loaded if we set it to null at the

start.

Next, we're going to use Axios to get the payment summary from the back end.

So down here, we'll use Axios.get get

brackets and we'll give it the URL path slash API slash payment- summary and we'll use dot then to wait for a

response and give it a function and inside here we can get the response.

Once we get the response, we're going to use set payment summary brackets

response data to save the data inside here. So now let's save and check the

here. So now let's save and check the response from the back end. So we'll go to our website and open the console and open the network tab and we'll refresh

just in case. We can click this to remove the search and type payment and we get the payment summary. So we

can click this and you can see that in the response the back end calculated all the numbers that we need. So now we just need to present this on the page.

Let's go back and we'll press CtrlF in this file and we'll search for payment dash summary and press enter to find the

next result. And this section represents

next result. And this section represents the payment summary on the page. And now

we'll replace these numbers with the numbers we got from the back end. So

first we'll replace the total quantity here using curly brackets and we'll replace it with payment summary dot

total items. And here we'll replace the product cost.

I'll type a new line to make it a little easier to read. And we'll insert.

And remember for money we need to format it using the function format money brackets. and we'll get the payment

brackets. and we'll get the payment summary dot product cost set.

We'll scroll down and we'll replace this next number. So we'll remove it and new

next number. So we'll remove it and new line and curly brackets and we'll run format money again brackets and this one

is a shipping cost which is payment summary dot shipping cost sense.

Let's keep going. And this is the total before tax. So we'll replace this and

before tax. So we'll replace this and insert format money brackets

payment summary dot total cost before tax cents.

And we'll scroll down here and replace this. insert format money brackets the

this. insert format money brackets the payment summary dot tax sets and then down here we're going to

replace this one and insert format money brackets the payment summary dot total cost sense

and finally we only want to display this if the payment summary is loaded otherwise we don't have this information. So above this code,

information. So above this code, we're going to type curly brackets and we'll check if payment summary and and brackets.

So this checks if the payment summary object exists. If it's null at the

object exists. If it's null at the start, it's not going to run the rest of the code. And now we're going to put all

the code. And now we're going to put all of this code inside here. So we'll

select all this code up to the place order button and we'll cut

and inside here we're going to paste.

Now a problem here is that we're returning multiple elements inside this brackets. So to fix that we need to wrap

brackets. So to fix that we need to wrap this in a fragment using less than greater than and remove this for now.

And at the end after the button we'll do less than slashgreater than. So we're returning

slashgreater than. So we're returning one element inside this brackets. And

now we'll format our code using control or commandshiftp and run format document and save.

And that's it. Now we're generating the payment summary using data from the back end. We'll go to our website. And that

end. We'll go to our website. And that

looks good. So now let's go back to our code and we'll save this into git. In

the git section, we're going to type the message generate HTML for the payment

summary and commit.

Next, we're going to work on the orders page. So, we'll go back to our files

page. So, we'll go back to our files and we're going to open the orders page.

So, first of all, the orders page has a header component. And remember, the

header component. And remember, the header now needs the cart in order to display the quantity. So, we need to share the cart with the orders page

first. We'll go to our files and open

first. We'll go to our files and open app.jsx.

app.jsx.

And we'll scroll down. And here we'll share the cart with the orders page using a prop cart equals curly brackets.

And we'll save the cart and save.

And now we'll open the orders page again. And at the top we're going to

again. And at the top we're going to access the prop using curly brackets and cart. And we're going to pass this cart

cart. And we're going to pass this cart into the header using cart equals curly brackets and the cart.

Let's save.

and we'll open the website and we're going to go to the orders page. So,

first we'll click here to go to the homepage and then we'll click here to open the orders page and it should be working. So, now we're going to generate

working. So, now we're going to generate this HTML using data from the back end.

So, we'll go back to the orders page and at the top we're going to import what we need. So first we'll import axios from

need. So first we'll import axios from Axios and we'll also import curly

brackets use state and use effect from react.

And now down here first we'll create some state to save the orders using const square brackets equals use state and brackets.

And we'll call this data the orders, comma, and the updater function set orders.

And at the start, we'll set the orders to an empty array. And below this, we're going to make a request to the back end

using use effect brackets and a function brackets arrow and curly brackets. And

down here, we'll give it a empty array so that it only runs once. And inside

we're going to use axios.get

again. So brackets and the URL path for the orders is slappi/ord orders and then we'll do dot then to wait for

the response from the back end. We'll

give this a function brackets arrow and curly brackets. Inside this parameter is

curly brackets. Inside this parameter is the response from the back end. And once

we get the response, we're going to save it inside orders using set orders brackets response

data. Let's save.

data. Let's save.

And now we can check the network tab to see if we got the orders. We'll open the console.

Inside the network tab, we can refresh and remove this and search for orders.

And down here, we'll click this request and go to the response tab. And the back end gave us the orders that we need to display. Now, a problem here is that we

display. Now, a problem here is that we only have the product ID in the order, but we also need to display some product details on the website. And again, the

backend supports an expand parameter for this URL path. So at the end here, we'll add question mark expand equals

products. This time, make sure you have

products. This time, make sure you have an s at the end. So now let's save and check the network tab again. And

we'll refresh.

And now inside the orders request, you'll see that each order has the product ID, but it also has the other data for the product. And this is what

we need to display on the website.

So now we'll go into our code and we're going to generate the HTML. So first

we'll press control or command F and we're going to search for order dash container which is down here. And we can collapse

this code and collapse the other order container. Each of these represents an

container. Each of these represents an order on the website. So, we're going to generate this HTML.

At the top, we'll insert and we'll run orders.m map brackets. And we'll give it

orders.m map brackets. And we'll give it a function.

And this parameter is going to be each order.

And for each order, we're going to return some HTML.

So, we want each order to be converted into this HTML. We're going to select it and copy it inside here. We'll paste.

Press control or command shiftp and run format document.

And we'll scroll back up.

As always, we need a key prop when we're looping through an array. We'll set the key equals. And each order has an order

key equals. And each order has an order ID property.

As usual, we're going to replace the values in here. Feel free to pause if you want to try it yourself first. So

for the delivery date, we're going to insert and we're going to use dayjs brackets and each order has an order dot

order time ms and outside this bracket we use dot format brackets and a string. And to

display the date, we're going to use four capital M's for the month and a capital D for the date. So now we also need to import day.js. So we'll scroll

to the top and at the top we'll import dayjs from a string dayjs.

And let's also import format money because we're going to use it later. So,

import curly brackets format money from a string dot dot slashyouutills/ money.

Now, we're going to scroll back down and we're going to replace the total order cost. So here we're going to

order cost. So here we're going to remove this and curly brackets we're going to insert format money brackets

and give it the order dot total cost sense.

We'll scroll down and here we're going to replace this with the order ID. So

curly brackets order ID.

Next, inside this element order details grid. This displays the list of products

grid. This displays the list of products in the order and we're going to generate this using React as well. So above this

we're going to use curly brackets and we're going to get the order products array and we're going to loop through it using map brackets and give it a

function and save each product and for each product we're going to return brackets some HTML.

So if we collapse this code and collapse this element and this element and we also collapse these.

So three of these elements represents one product. It's a little different

one product. It's a little different because we don't have an element that contains all of these because we're using a grid here, but it works in a

similar way. We're going to copy this

similar way. We're going to copy this code and inside return we're going to paste and the one difference here is that if

we scroll up we're returning multiple elements from this function. So we need to wrap these

this function. So we need to wrap these in a fragment. So at the top we'll type less than greater than. But then we have another problem here which is remember

when we loop through an array each element that we return should have a key property and we can't add props to fragments like this. To solve this we

need to use the full fragment syntax. So

we're going to scroll to the top and for React we're going to import using comma the fragment component.

So we'll scroll back down and in here we're going to use a full fragment syntax and remove this. So this does the same

thing except now we can add a key prop to it equals curly brackets and let's set the prop to the product ID.

and we'll scroll to the bottom.

And before these brackets, remember to add the closing fragment tag.

And finally, we'll press control or commandshiftp and format document.

And now we can replace this default code that we have down here.

Finally, we're going to replace each product's details. So here we're going

product's details. So here we're going to replace the name and insert the product name. And here let's also

product name. And here let's also replace the image curly brackets. Replace it with product.

curly brackets. Replace it with product.

And actually I made a mistake. I forgot

that all the product details are saved in a property called product. So let's

actually rename this to order product.

And then here we're going to do the order product dotproduct ID and the order product.product.im

order product.product.im

image and the order product.product.name.

product.product.name.

And then down here to replace the delivery date. This is directly on the

delivery date. This is directly on the order product. So we can remove this and

order product. So we can remove this and insert and we'll use dayjs and bracket

and give it the order product dot estimated delivery time ms and outside

these brackets we'll do dot format brackets and a string and we'll use the format capital M four times for the

month and capital D for the date. And

then down here for the quantity, we're going to insert and the quantity is directly on the order product dot quantity

and save.

And now if we scroll down, we can also remove the rest of this default HTML and save this file. And now let's check

our website.

And everything should be working except we're generating the HTML for these orders using data from the back end. So

now let's go back and we'll save this into git. We'll open the git section

into git. We'll open the git section and we'll give it the message generate

the HTML for the orders page and commit.

Next, if we look at our code right now, you'll notice we have a lot of code in one file. To make our code cleaner, we

one file. To make our code cleaner, we should separate our code into smaller components. So, let's go to our files

components. So, let's go to our files and we're going to start with the homepage.

So, inside the homepage, we're showing a grid of products. To make the code cleaner, we can separate this into its own component. So, we'll go to the pages

own component. So, we'll go to the pages folder and we'll click it and we're going to create a new file and let's

call it the products grid.jsx.

And now we have multiple components that are related to the homepage. So, usually

we organize this into a folder. So,

inside here, we're going to create a new folder and we're going to call it home and press enter.

And we group all the components related to the homepage inside here. So, we'll

move the homepage.jsx.

And let's update the imports and also homepage.css

and also the products grid.

And whenever we move files, we need to make sure the imports are still correct.

So in homepage, I'm going to scroll up and we should make sure that we have two dot dot slashes in front because now we're inside an additional folder. So

that looks good to me. And we're also going to go to app.jsx

and scroll up and make sure that the homepage is now inside the home folder.

So now let's save and check our website and go to the homepage to make sure it still works. So now let's go back to our

still works. So now let's go back to our code and we're going to separate the products grid into its own file. So in

here we'll create the component using export function products grid brackets and curly

brackets and we'll return some HTML and we're just going to copy the HTML to here. So, inside the homepage, we're

here. So, inside the homepage, we're going to scroll down to the products grid and we can collapse this element

and select all this code and copy inside the products grid. Inside here,

we can paste and press control or commandshiftp and format document.

Now, we'll scroll up and we're going to fix these errors. So first we need access to the products. So we can pass those in as a prop curly brackets

products.

And down here we also need the format money function. So at the top we're

money function. So at the top we're going to import curly brackets format money

from a string and we'll find that utils file. So we need to get out of two

file. So we need to get out of two folders this time using dot dot slash dot dot slash utils/money and save.

And now inside the homepage at the top we're going to import our products grid.

So import curly brackets the products grid from a string and it's right beside the

homepage. So we can just do dot slash

homepage. So we can just do dot slash products grid.

And then down here we can remove this HTML and just use our component less than products grid slashgreater than and we

need to give it the products. So we'll

create a prop products equals curly brackets and we'll give it the products.

So, as you can see, this makes the code much cleaner when we separate it into smaller components. The last step is at

smaller components. The last step is at the top, we can remove this format money function since we're not using it anymore. Let's save

anymore. Let's save and let's open the website and make sure everything still works. So, that looks good.

Next, we're going to do the checkout page. So, we'll go back to our code

page. So, we'll go back to our code and we're going to open the checkout page and we're going to scroll to the top.

And I'll leave separating the checkout header as an exercise. But we're going to scroll down here and we can move the order summary section into its own

component. So, inside the pages folder,

component. So, inside the pages folder, I'm going to click it and create a new folder called checkout.

Now, you might have already done this if you did the exercises from the previous lesson, but we're going to use this folder checkout. And I'm going to move

folder checkout. And I'm going to move the checkout page inside here.

And update the imports and also move the CSS files.

And I'll make sure that the imports look good. So, in here at the top, make sure

good. So, in here at the top, make sure there's two dot dot slashes in front.

And inside app.jsx,

make sure that there is a checkout folder in front of this component. So

I'll go back to the checkout page and I'll create a new file. Let's call it the order summary.jsx.

And we're going to create export function order summary brackets and curly brackets. and we're going to

curly brackets. and we're going to return brackets the HTML for the order summary. Inside the checkout page, we're

summary. Inside the checkout page, we're going to scroll down and find the order summary. We can

collapse it and select this code and copy.

Inside the order summary, we'll paste and press control or command shift P and format document.

and we'll scroll to the top and we're going to need the delivery options and the cart inside here. So, we're going to get this from the props using curly

brackets, the cart, comma, and the delivery options.

And we also need dayjs and the format money function. So at the top we'll also

money function. So at the top we'll also import dayjs from day js and import curly brackets

format money from a string and we'll find the utils file which is

dot dot slash dot dot slash utils slashmoney and all the errors should now be gone.

We'll save.

And inside checkout page, we can remove this code.

And we can use our new component less than order summary /grater than. And we

need to give it the cart equals curly brackets and save the cart. And we need to give it the delivery options equals

curly brackets. And give it the delivery

curly brackets. And give it the delivery options. And we need to import this at

options. And we need to import this at the top. So we'll scroll up and here we

the top. So we'll scroll up and here we can import curly brackets the order summary

from a string dot slash order summary.

And we don't need dayjs anymore.

So let's save and check the website. And everything

still works.

We'll go back and scroll down.

And next, we can also move the payment summary into its own component. Feel

free to pause the video if you want to try it yourself first. So, inside the checkout folder, we'll click here and

create a new file, payment summary.jsx,

and we'll create the component export function payment summary brackets and curly brackets. and we'll return the

curly brackets. and we'll return the HTML.

Inside the checkout page, we're going to collapse this element and select the HTML and copy inside the payment summary. We're going

to paste control or command shiftp format document and we're going to scroll back up and we're going to get the payment summary

from the props. So curly brackets payment summary and we need the format money function. So up here import curly

money function. So up here import curly brackets format money from a string dot dot slash dot do/youutils/money

and save.

In the checkout page, we can remove this code and replace it with less than payment summary slashgreater than. And

we need to give this the payment summary equals curly brackets and save the payment summary.

And as you can see, our code is much cleaner now because we separated it into smaller components. So now we need to

smaller components. So now we need to import this. So, we're going to scroll

import this. So, we're going to scroll to the top and here we'll import curly brackets the payment summary

from a string dot slashpayment summary.

And we don't need format money anymore and save.

Let's go back to the website and everything is still working.

We'll go back to our code and we're going to go inside the order summary component.

So in here the code is still a little bit too complicated. So what we can do is we can find this element with the class delivery options and we can

separate this into its own component as well. Feel free to pause the video if

well. Feel free to pause the video if you want to try this yourself first. So,

I'm going to go to the checkout folder and create a new file and name it delivery options.jsx.

delivery options.jsx.

And we'll create a component export function delivery options brackets and curly brackets and return some HTML. And

back to the order summary. And here we can collapse this element and select it and copy.

Inside delivery options inside here we can paste. Control or command shiftp and

can paste. Control or command shiftp and format document.

And we'll scroll to the top. Here we

need to get the delivery options using the props. So curly brackets delivery

the props. So curly brackets delivery options.

And we're going to import format money.

So up here we're going to import curly brackets format money from a string dot

dot slash dot dot slash utils/money and we also need dayjs. So up here we'll

import dayjs from a string dayjs and I think we also need another thing here which is the cart item. So we're

going to get this from the props as well.

So up here we're also going to get the cart item and save.

And now in the order summary we can replace all this code with our component less than delivery options /grater than.

And we're going to give it the cart item equals curly brackets. save the cart item and give it the delivery options

equals curly brackets save the delivery options and we also need to import this. So at

the top we can import curly brackets the delivery options from a string

dot slash delivery options and save and let's check our website and make sure it still works. So that looks good

to me. So if we go back to our code, you

to me. So if we go back to our code, you can see that our code is cleaner now after we separate this into another component. And remember, it's up to us

component. And remember, it's up to us how we want to separate our components.

We can actually keep separating this into smaller components if we want. For

example, we can also have a cart item details component or a delivery date component, but I'll leave these as exercises. I'm also going to leave the

exercises. I'm also going to leave the orders page as an exercise, but we can just get started on it. So, here inside the pages folder, we're going to create

a new folder for the orders page. So,

orders and we're going to move this component inside here and update the imports.

And we're going to move this inside here as well. And just make sure the imports

as well. And just make sure the imports look okay. So in here, we'll scroll up.

look okay. So in here, we'll scroll up.

Make sure that these two have two dot dot slashes in front. That looks good.

And in app.jsx,

make sure that the orders page is now inside an orders folder. So we'll save this and open the website.

And we're going to click here to go to home and click here to go to orders. And

the orders page should still be working.

So I'll leave separating this as an exercise. We'll go back to our code and

exercise. We'll go back to our code and we'll save this into git. Inside the git section, we'll create the message

separate into smaller components and commit.

Next, we're going to go back to our files and we're going to go to our homepage.

and we're going to review async await.

Async await is a feature of JavaScript and it lets us write asynchronous code like normal code. Right now we're using

promises which means we need to use to wait for this code to finish and then run this function with async await. We

can actually write this like normal code. To do that in front of axios we

code. To do that in front of axios we can type await and space. So this is going to wait for this code to finish

and then it's going to move on to the next line. And now because we're waiting

next line. And now because we're waiting for this code to finish, we can actually save this result in a variable. So at

the front we can save it in const response equals await this code.

And now we don't need to use dot then anymore and we can remove it.

However, in order to use a weight, we need to be inside an async function. So

in front of this function, we need to add async and space. As you can see, async8 lets us write asynchronous code

like normal code or code that runs line by line. And async await makes the code

by line. And async await makes the code easier to understand. So in react it's recommended to use async await instead

of promises when we can. However, in

React there is a small problem with using async await and use effect. As a

review, when we put async in front of a function, this function will now return a promise. That's because this function

a promise. That's because this function has some asynchronous code inside or code that takes some time to finish. So

that means that this entire function is going to take some time to finish.

That's why it has to return a promise.

Now the problem is the inner function in use effect should not return a promise.

It should only return nothing or a cleanup function like this. A cleanup

function is useful if we want to do some cleanup when this component is removed.

So because this inner function is now returning a promise, it's sort of breaking the rules of use effect. To

solve this, we usually create a new function inside use effect like const get home data equals and create a new

function brackets arrow and curly brackets. And we're going to make this

brackets. And we're going to make this function async. And we'll leave this as

function async. And we'll leave this as an ordinary function.

And now we're going to move our code inside here. So we'll cut it and paste

inside here. So we'll cut it and paste it. And now because we're inside an

it. And now because we're inside an async function, we can now use a weight and it will also not mess up use effect.

At the end, we just need to run this function using get home data and brackets.

So this gets the same data as before but it uses async await. So remember when using async await inside use effect we need to create a new function and then

run the function otherwise it will break the rules of use effect. So let's save and check the homepage

and go to the homepage and everything still works. So let's go back

still works. So let's go back and we'll use async await in the app component where we get the cart. So here feel free

to pause if you want to try yourself first. We'll create a new function using

first. We'll create a new function using const. Let's call it fetch app data

const. Let's call it fetch app data equals a function brackets arrow and curly brackets.

And we'll move this code into the function. So we'll cut and paste and

function. So we'll cut and paste and we'll select this and press tab.

In front of the function we'll use async. And now we can use await inside.

async. And now we can use await inside.

So in front of axios we'll type await to wait for this to finish. And then we're going to save the result in a variable

const response equals this result.

And now we can remove and these brackets and the code is much cleaner. Finally,

we're going to run this function fetch app data and brackets and save.

And let's do the same thing in the checkout page. So we'll go to the

checkout page. So we'll go to the checkout page here.

Feel free to pause if you want to try it yourself. const fetch checkout data

yourself. const fetch checkout data equals brackets arrow and curly brackets

and we'll move this code inside cut and in here paste and select these lines and press tab and we're going to turn

this into an async function so we can use await inside. So in front of this request, we're going to await.

And we're going to save it in a variable let response equals. So we're going to use let

equals. So we're going to use let because we have two requests here and we might want to reuse this variable. And

I'll add a new line to make it a little easier to read. And now we can remove.

And then down here, we'll also use await to wait for this to finish. And we're

going to save the result inside response equals.

And now we can remove then.

And the last step is to run this function. So fetch checkout data and

function. So fetch checkout data and brackets and save.

We'll open the website. Make sure the homepage is working and then go to the checkout page and make sure this is still working. So that looks good to me.

still working. So that looks good to me.

We'll go back to our code and that's async await. It lets us write asynchronous code like normal code. I'll

leave converting the orders page to async aait as an exercise. So now we can save this into git.

We'll give it the message convert home and checkout to async await and commit.

In the next lesson, we're going to learn data mutation, which means instead of just getting data from the back end, we'll update data in the back end, and

we'll be able to add products to our cart and create orders. And that's the end of this lesson. In this lesson, we reviewed backend, which manages the data

for a website. We set up a backend for our project. We learned how to fetch

our project. We learned how to fetch data or get data from the back end. We

learned Axios, which is an easier way to make requests to the back end. We

learned how to generate the HTML using the data from the back end. We separated

our pages into smaller components and we learned async a weight which lets us write asynchronous code like normal code. Here are some exercises to help

code. Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to learn data mutation and we're going to make the website interactive. Data mutation

means we update data in the back end. If

we open the website and I'll close some of these other tabs.

If we go to the homepage, notice that right now we can only view the data. If we try to update this data,

the data. If we try to update this data, like we try to add to cart, it doesn't do anything. So, we're going to make

do anything. So, we're going to make this add to cart button work. We'll go

to our code and we're going to find the add to cart button. So, I'll open my files and I'm

button. So, I'll open my files and I'm going to go to the homepage and we're going to open the products grid.

And we're going to scroll down in this file to this add to cart button. The

first step is to make this button interactive. So at the end we're going

interactive. So at the end we're going to add an on click attribute equals curly brackets and give this a function

brackets arrow and curly brackets.

As a review on click is called an event handler. When we click this button it

handler. When we click this button it will run this function.

Now, inside here, we're going to add the product to the cart. So, we could try to update the cart here in React, but then we have to figure out where to save the

cart. Instead, in the real world, we use

cart. Instead, in the real world, we use the backend to update the cart and to save the cart. The advantage of using the backend is it will simplify our

React code and we can share the data in the back end. So if we access this website from another computer, we can access the updated cart using the back end.

So here to use a backend to add a product to the cart. We're just going to make another request to the back end.

We're going to go to the top and at the top we're going to import axios so that we can make another request.

and we'll scroll back down.

And when we click this button, we're going to make a request to the back end using axios. And this time we're going

using axios. And this time we're going to use post and brackets.

So previously we used axios.get

to get data from the backend. Post is a different type of request.

Is used to create data in the back end.

In this case, we are adding a product to the back end. So, we're creating a new cart item. That's why we use post.

cart item. That's why we use post.

Inside here, we're going to give it a URL path slash API/cart- items. So, notice this is the same URL

path that we used to get the cart. But

when we use post, the backend will behave differently. This will create a

behave differently. This will create a cart item instead of getting the cart items. Next, we need to tell the backend which

product to add to the cart. To do that, we can give axios.post another value which is an object.

When we use post, we can also send information to the back end using an object. And this is called the request

object. And this is called the request body. Now the back end needs to know two

body. Now the back end needs to know two things in order to add a product to the cart. First, it needs to know the

cart. First, it needs to know the product ID that we want to add. In this

case, this button is for if we scroll up, the button is for this product right here. So, at the bottom,

here. So, at the bottom, we're going to tell the back end we want to add this product ID to the cart. And we also need another

information which is the quantity that we want to add. For now, let's just use the quantity one. So this code will send a request to the back end telling it to

add this product to the cart with a quantity of one.

So now let's save this file and then we'll go to the website and we're going to go to this t-shirt product and we're going to click add to

cart.

And then we're going to refresh the page.

And now if we look at the cart here, we have one more product. The quantity is four. If we open the cart and we scroll

four. If we open the cart and we scroll to the bottom, notice that it added the t-shirt to the cart. So that's how we do data mutation or update data in the back

end. We just send a request to the back

end. We just send a request to the back end and the backend takes care of updating and saving the data. So, in the real world, we use the back end to

manage and update the data.

Next, notice that when we added this product to the cart, we had to refresh the page to see the new cart. It would

be better if we could just reload the cart and update the page without needing to refresh.

We'll go to our code and at the bottom, we're going to go to app.jsx.

app.jsx.

So here this code reloads the cart from the back end and it updates the state.

After it updates the state, React will update the page. So when we add a product to the cart, we just need to rerun this code and it will update the

page and then we don't have to refresh the page every time.

We're going to select this entire function and we'll cut.

And outside the use effect, we're going to paste it.

And now that it's outside the use effect, we can share this function with our components.

Now, let's actually rename this function to something more accurate like load cart. And in here, load cart.

cart. And in here, load cart.

And now we can share this with our components using a prop. So we're going to scroll down here and in the homepage we're going to give it the prop load

cart equals curly brackets and we'll give it the function load cart and save.

And now if we go to the homepage at the top, we'll get load cart out of the props and then give it to the

products grid component. So remember

this component contains the add to cart button. So in here we'll give it another

button. So in here we'll give it another prop load cart equals curly brackets and

give it the load cart function and save.

And now inside the products grid at the top, we're going to get load cart out of the props. And then if we scroll

back down, after we update the cart, we're going to call the function load cart.

So this means we will update the cart in the back end and then we'll get the new cart and update the page without needing to refresh.

One other thing we have to do here is remember axios.post

remember axios.post contacts the back end. So this is asynchronous code. It does not finish

asynchronous code. It does not finish right away. That means we need to wait

right away. That means we need to wait for this code to finish before going on to the next line. To wait for this to

finish at the front of this code we can type await and space. And remember in order to use await we need to be inside

an async function. So we'll add async.

And also this code is not inside a use effect. So we can just use async

effect. So we can just use async directly here like this.

After that load cart is also asynchronous. So it's a good idea to

asynchronous. So it's a good idea to await this code as well to be consistent. So now let's save

consistent. So now let's save and we'll check the website.

And first we'll go back to the homepage.

And this time let's click add to cart on this toaster. So we'll click add to

this toaster. So we'll click add to cart.

And now notice that the quantity here updated to five without needing to refresh. If we go to the cart and scroll

refresh. If we go to the cart and scroll down, it also updated the cart on the page without needing to refresh.

We'll go back to the homepage and we're going to make these quantity selectors work. So, this lets us add

selectors work. So, this lets us add more than one product to the cart at a time. We're going to go to our code,

time. We're going to go to our code, and first we need to get the quantity in the quantity selector. To do that, we're going to use a controlled input. We

learned controlled inputs when creating the text box in the chatbot project. So,

as a review, we'll scroll up and we're going to create a state to save the quantity. At the top, we're

going to import curly brackets use state from React.

And in this component, we're going to create a state const bracket equals use state and brackets.

And we're going to name the state the quantity, comma, and the updater function set quantity.

And we'll set the starting value of the quantity to one.

Then we're going to scroll down and we're going to find this select element.

So this element represents the selector on the page and we're going to give this two props. The first prop is the value

two props. The first prop is the value equals curly brackets and the value is the quantity.

The second prop is on change equals curly brackets. And we're going to give

curly brackets. And we're going to give this a function. So brackets, arrow and curly brackets.

And whenever we use an event handler like on click or on change, this function gets a parameter called event.

So event contains details about the event. In this case, the event will

event. In this case, the event will contain the quantity that we selected, which is one of these values. To get the quantity that we selected, we can use

event.target.

event.target.

value and let's save the quantity was selected in a variable at the front. We'll create

const quantity selected equals this value.

Now one thing to be careful of is this value is going to be one of these values here and these are going to be a string.

So we need to convert it into a number.

To do that around this value, we're going to use the code capital n number open bracket and close bracket.

So this will convert the string here into a number. So now that we have the quantity that we selected, let's save it

into the state using set quantity brackets quantity selected.

So this is called a controlled input.

When we have a value and an onchange property when we change the selector, it's going to set the quantity in the state and then the new state is going to be set as the value and then it updates

the page. So we're basically putting

the page. So we're basically putting react in the middle of this process so that we have access to the quantity that we selected. And that's a review of how

we selected. And that's a review of how controlled inputs work. And let's also

console.log log the quantity selected to

console.log log the quantity selected to see if it works. So, we'll save and we'll go to the website

and we're going to open the console with rightclick inspect and the console. And

now on the website, we're going to click the quantity selector here and we'll select three.

And now inside the console, it displays the quantity that we selected.

However, there is a problem here. Notice

on this website when we change one quantity selector, it changes all of them. So if I change this one here to

them. So if I change this one here to five, it changes all the quantities. So

let's fix this. We'll go back to the code.

And if we scroll to the top, this is happening because the state here is outside of this loop. So that means

the state is shared across all the products. That's why when we change one

products. That's why when we change one selector, it changes all of them. To

solve this problem, we need to move this state inside this loop so that each product has its own quantity. So, we're

going to select this code and cut.

And inside this loop, we're going to paste.

However, this code actually breaks the rules of React hooks. We can only put hooks at the top level of a component.

We should not put hooks inside a loop like this. To fix this problem, we can

like this. To fix this problem, we can separate each product into its own component.

So, inside the home folder, we're going to create a new file and we'll name it product.jsx.

product.jsx.

And we'll create a component for each product, which is export function product brackets and curly brackets. And

we're going to return the HTML for each product. Inside the products grid, we're

product. Inside the products grid, we're going to collapse this code. And this is the code for each product. So, we'll

select it and copy.

And inside the product component, we're going to paste and then control or command shiftp format document.

We'll scroll up and we'll go back to the products grid.

And we also need to copy over the state.

So we're going to select this copy and inside product at the top we're going to paste.

And we'll fix these errors. So first we need to import use state at the top. So

import curly brackets use state from react and the product we'll get it from the props using curly brackets product.

Scroll down we'll need the format money function as well as axios and load cart. So first

we'll import curly brackets format money from a string and we'll find dot dot slash do/youutils/money.

At the top we're going to import axios from axios and we'll get the load cart function

from the props. So, comma load cart and save.

So, now each product has a separate state. It has its own quantity. And this

state. It has its own quantity. And this

is no longer breaking the rules of hooks because this state is at the top level of this component.

We'll go back to the products grid.

And here we can remove this HTML and just use our component less than product /greater than and we need to give it the

product equals product and also the load cart function equals load cart

and we can remove this state and remember when we loop through an array we need to give it a key prop. So at the front here we'll set a key equals curly

brackets and we'll set it to the product id.

And finally we need to import this component. So we'll scroll up and at the

component. So we'll scroll up and at the top we'll import curly brackets the product component from a string and it's

right beside this file. So, we'll do dot slash product and we can remove these because they're no longer being used and save.

And since we have the key in this loop here, we can also go into the product

and remove the key in here and save.

Now, let's open the website.

And if we change one of these selectors, notice that each product can now have its own quantity.

Now that we have this quantity, when we add a product to the cart, let's use this quantity. We'll go to our code

this quantity. We'll go to our code and we're going to go inside each product and we're going to scroll down

to the add to cart button here. And

instead of adding a quantity of one every time, we're going to add the quantity that is saved in the state above. So now let's save

above. So now let's save and we'll try out this code. We'll open

the website and let's go to this plate product and we're going to select a quantity of three this time and we'll click add to cart.

And notice that the cart updated and it now has a quantity of eight, which is three more than before. If we open the cart

and we scroll to the bottom, we now have three of these plates in the cart. So

now the quantity selector is working.

Let's go back to the homepage.

And this time, let's try adding a product that already exists in the cart.

So, for the plate product, we're going to select the quantity of three again, and we're going to click add to cart.

Notice the cart quantity increased by three. And if we open the cart and

three. And if we open the cart and scroll down, instead of adding a new plate product, it just increased the quantity by three for a total of six. So

if the product already exists in the cart, the backend handles this situation for us and just increases the quantity.

Remember the purpose of the backend is to manage the data. By letting the backend manage and update the data, we can simplify our React code.

Let's go back to our code and we're going to do some cleanup in this component.

First, instead of doing quantity colon quantity, we can use the shorthand property syntax and just use the quantity. It does the same thing as

quantity. It does the same thing as before.

Next, instead of putting our event handlers directly in the HTML like this, we usually save this in a separate

function. So, let's select all this code

function. So, let's select all this code and copy.

And we're going to scroll up.

And at the top we're going to create a function const add to cart equals and we'll paste that code.

So we usually save the function separately like this. And then we can scroll down.

We can remove this code and just use the function name add to cart. And this

makes the code easier to read. Next,

we'll scroll up to the quantity selector. We can remove the console.log

selector. We can remove the console.log

and we'll move this into a separate function as well. We'll select this code and copy and we'll scroll up

and here we're going to create another function const select quantity and make it equal and we'll paste that code and

we'll use this function below. So down

here, instead of putting this function directly in the HTML, we use the

function name select quantity and save.

And that's it. We created the add to cart feature. In the final project,

cart feature. In the final project, there's a small message that pops up when we click add to cart, but I'll leave this as an exercise. Now, let's

save this into Git. We'll open the git section and let's use the message create

add to cart feature and commit.

Before we continue, I want to go back to the code that we wrote. So, we're going to scroll up in this component and I want to explain axios.post

a little more. As a review, when we send a request to the backend, we can set a URL path. Based on the URL path, the

URL path. Based on the URL path, the backend can do different things. For

example, if we use / API/roucts, the backend gives us the products. If we

use / API/cart items, the backend gives us the cart.

In addition to the URL path, every request also has a type. In the previous lesson when we did axios.get/api/cart

items, this actually sends the type get and the URL path/ API/cart items to the back end. So it sends two pieces of

back end. So it sends two pieces of information to the back end. The type

and the URL path.

When we did axios.post/appi/cart

post/api/cart items. This sends the type post and the URL path /api/cart items to the back end.

Now when the backend receives our request, it looks at both the type and the URL path to decide what to do.

For example, if the backend receives get and/api/cart items, it will get the cart items and return it. If the backend receives post

return it. If the backend receives post and/appi/cart items, it will create a new cart item.

So both the type and the URL path together determine what the backend does.

In the description, I have a documentation page for my backend, and it lists all the different requests

that my backend supports. Notice that

each request has a type and a URL path.

By the way, the type is also called a HTTP method.

When working with a backend, there are four common types of requests that we use. Get, post, put, and delete. Get

use. Get, post, put, and delete. Get

means we want to get some data. Post

means we want to create some data. Put

means we want to update some data and delete means we want to delete some data.

So, Axios has a method for each type.

Axios.get Get sets the type of request to get. Axios.post

to get. Axios.post

sets the type to post. Axios.put sets

the type to put. And axios.delete

sets the type to delete. And then

between the brackets, we put the URL path.

So in our code, this sends a request to the back end with the type post and the URL path/ API/cart items. So the most

important thing to remember here is that each request has a type and a URL path and both of these determine what the backend will do.

In the rest of this lesson, we'll get more practice sending different types of requests to the backend.

Next, let's go back to the website.

And inside the checkout page for each product, we have these delivery options.

So, we're going to add the ability to update the delivery option. Because

we're updating something in the cart, we're going to practice using a put request.

First, let's find the code for these delivery options. We'll go back to our

delivery options. We'll go back to our code and open our files.

and we're going to find the pages and checkout folder and we're going to open delivery options.jsx

delivery options.jsx and we'll scroll down and here each of these represents one delivery option on the page. So we're

going to put an on click property on this element. Now, usually we put the on

this element. Now, usually we put the on click on the input, but in this case, this will make only the radial selector clickable. Instead, we want the entire

clickable. Instead, we want the entire delivery option, including the text, to be clickable. So, that's why we're going

be clickable. So, that's why we're going to put the on click on the outside component.

So, we're going to add the on click attribute equals curly brackets. And

let's create a function for this. Above

this, we'll create a function with const and let's name it update delivery option equals. And let's make it an async

equals. And let's make it an async function brackets arrow and curly brackets because we know we're going to make a request to the back end to update

the delivery option.

Also, we create the function here inside of this loop because we need access to each delivery option.

So next to update the delivery option for a product, we're going to make a request to the back end. We're going to

scroll to the top and at the top we'll import axials from Axios and we'll scroll back down

and inside here according to my documentation my backend supports the request put/ API/cart items. This lets

us update the cart. For example, we can update the delivery option for a product.

So, we're going to do axios.put

brackets.

This sends a request with the type put to the back end. And we'll set the URL path to / API/cart-ite

items. And we'll add another slash. And

we're going to insert the product ID that we want to update here at the end of the URL path. So in my documentation, colon product ID is known as a URL

parameter. This means my backend wants

parameter. This means my backend wants the product ID we want to update inside the URL. This is just a naming

the URL. This is just a naming convention that is popular with backends. When we update something, we

backends. When we update something, we usually put the ID of what we want to update inside the URL. So here first we're going to change this to a template

string using back ticks and then at the end we'll insert dollar curly brackets and we're going to insert the product ID that we want to update.

So the product ID is saved inside the cart item. So inside here we're going to

cart item. So inside here we're going to insert the cart item product ID.

Next, we need to tell the backend which delivery option we want to update to. To

do that, we're going to give the backend some data. At the end of this, we'll add

some data. At the end of this, we'll add a comma and an object.

And in my documentation, this section tells us what data we can send to the back end. Here, we can send the delivery

back end. Here, we can send the delivery option ID that we want to update to.

So, we're going to give the back end the delivery option ID that we want to update to. So, if we scroll up here, we

update to. So, if we scroll up here, we want to update to this delivery option.

So, we'll tell the backend to update to the delivery option ID.

And after we update the delivery option, we're going to reload the cart and update the page.

So in front of this, let's wait for this to finish using await.

And remember, we created a function for reloading the cart called load cart. So

inside app.jsx,

we're going to share load cart with the checkout page. So down here we'll add a

checkout page. So down here we'll add a prop load cart equals curly brackets

load cart and save.

And then inside the checkout page at the top we're going to get load cart.

And now we need to share this with the delivery options. Now the delivery

delivery options. Now the delivery options are actually inside the order summary. So we're going to share it with

summary. So we're going to share it with the order summary first.

We'll scroll down to the order summary and here we're going to give it the load cart equals curly brackets load cart and

save inside the order summary at the top we're going to get from the props load cart and then we're going to

share it with the delivery options. So,

we'll scroll down to these delivery options and we'll give it the prop load cart equals curly brackets load cart and

save.

And finally, in the delivery options, we can get load cart from the props. So,

comma load cart and scroll down.

After we update the delivery option, we're going to await load cart and brackets so that we reload the cart and

update the page and we don't have to refresh to see the updates. Finally,

we're going to take this function and put it in this on click. So, update

delivery option and save.

Now let's go to the website and we'll try changing a delivery option.

And now you can see that it updates when we change the delivery option.

Now one last thing here is if we open the console, we're going to get this warning message saying we provided a check property without an onchange handler. So let's

fix this warning. We're going to go back to the code and the warning means that for an input element, if we have a checked prop, we

should also have an onchange prop. On

change lets us change the value of this input.

However, in our situation, we already use this on click up here to change the value of the input. So, we don't really need an onchange property. So in here to

get rid of that warning, we can just add an on change property equals curly brackets and give it an empty function.

And this will just make the warning go away. We'll save

away. We'll save and go back to our website.

And let's refresh.

And now if we change the delivery option and check the console, we no longer get that warning.

Next, we have another problem on this page, which is when we update the delivery option. The payment summary

delivery option. The payment summary here is not updating to show the new delivery price.

To fix this, after we update a delivery option, we also want to reload the payment summary. So, let's find the code

payment summary. So, let's find the code for reloading the payment summary. We'll

go to our code and we're going to open the checkout page and we're going to scroll up

and inside this use effect we have this code here that reloads the payment summary.

So we want to rerun this code after updating the delivery option. Now we

could separate this into a function and then share it like we did with load cart. However, we have an easier option

cart. However, we have an easier option here. Remember that in use effect at the

here. Remember that in use effect at the end we have this dependency array. So

this array determines when use effect runs. Right now it's empty which means

runs. Right now it's empty which means use effect will only run once. However,

we can put values inside this array. And

whenever a value changes, it will rerun the use effect. In our situation, we can put the value cart inside this

dependency array.

And now whenever the cart changes, it will rerun the use effect and update the payment summary. And that makes sense.

payment summary. And that makes sense.

Every time the cart changes, we do want to update the payment summary in case the cost of the order changes.

So in React there are often multiple solutions to do something and we should try to pick the cleanest solution.

Also note that this will cause the delivery options to be reloaded which is not really necessary. So we could separate reloading the payment summary

into another use effect but I'll leave this as an exercise.

So now let's save and we'll go to our website.

And now when we update the delivery option, notice that the payment summary also updates to show the new delivery price. And now this feature is working.

price. And now this feature is working.

So now let's save this into git. We'll

go back to our code and open the git section.

And here we'll use a message create update delivery option feature and commit.

Next, we're going to go to our website and we're going to work on deleting an item from the cart. So, we're going to practice making a delete request to the

back end. First, we're going to find the

back end. First, we're going to find the code for this delete link. We'll go to our code and in our files we're going to find the

order summary component and we're going to scroll down in this component and find the delete link. If

you did the exercises, this might be inside a cart item details component.

Now, for this delete link, we're going to add an on click attribute equals curly brackets. And we'll give this a

curly brackets. And we'll give this a function to run. Let's call it delete cart item. And let's create this

cart item. And let's create this function above. So, I'm going to scroll

function above. So, I'm going to scroll up and I'm going to create the function inside this loop because I need access

to this cart item to delete. So in here we'll create the function const delete

cart item equals a function.

And let's make this an async function because we know we're going to make a request to the back end. And first let's

import axios. So we'll scroll up and at

import axios. So we'll scroll up and at the top we'll import axios from a string axios.

And then inside this function, my backend can receive a request called delete/appi/cart items. And this will delete a product

from the cart. So we'll do axials dodelete and brackets.

This sends a request with the type delete to the back end. For the URL path, we're going to use a template

string and we'll do / API/cart- items slash and we're going to insert the product ID in the URL. Again, this

is just a naming convention that my backend uses. So, we're going to insert

backend uses. So, we're going to insert the ID of what we want to delete. In

this case, we need to give the backend the product ID we want to delete. So the

product ID is saved inside the cart item. So we're going to give the backend

item. So we're going to give the backend the cart item dot product ID. And that's

it. When my backend receives a request with the type delete and this URL path, it's going to delete this product from the cart. So after deleting the product,

the cart. So after deleting the product, let's reload the cart. First, at the front of this, we'll type await to wait

for this code to finish. And then we're going to await load the cart and brackets.

So, I have load cart already in the order summary. If you did the exercises

order summary. If you did the exercises from the previous lesson, you may need to pass this function into your component using a prop.

So, now let's scroll down. And that's

all we need to delete a product from the cart and then reload and update the page. Let's save.

page. Let's save.

We'll go to the website and we're going to delete this first product.

And notice it updates the cart and it also updates the payment summary. If we

delete another product, you'll notice it updates the cart and updates the payment summary. So that's how we make the

summary. So that's how we make the delete link work. I'll leave updating the quantity in the cart as an exercise.

So now let's save this into git. We'll

open the git section and then here we'll use the message create delete cart item

feature and commit.

Let's go back to the website.

And in the checkout page, we're going to add the ability to create an order. So,

first let's find the code for this place order button. We'll go back to our code

order button. We'll go back to our code and in our files, we're going to open the payment summary component and we're going to scroll down

to the bottom to this place order button. And to this button, we're going

button. And to this button, we're going to add a prop on click equals curly brackets. And we'll give it a function.

brackets. And we'll give it a function.

Let's call it create order.

And now let's scroll up and create this function. So up here

function. So up here we're going to create const and we'll name it create order equals an async

function brackets arrow and curly brackets.

Again we're going to make a request to the back end to create the order. So at

the top we're going to import axios from a string axios and in here for my back end we can send

a request with the type post and the URL path /api/orders to create an order. So we'll use the

code axios.post post

code axios.post post to make a request with the type post and then give it the URL path slash API/

orders.

And that's all we need. Remember the

cart is already saved in the back end.

So the back end can take that cart and create an order for us.

So let's wait for this code to finish using a wait.

And after we create an order, the back end will remove everything from our cart. So we also need to reload our cart

cart. So we also need to reload our cart here. First we need to get the load cart

here. First we need to get the load cart function and that can be found in the checkout page.

So here we get load cart from the props and we're going to share this with the payment summary. So, we'll scroll down

payment summary. So, we'll scroll down and in the payment summary, we'll share load cart using a prop load cart equals

curly brackets load cart and save.

And then inside the payment summary at the top in the props, we'll get comma load cart.

And now after we create an order, we're going to await load cart and brackets to

reload the cart and update the page.

Finally, after we create an order, let's also redirect to the orders page so we can see our new order. To do that, React Router provides a hook that lets us

navigate to another page or go to another page. At the top, we're going to

another page. At the top, we're going to import curly brackets use navigate

from React-Router.

And at the top of our component, we're going to use const

equals use navigate and brackets.

So use navigate gives us a function and this function lets us navigate to or go to another page in our app. So after we

create an order and we reload the cart, let's navigate to the orders page using navigate brackets and a string. And

we're going to navigate to slash orders.

Now, navigate is not asynchronous, so it finishes immediately and we don't need to await this code. Let's save.

And we'll go to the website and test out the place order button.

So, we could update the delivery option to get a shipping cost. And then click place order.

And now you can see that it created a new order.

You'll also see that it updated the cart. So, the quantity is now zero. And

cart. So, the quantity is now zero. And

it navigated us to the orders page.

Once we are on the orders page, there's some code at the top of the orders page that loads the orders from the back end and updates the page. And that's how

we're able to see our newest order here.

So, that's how we create an order. I'll

leave making these add to cart buttons work as an exercise.

So now we finished all the major features of our project. We can add products to our cart. We can update the cart and we can create an order. And

you'll see that in the real world, we use a backend to manage and update all the data.

And in our React code, we just make requests to the back end and then update the page. The advantage of letting the

the page. The advantage of letting the backend manage the data is that it will simplify our code a lot. So now let's

save this into git. Go to the git section and at the top we'll type make

create order button work and commit.

And now we finished all the major features of our project. In the next lesson, we'll learn how to create automated tests in React to make sure our code still works whenever we make

changes. And that's the end of this

changes. And that's the end of this lesson. In this lesson, we learned data

lesson. In this lesson, we learned data mutation, which means to update data in the back end. We learned different types

of requests like get, post, put, and delete. We sent a post request to add

delete. We sent a post request to add products to the cart and to create an order. We sent a put request to update

order. We sent a put request to update the cart. We sent a delete request to

the cart. We sent a delete request to delete a product from the cart. We used

the dependency array of use effect to update the payment summary whenever the cart changes. We learned the use

cart changes. We learned the use navigate hook which lets us navigate to another page using our code.

Thanks for watching so far. If you find this course valuable, you can support the channel by liking this video, leaving a comment, and subscribing.

You can also check out the premium version of this course where you'll get all the lessons ads free broken down into small videos, as well as additional lessons and more projects that are not

in the public React course. Currently,

the premium course contains 11 lessons, and I'll be adding more lessons in the future. You can also get a certificate

future. You can also get a certificate of completion, create comments or questions on specific topics, get progress tracking, search and course

notes. You can also check out the

notes. You can also check out the membership where you can get this course ads free separated by each lesson, AI videos, backend tutorials, and more.

Thanks again, and let's continue with the course. Here are some exercises to

the course. Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to add automated tests to our app. Automated

tests means using code to test our app.

This is more efficient than manually opening the app and clicking around to test it.

To create automated tests in React, we're going to use an npm package. The

two most popular packages for automated testing are justest and vest.

We're going to use VEST because it integrates well with Vit, but just and Vest are very similar. If you learn one, you can easily learn the other. First,

we're going to install Vest to our project. So, we're going to go to our

project. So, we're going to go to our command line and open the tab that's running the front end. And we'll stop

the VIT server using C.

And we're going to npm install dash save-dev test.

So, save dev means that vest is only for development. This package is not needed

development. This package is not needed to run our app or to run our website.

And we're also going to add at to give vest a specific version. So you can click this link in the description, go to lesson 9, and here you'll find the

version of Vest that we'll install. So

we'll copy that version and then paste it in here and press enter to install VEST.

Now that we installed Vest, we're ready to create our first automated test. So

there are different types of automated tests that we can create. The first type is called unit tests. A unit test means

we test one unit or one piece of the code. For example, if we look at our

code. For example, if we look at our files and we open our utils folder and open money.js JS.

If we test a function like format money, this would be considered a unit test because it's just one piece of the code.

However, if we test something like the product component here, testing components like this are not unit tests because they use many different pieces

of code together.

So, we'll start by creating unit tests for format money.

So, we're going to go to this money.js file, and beside this file, we're going to create a new file for the tests. And

we'll name it the same money, but this time we'll end with test.js.

So, the naming convention is to put it beside the original file and end it with test.js.

test.js.

Now inside this test file at the top we'll import curly brackets it

from a string v test.

So it lets us create a test and we'll also import the format

money function from a string and import it from this file dot / money.

And now to create our first test, we're going to use it and brackets and we'll give this a string.

So this creates a test and the string here is the name of the test. So this

describes what we are testing. So let's

give it a name like formats1 1999 cents as $119.99.

If we run format money with 19.99, it should give us $119.99 as the result. So this name is describing what we want to test and a

naming convention is to make this read like English. For example, it formats 1

like English. For example, it formats 1 1999 as 19.99.

And then we're going to give this a function brackets arrow and curly brackets.

And in here we're going to test if format money works correctly.

To do that, we're also going to import expect from vest. So expect lets us check if the result is correct. So in

here we're going to run expect and brackets.

And in here we put the code that we want to test. For example, let's put the code

to test. For example, let's put the code format money brackets and 1 n99.

And then expect has different methods that we can use to check this result.

One method is called dot to b and brackets.

So in this second bracket we can put the expected result of this code. So we said that the expected result should be this string here. So we'll give it

string here. So we'll give it dollar19.99.

So this code tests if this value is equal to this value. If they are equal, this check has passed. If they are not

equal, this check has failed.

And then expect is going to send this result to vest. and V test will display a summary of what passed and what failed.

So now let's run this test. We're going

to save this file and then in our command line, we're going to create a new tab for running the tests.

And first we have to be inside the e-commerce project folder. So we'll cd ecommerce dash project

and we're going to run npx vest.

So v test is going to search our code for all the files that end with test.js and runs the tests inside and then it

displays the result in the command line.

So this tells us that our format money test here has passed.

Now let's create another test for format money. We'll go back to this test file

money. We'll go back to this test file and to create another test, we're just going to use it again

and a string. And remember that we had some problems with money not showing two decimals.

So let's test if it displays two decimals and give it a function.

And now inside here we can run expect and brackets format money brackets. And let's give it

a value that might not show two decimals like 1 090.

And then we'll check if this is correct using 2 tob and brackets and a string. And the

expected result of this code should be dollar 10.90.

So we're going to check if this result is equal to this result. If we save, vest is actually watching our files for

changes. So when we save it will

changes. So when we save it will automatically rerun our tests. And now

you can see we have two tests that passed.

Next inside each test we can have multiple checks. So in here let's add

multiple checks. So in here let's add another check using expect brackets.

And let's try format money brackets with a different value like 100. So we expect

this to be dollar1.00.

So we'll do 2v brackets dollar 1.0 and save.

Now v test will rerun all of our tests.

And now you can see that both tests still passed. So when we have multiple

still passed. So when we have multiple checks like this, all of the checks have to pass in order for this test to pass.

If one of these checks fails, the entire test will fail and it will show up here.

So as a quick example, if I change this and save, one of these checks failed. So we can see that this test has failed. So I'm

going to add it back and save.

Next, if we look at our file here, notice that these tests are related to the format money function. A best

practice is to group these tests together. To do that, at the top, we're

together. To do that, at the top, we're also going to import describe from vest. So, describe groups test

from vest. So, describe groups test together. we call a group of tests a

together. we call a group of tests a test suite.

So above these tests, we're going to use the code describe and brackets and we'll give this a string

and this is the name of the test suite or the group of tests. So these tests are for the format money function and

we'll give it a function brackets arrow and curly brackets and we're going to move our test inside.

So we'll select it and cut and paste and save and everything still passes

and we can see the test suite name over here. So test suites basically help us

here. So test suites basically help us keep our tests more organized. If we

want to test a different function inside this file, we would create another test suite and group our tests in there. So a

best practice is to always put our tests inside a test suite, even if we only have one test suite. So now let's save this into git. We're going to go to the

get section and let's use the message create unit test for format

money and commit.

Next, we'll create another type of test called an integration test. Integration

test means we test multiple units or pieces of code working together.

For example, if we look at our files and we open the product component, testing a component would be considered

an integration test. Notice this uses multiple pieces of code like the format money function and the load cart function.

So now let's create tests for this file.

Beside product.js, we're going to create a new file and we'll name it product.est.jsx.

So we end with JSX this time because this will let us use component syntax in this file like this.

So, first let's actually copy the imports from our money test file because we're going to be using these again. So,

we'll copy and in here we'll paste, but this time we're going to import the

product component from the dot /rouct file.

And first we're going to create a test suite. So we use describe brackets and a

suite. So we use describe brackets and a string. And we're going to be testing

string. And we're going to be testing the product component.

And give this a function.

And inside we'll create our first integration test using it brackets and a string.

And for components, the first thing we can check is if the component is displayed correctly. So for the product

displayed correctly. So for the product component, we can check if the name is correct, the image is correct and so on.

So we'll name this test it displays the product details correctly.

And we'll give it a function.

And now inside here, how do we check if this component displayed the details correctly? So when testing a function,

correctly? So when testing a function, we run the function and check the result. When testing a component, we

result. When testing a component, we render the component and check the result. So render means to display the

result. So render means to display the component on the page. To render the component in our test, we need to add

some more npm packages. So, we're going to go to our command line and right now vest is watching all of our files for

changes. So, we're going to stop vest

changes. So, we're going to stop vest using C or you can press Q to quit.

And now we're going to click this link in the description, go to lesson 9, and we're going to install all of these npm packages that we need. So, we're going

to select this and copy. And then in our command line, we're going to paste this command and press enter to install all these

packages.

After installing, we also need to create some config files to test our components. So, we'll go to our files

components. So, we'll go to our files and we'll scroll down and find vit.config.js

vit.config.js and click it. And we're going to create a new file and name this vtest.config.js.

vtest.config.js.

And we'll click this link in the description and go to lesson 9. We're

going to copy this setup code. So we're

going to select this and copy.

And then in here we'll paste that code and save.

And we're also going to create another file beside this.

So here create a new file called setup capital T tests.js.

And we'll click the link in the description again and go to lesson 9.

And we're going to copy this code and paste it in here and save.

So that's just some setup that we need to do. If we look at this config file,

to do. If we look at this config file, you don't have to worry too much about how this works. This is just some standard setup. These two are required

standard setup. These two are required for component tests or integration tests to work. And this basically runs the

to work. And this basically runs the code inside this file before all of our tests. So in this file we import just

tests. So in this file we import just DOM and this basically adds a bunch of methods to expect that help us test components.

Now that we have the setup, we're going to go back to our test and at the top we're going to import

curly brackets render from the package at testing- library/react.

So this renders or displays a component in a fake web page specifically for testing.

Inside our test, we're going to use the render function and brackets and we'll tell it to render the product

component using less than product slashgreater than.

So next the product component has some props. So we need to provide these props

props. So we need to provide these props in our test. So in here we're going to add the prop product equals curly brackets

and we're going to provide a sample product to test with. To do that in our files we're going to go to the starting code folder and open the data folder and

open products.js.

open products.js.

And here we have a bunch of sample products that we can use. So, let's just select the first product and copy it.

And then in our test, we're going to save the sample product in a variable const product equals and

paste.

And we're going to take this product and save it as the product prop.

Next, we also need to provide a load cart function to this component. So in

our app, load cart actually contacts the backend. However, in our tests, we

backend. However, in our tests, we should not contact a real backend because the backend might not be available during tests. In our tests

might accidentally update real data. So

instead, a best practice is to mock this function in our tests. Mock means to create a fake version of this function.

To create a mock at the top, we're going to import vi from vest.

And we'll scroll back down and we'll create const load cart equals vi.fn. fn

and brackets.

So vi.fn

basically creates a fake function that doesn't do anything. So, this fake function is called a mock and we're going to give this mock to the

component. So, here we'll create a prop

component. So, here we'll create a prop load cart equals curly bracket and our mock load cart. And this will prevent

our component from accidentally contacting the back end in our tests.

And that's it. This will render the product component on a fake web page. So

now, how do we check if this component was displayed correctly? We can't see the fake web page, but we can check it using our code. To do that, we're going

to scroll up and we'll also import the screen from testing library/react.

So screen lets us check the screen or the fake web page to see if everything was rendered correctly

in our test. After we render the component, we're going to use screen and the method

get by text and brackets.

So this searches the screen or the fake web page for an element with a specific text. So we'll give it a string

text. So we'll give it a string and first let's check if the product name is displayed correctly. So, we'll

scroll up and we're going to copy this product name.

And then in here, we're going to paste.

And this will search the screen or the fake web page for an element with this text inside.

So, now we're going to check if this element exists. That will tell us if we

element exists. That will tell us if we displayed the correct product on the page. To do that before this code, we'll

page. To do that before this code, we'll use expect and open bracket

and at the end a close bracket and we'll use the method dot to be in the document

and brackets.

So this method is added by testing library/jestdom and this checks if this element exists

on the screen or on the fake web page.

So now let's save and we'll run this test using vest in the command line. We'll run npx v test.

And all of our tests passed.

Next, let's add some more checks to this test. So, let's also check if the price

test. So, let's also check if the price was displayed correctly. So, here we'll add another expect brackets and we'll

use screen.get get by text

use screen.get get by text and a string and we're going to search for the price on the screen. So for the

sample product, the price should be dollar10.90.

So, we'll scroll down and search for dollar 10.90 on the screen. And we

expect this dot to be in the document and brackets and save

and feed will rerun the test and tell us that this passed.

Next, let's check if the product image is correct.

So down here we'll use another expect brackets screen dot but this time we can't use get by text because we're trying to find

an image. Instead we're going to add a

an image. Instead we're going to add a test ID to the image element. So in our files we'll open the product component

and we're going to scroll down until we find the product image here.

And for this element, we're going to add an attribute data-

test id equals a string product dash image. So this ID lets us find the image

image. So this ID lets us find the image element in our tests. We could also use the class name to find this element, but if we change our class name, it will

break the test. To avoid this, we usually use an ID specifically for testing like this. So now let's save.

And in our test, we'll use screen dot get by test ID and brackets and a string

and the test ID product dash image. So

this will give us the image element in the product component.

Now let's check if this image element source attribute is equal to the products image up here. So we'll select

this image and copy and then down here

dot to have attribute brackets and we'll check the source attribute if it's equal to the string

and paste the image from our sample product and Save V test will rerun our tests and

everything passed. So we know we're

everything passed. So we know we're displaying the correct image.

Next, let's check the ratings image and the rating count. Feel free to pause if you want to try it yourself first. So

first we'll do expect open bracket the screen dot and we'll check the ratings image first.

So, we'll go to the product component and we're going to scroll down until we find the image product rating stars and

we'll give this a data dash test id equals

product rating stars image and save.

And let's just select this test ID and copy.

And in our test, we'll get by test ID brackets a string

and paste.

And we expect this dot to have attribute brackets the source attribute equals a string.

And we'll go back to the product component.

And let's just copy the source attribute here. So we'll select it and copy.

here. So we'll select it and copy.

And inside our test we're going to paste.

Now for our sample product we have a rating of 4.5.

So that means we take 4.5 and multiply it by 10. We're going to get the value 45.

And this is the rating image that should be displayed on the page. So we'll save.

And v test tells us everything passed.

Finally, let's check the rating count.

So we'll expect brackets screen dot. And

this time we're looking for text. So we

can just use get by text brackets. And

for this sample product, the count is 87.

So we'll look for the string 87.

And we expect this to be in the document and save.

Vest will rerun and everything passed.

So now we tested if the product component displayed all the details correctly. So let's save this into git.

correctly. So let's save this into git.

We'll open the git section and we'll use the message create integration test for product component

and commit.

Next we're going to test user interactions.

In the product component, we have an add to cart button. We can also test clicking this add to cart button to see if it behaves correctly.

So in our test file, let's create a new test using it brackets and a string. And

let's name it adds a product to the cart and give it a function.

So first let's render the product component again. So we'll scroll up

component again. So we'll scroll up and let's just copy all of this code. So

we'll select it to here and copy.

And then in our second test, we're going to paste.

So this sets up the sample product and the mock and then renders the product component again. So now that we rendered

component again. So now that we rendered this, how do we click the add to cart button in our test?

Earlier we installed a package called testing library/ user event. This

package lets us simulate events like clicking a button. So at the top of our test, we're going to scroll up and we'll

import user event from the package at testing- library/ user-event.

So this lets us simulate events like a click.

So now we'll scroll back down to our test and first we need to set up user event

using const user equals user event dot setup and brackets.

So now we can simulate events using user.click.

user.click.

So this simulates a click event and inside the brackets we're going to tell it which element to click. So we want it to click the add to cart button. So

first we need to get the add to cart button inside our test. We'll go to our files and in the product component,

let's scroll down to the add to cart button and we're going to give this a

data dash test ID equals a string add to cart button.

And let's select this test ID and copy and save.

And then in the product test, we're going to get the button using screen dot

get by test ID brackets and a string and we'll paste the test ID.

So this will get the add to cart button from the screen.

So let's save it in a variable const add to cart button equals and we're going to give this to

user.click

user.click add to cart button.

Next when we click this button it takes some time for the page to process the click. So user.click takes some time to

click. So user.click takes some time to finish. That means this is asynchronous

finish. That means this is asynchronous code and it returns a promise. To wait

for this to finish at the front, we're going to use await.

And remember to use await we need to be inside an async function. So above in this function, we're going to make it

async.

And we'll scroll back down.

And now once we click the add to cart button, this is going to make a request to the back end using axios.post.

But remember in our tests we should not contact a real backend because we might accidentally update real data.

So earlier we mocked load cart and replaced it with a fake function.

Now we're also going to mock axios. So

we can actually mock an entire npm package. To do that at the top,

package. To do that at the top, we're going to use the code vi mock brackets

and the string axios.

So this mocks the entire axios package.

This means that when we are testing, when we import from axios, we will get a fake version of axios instead.

So when we click add to cart, it will use the fake version of Axios and it will do nothing. It will not contact the

back end. So now what should we test? We

back end. So now what should we test? We

can still test that our code ran axios.post

axios.post and we can test if we gave axios.post

the correct values.

To do that at the top, we're also going to import Axios from the package Axios.

And because of vi.mmock,

this is a fake version of Axios.

So now we can scroll back down and after we click add to cart, we can

expect brackets axios.post. post.

If we give a mock to expect, we can check if our code ran axios.post

and if we gave it the correct values using the method dot to have been called

with and brackets.

So we expect our code to call axios.post

with /api/cart items. So in here we'll check if the first value we gave it was slappi/cart- items

and we also expect our code to give axios.post an object with a product ID

axios.post an object with a product ID and a quantity.

So in here we can also check if we give it an object with a product ID colon and we're going to get the product ID of our

sample product. So here we'll select

sample product. So here we'll select this ID and copy and scroll back down

and create a string and paste the ID and we expect the quantity colon to be one because we did not change the

quantity selector.

So this basically checks that when we click add to cart does our code run axios.post post and give it these

axios.post post and give it these values. So even though mocks don't do

values. So even though mocks don't do anything, we can still check if we called them and we gave them the correct values.

Next, we can also check if our code ran load cart. So remember that load cart is

load cart. So remember that load cart is also a mock. So we can see if our code ran load cart. So down here we can also

expect load cart and we don't give load cart any values. So we can just use dot2

any values. So we can just use dot2 have been called and brackets.

So this just checks if our code called load cart and does not check what values we gave it. So now let's save

and v test will run our code and everything still passed. So that's how we test user interactions. We create

some mocks and then we check if our code ran the mock and gave it the correct values. So now let's save this into git.

values. So now let's save this into git.

In the get section, we'll use a message test clicking add to cart button and commit.

Before we move on, we're going to do some code cleanup. Notice that in each of our tests, we have some setup code at

the top where we create some sample data and mock load cart. So we can actually share this setup code between our tests.

To do that, we can move these two variables outside of this it function.

So we'll select this code and cut.

And outside of this function, we'll paste.

Now that these two variables are outside of this function because of scope these can be accessed anywhere inside this

outer describe function. So that means it can be accessed in both tests. So in

the second test we can just remove this setup code because now it's shared between the two tests up here.

Another recommendation is to recreate shared variables before each test because if one test modifies a variable, that change is going to carry over into

the next test which can cause bugs.

So before each test, we're going to recreate these variables.

To do that, we can use before capital E each brackets. And we'll give this a

each brackets. And we'll give this a function brackets arrow and curly brackets.

So before each runs some code before each test and also we need to import before each.

So at the top we'll import before each from vest.

So we want to recreate these shared variables before each test. So we're

going to do that in here. Inside we'll

use product equals and let's just select this value and cut.

And in here we'll paste.

And because we're modifying this variable, we need to change from const to let.

And we'll also recreate load cart in before each. So here we'll do load cart

before each. So here we'll do load cart equals vi.fn

equals vi.fn and brackets and above we can remove this

and change this to a let.

So now before each test we're going to recreate the setup code and we'll have a fresh set of variables and this will make our tests more consistent. So now

let's save.

V test will rerun our test and everything still passes.

So before each is known as a test hook.

There are other test hooks that we can use to help us do some setup or some cleanup in our tests.

So now let's save this into git. In the

get section, we'll use the message use before each to remove duplication and commit.

So, we just learned how to create mocks that don't do anything. Now, we're going to learn how to mock the implementation.

Mock the implementation means we make the mock do whatever we want. To do

this, we're going to test another component. So in our file,

component. So in our file, we're going to go to the homepage component.

And here we're going to create a new file and name it homepage.est.jsx.

And let's just copy all the imports from the product component test because we'll use most of them. So we'll select this and copy.

And in homepage.test

we're going to paste.

And this time we'll import homepage from dot /home page.

And as always, we'll start by creating a test suite with describe.

And we'll name this homepage component and a function.

And we'll create a test using it brackets. And let's call it displays the

brackets. And let's call it displays the products correctly.

Brackets, arrow, and curly brackets.

And now let's render the homepage using render bracket less than homepage slashgreater than.

And the homepage requires two props cart and load cart. So for the cart equals curly brackets. We're not going to test

curly brackets. We're not going to test the cart right now. So we'll just set it as an empty array.

And for load cart equals curly brackets again we'll mock load cart. So above

this test we'll create let node cart and we'll use before each brackets

and a function brackets arrow and curly brackets and we'll set load cart equals a mock

function vi.fn Fn and brackets

function vi.fn Fn and brackets and we're going to give this mock to the homepage component.

Next, the homepage component is special.

If we open the homepage, notice at the start, we load products from the back end using axios.get/appi/roucts.

axios.get/appi/roucts.

Again, in our test, we should not contact a real backend. So, we're going to mock Axios.

So here at the top, we'll mock Axios using vi.mmock

vi.mmock brackets and the package axios.

Now, this just makes axios.get do

nothing. However, in the homepage, we actually need axios.get get to return something because we're going to return a response and the homepage is going to

use this response to display the products. So here axios.get cannot just

products. So here axios.get cannot just do nothing. We need to mock the

do nothing. We need to mock the implementation which means we're going to make axio.get do whatever we want.

So in our test inside before each we're going to do axials.get

dot mock implementation and brackets and we're going to give this a function

brackets arrow and curly brackets.

So this means that in our code whenever we use axios.get get it's going to run this fake function instead. So basically

we can make axios.get do whatever we want. That's what mock implementation

want. That's what mock implementation means.

So remember we can give axios.get some

values. Those values are going to be saved as parameters in here. So the

first value we give to axios.get is the URL path. So in here our fake function

URL path. So in here our fake function will also get the URL path.

Next inside our fake function let's check if the URL path is equal to the string /

products.

So for the URL path /api/proucts, usually the backend returns all the products in an array. But in our test, we don't really need all the products.

So let's just return two products to test with. So in here, we'll just return

test with. So in here, we'll just return two products. Now, whatever we return

two products. Now, whatever we return from this fake function should match what axios.get normally returns. So

what axios.get normally returns. So

axios.get

normally returns a response with a property data. So in our test

property data. So in our test this mock implementation should also

return an object with a property data.

And normally response data is an array of products.

So in our test, our data property should also be an array.

So basically in this fake function, we should match what axios.get normally

returns. And this makes sure that the rest of the code still works with our mock.

So now in our test, let's just return two products to test with. to find two sample products. We

with. to find two sample products. We

can go back to the starting code folder and the data and the products.js.

And here, let's just collapse the first two products and we'll select them and copy.

And inside the homepage test, we're going to paste.

So now in our test, axio.get get will return these two products.

Now there's one more thing we need to do which is remember that axios.get

normally returns a promise that we have to await. So in our test we should also

to await. So in our test we should also return a promise. To make this return a promise we can wrap this value in

promise.resolve like this. Or an easier

promise.resolve like this. Or an easier way to do this is to make this function async.

So remember that async makes a function return a promise.

Now axios.get will return exactly what we want. And that's how we mock the

we want. And that's how we mock the implementation which means we make the mock do whatever we want.

Now let's run our tests to make sure that this works. We'll save

and v test will rerun and we actually got an error. So if we look at this error and we scroll up

to the details of the error, you'll see that we got this error here and it came from React Router. And this happens because if we look at our homepage

component, remember that the homepage also contains a header component. And if we open the components folder and the header

component, inside the header component, we have these link components.

In order for a link components to work, they need to be inside a router. In

main.jsx, JSX the entire app is inside a router. So that's why link components

router. So that's why link components work normally but in our test our homepage component is not inside any router. So the link component doesn't

router. So the link component doesn't work and it creates an error. To fix

this we just need to put a router around the homepage in our test. So, we'll go back to our test

and first we'll scroll to the top and we're going to import a router. So,

we'll import curly brackets and we're going to import the memory router from the package react-outer.

So, the memory router is specifically for testing.

So we'll scroll down and when we render the homepage, we're going to put it inside a memory router.

So less than memory router and we'll select the homepage and cut.

And in here we'll paste and we'll fix the indenting.

And now if we save the link components are inside a router.

And now our tests should pass.

Now let's check if the homepage displayed the products correctly. So

after we render this homepage because we mocked Axios to return these two sample products, there should be two products

on the page. Let's add a test ID to these elements so we can get them in our test. In the product component,

test. In the product component, we're going to scroll up to the top of the HTML and we're going to find the product container

and we're going to add the attribute data- test id equals a string the product dash container

and save.

And in our test, we're going to look for the test ID using screen.get

using screen.get all by test ID and brackets and the test

ID product dash container.

So we use all here because we're going to have multiple products on the page.

So we're going to get multiple product container elements.

However, there's actually a problem here.

When the homepage is first created, the products are empty. So, there will not be any products on the page. And we need to wait for the homepage to run use

effect and load the products and then update the state. So to wait for homepage to finish loading in our test, we're going to use a different method

called find all by test ID.

So find does the same thing as get, but it will wait until it finds this element.

So this is useful when our component needs to load something and we need to wait for it to load. Now, because this code is waiting until it finds these

elements, this code is asynchronous and it returns a promise. So, we're going to wait for this code to finish using a

wait. And again, to use a wait, we need

wait. And again, to use a wait, we need to be inside an async function.

So now this will wait until it finds these product containers. And then let's save these in a variable using const

product containers equals this result.

And now we can check this result to see if it was displayed correctly. So down

here let's check if we have two product containers on the page. So we can expect

brackets the product containers.length

dot 2b 2.

So this gives us an array of elements and we're just checking if the length is equal to two. If we save,

v test will rerun. And now this test passed. So we know we're displaying the

passed. So we know we're displaying the correct number of elements on the homepage.

Next, we'll check inside each product container to see if they have the correct product name. Now, before we used screen get by text to search for

some text on the page. However, this

searches the entire page. Here we want to check specifically the first product container to see if it has the correct

name. To do that we can use a feature

name. To do that we can use a feature called within. So we'll scroll up

called within. So we'll scroll up and here we're also going to import within

from testing library/react.

And we'll scroll back down.

And within lets us find things within or inside a specific element. So to find things inside the first product

container, we're going to use within brackets the product containers square bracket zero.

This gives us the first product container and we're going to search inside this container. And then here we're going to do dot get by text and

brackets.

And for the first container, we're going to search for the first product name. If

we scroll up, this is the first product name. So we'll

select it and copy.

And down here, we're going to paste.

So again, this searches inside the first product container for this text. And

I'll add a new line to make it a little easier to read. And now we expect this to exist. So here we'll type expect open

to exist. So here we'll type expect open bracket and just going to reformat this code a little bit and at the end close bracket

and use 2B in the document and brackets.

Now let's save and v test will tell us that this passed. So, we know we're displaying the

passed. So, we know we're displaying the correct product in the first product container. Now, let's check the second

container. Now, let's check the second product container. We'll select this

product container. We'll select this code and copy.

And down here, paste.

And we'll change the zero to a one. This

gets us the second product container.

And we're going to get the second product name. So up here, we're going to

product name. So up here, we're going to select this name and copy and scroll back down.

And here we're going to paste and save and the test passed. So now we know that the second product container is

displaying the correct product. Now we

could check all the other details of the product as an exercise. However, we

don't have to do it because remember that all the product details have already been tested in the product component test.

So instead for the homepage component, we focus on testing things that are specific to the homepage such as rendering multiple products and loading

products using Axios.

So that's how we test a more complicated component like the homepage. We need to mock the implementation of axios.get

and we may need to wrap the component inside a router. I'll leave adding more tests for the homepage as an exercise.

So now let's save to git. We'll open the git section and we'll use the message

create integration test for home page and commit.

So now whenever we make changes to our code we can run these automated tests to make sure that format money the product component and the homepage are still

correct. Now, usually we create tests

correct. Now, usually we create tests for all of our components, but I'll leave that as exercises.

In the next lesson, we'll learn deploying, which means how to put our React app on the internet.

And that's the end of this lesson. In

this lesson, we learned how to create automated tests with VEST. We learned

how to create unit tests, which test one piece of the code. We learned it, expect, and describe, which lets us create a test, check the results, and

group the tests together into a test suite. We learned how to create

suite. We learned how to create integration tests, which test multiple pieces of code working together. We

learned how to test a component using render and screen. We learned how to create a mock, which is a fake version of a function or a package. And we learn

how to mock the implementation, which means we make a mock do whatever we want.

Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to learn deploying, which means how to put a React app on the internet. So, there are many services we can use to deploy. In

this lesson, we're going to use AWS or Amazon Web Services. AWS is the biggest service for putting websites on the internet. Most big tech companies use

internet. Most big tech companies use AWS, so it's the most useful to learn for your career.

So AWS stands for Amazon Web Services.

It's a collection of services that help us put stuff on the internet. And AWS

has a free tier where we can use many of their services for free using some credits.

So, let's click this link in the description. Go to lesson 10.

description. Go to lesson 10.

And here we have a link to AWS.

Now, before we begin, AWS might change their website design in the future. If

you have any issues, please check this AWS troubleshooting guide here.

Now, let's get started with AWS.

We'll click this link to open AWS.

And the free tier is free for new accounts. So, we're going to create a

accounts. So, we're going to create a new AWS account. If you don't see this, you can also click sign in

and then scroll down and click create a new AWS account.

Before we continue, because AWS is the biggest web service, it has to follow a lot of security and compliance regulations. So, even though it has a

regulations. So, even though it has a free tier, it will ask you for a credit card, billing address, and phone number when signing up. If you're unable to provide this information, please check

the AWS troubleshooting guide in the description.

However, I still recommend at least watching this tutorial to see how AWS works since it's the most useful for your career. So, here we'll enter our

your career. So, here we'll enter our email address for logging in. So, for

me, I'll use this email and then we'll go through the rest of the sign up process.

After signing up, it might take a few minutes for the account to be activated.

So, we just need to give it a bit of time.

Now that we created a new AWS account, one thing to note is when signing into AWS, if you see an account ID and I am here,

we're going to click this sign in with root email button.

And then here we can sign in with the email and password we created earlier.

After signing in, you can see the details of the free tier here or by clicking here.

After we sign in, we're going to land on this AWS dashboard. So, as I said, AWS is a collection of services that help us

put stuff on the internet. So, here we can see all the services that are part of AWS. And there's a lot of services.

of AWS. And there's a lot of services.

At the top in the search bar, we can search for a service. So, we're going to start with the most basic service called EC2.

And click here to open it.

EC2 stands for Elastic Compute Cloud. It

basically lets us rent a computer from AWS.

Earlier in the course, I mentioned that many websites use a backend to manage the data and the backend is another computer on the internet. Now, we could

buy a physical computer ourselves and use that as the back end, but then we have to keep this computer running 24 hours a day and put it in our office

somewhere. So this is a lot of work and

somewhere. So this is a lot of work and what most companies do is they just rent a computer from AWS and AWS will manage

the computer and keep it running 24 hours a day and this saves a lot of work. So EC2 basically lets us rent a

work. So EC2 basically lets us rent a computer from AWS. This is called infrastructure as a service or IAS. This

means that AWS manages the infrastructure or the computers for us.

So to rent a computer in here, we can click the instances section and then click launch instance. By the way, one

instance is one EC2 computer.

However, we're not going to use this because there's still some problems with this process. EC2 just gives us a

this process. EC2 just gives us a computer. We still need to install

computer. We still need to install NodeJS on this computer. We still need to connect this computer to the internet. And we need to upload our code

internet. And we need to upload our code to this computer. So even though AWS manages the computer, there's still a lot of manual work we have to do. To

solve this problem, AWS provides another service.

At the top, we're going to search for elastic beantock and click here to open this service.

You can think of elastic beantock as a layer on top of EC2. It uses EC2 to rent a computer, but it also installs all the

software we need on this computer and it connects the computer to the internet.

So, Elastic Beantock also does all the software setup for us. All we have to do is just upload our code to elastic

beantock and it will just work. This is

called a platform as a service or a path. This manages the infrastructure

path. This manages the infrastructure and the software for us. If you want to learn more about these concepts, you can check out my backend overview video in

the description.

Now that we have an overview of AWS and some of the services we can use, let's learn how to use Elastic Beantock. Now,

Amazon might change the design of these pages in the future. If you run into any issues, make sure to check the AWS troubleshooting guide in the description.

We're going to start by creating an application. Or we can click here, click

application. Or we can click here, click environments, and create environment.

And on this page, we're going to select a web server environment. And we're

going to give a name to our application.

So let's just use e-commerce- project- react.

And we can use the default values for this section. And we'll scroll down. And

this section. And we'll scroll down. And

for the platform section, we're going to choose the technology we want to use here. For us, we're going to use NodeJS.

here. For us, we're going to use NodeJS.

And down here, we'll just use the sample application. We can upload our own code

application. We can upload our own code later.

And we'll scroll down. And here we'll choose single instance. If you see free tier allegible, pick that one.

Otherwise, just pick the single instance.

And then here we'll click next.

And here we need to create a role. A

role gives elastic beantock permission to use other services in AWS.

So in here, if you already have a role for elastic beantock, you can use that.

Otherwise, we'll click create ro.

And we should be able to use the default values that they set here. And we'll

click next.

And then click next.

And at the bottom, we'll click create roll.

And then we'll go back to Elastic Beantock. And we'll click this button to

Beantock. And we'll click this button to refresh.

And we'll select the RO that we just created.

For this one, we also need to create a role. So, we'll click here.

role. So, we'll click here.

And then we can also use the default values that it gives. Click next

and next.

And at the bottom, create RO.

And we'll go back and refresh and select the RO that we just created.

And we can keep this as blank. And we'll

click next.

For the networking and database settings, we can just use the default values here. So, we'll scroll down and

values here. So, we'll scroll down and click next.

And for the instance settings, we're going to scroll down and find the section called capacity.

And down here, we're going to scroll down and we're going to find a section like this called instance types. And it has a drop down here. So, this lets us choose

the size of the computer that we want to rent from EC2.

So, in the description, we're going to click this link and go to lesson 10 and then follow the instructions here to

select the correct instance types.

So, now we'll scroll down and click next and we can leave monitoring and logging settings as the default. So, we'll

scroll down and click next.

And finally, we'll scroll to the bottom and click create.

So now, Elastic Beantock is going to rent a computer for us using EC2. It

will also install all the software that we need on this computer like NodeJS and npm. And it will do all the

npm. And it will do all the configuration to connect this computer to the internet.

So, this will take a few minutes to complete. So, we need to wait for this

complete. So, we need to wait for this to finish.

And you might need to refresh the page to check the progress.

Once that's done, it should look something like this. And we can click this URL here or click here to open this website.

And now we should see a sample NodeJS application on this page. If something

goes wrong and this doesn't work, please check the AWS troubleshooting guide in the description.

Now that we set up Elastic Beantock, we're ready to put our code on the internet. We'll go back to Elastic

internet. We'll go back to Elastic Beantock.

And our code has two parts, the back end and the front end. We put the back end on the internet first and then we put the front end. To put the back end on

the internet, we just need to upload our backend code to elastic beantock. So

we'll click upload and deploy.

And here we're going to upload our backend code. However, we need to upload

backend code. However, we need to upload the code as a zip file. So we'll go back to VS Code.

And I'll collapse this for now. And I

actually set up the e-commerce backend so that it works with elastic beantock.

So this backend has a command that will save all the code in a zip file. So

we're going to go to the command line and we're going to create a new tab.

And in here we're going to cd into e-commerce backend.

and we'll run the command npm run zip.

So this will save all the backend code into a zip file which is right here. If

I open this zip file, you'll see that it just contains all of the backend code.

So now we just need to upload this zip file to Elastic Beantock. We'll go back to the browser

and we'll click this to choose a file.

And for me, my code is on the desktop inside the React course folder inside e-commerce backend.

And if I scroll down, I'll see this e-commerce backend one, which is a zip file. So, I'll click this and open.

file. So, I'll click this and open.

Wait for it to upload and then click deploy.

So now elastic beantock will take the backend code and put it on the internet.

So we'll wait for a few minutes for this to complete.

Once that's done, we're going to click this URL again.

And now instead of the sample application, it should say index not found, which is normal. This is how I designed my back end.

Now in the URL, we're going to click up here and go to the end. We're going to enter the URL path slash API slash

products and press enter.

So this will give us the products data that we were using in our project on our computer. So this is the same data that

computer. So this is the same data that we saw before except now our backend is on the internet.

Now that our back end is on the internet, let's put our front end on the internet as well. For the front end, we also need to prepare our code. So, we'll

go back to VS Code.

And I'll collapse this folder for now.

And if we look at the front-end code, notice that in here we use JSX code.

However, remember that the browser does not understand JSX. It only understands normal JavaScript. So, we need to

normal JavaScript. So, we need to convert this code into normal JavaScript first. To do that, VIT has a command for

first. To do that, VIT has a command for this. Inside the command line, we'll

this. Inside the command line, we'll create a new tab.

And this time we'll cd into ecommerce dash project.

And vit has a command called npm run build.

This is a shortcut for vit build.

So we'll press enter.

And this basically converts all of our JSX code into normal JavaScript and saves the code in a folder called dist.

So inside here we have an index.html file and this is the HTML for our React website. And inside the assets folder we

website. And inside the assets folder we have this JavaScript file. So this is all of our React code but converted into

normal JavaScript. You'll also notice

normal JavaScript. You'll also notice that Vit combined all of our code into one file and it also minified or compressed the code. So, it shortened

the variable names and removed the extra spaces. This is because when we open a

spaces. This is because when we open a website, our browser needs to download all the front-end code and run it. By

combining and compressing the code, it makes our website load faster. And Vit

did the same thing with the CSS.

You can see that it combined all of our CSS files together and compressed it. So

now our front end is optimized and it's ready to be put on the internet.

So now when we open a website, we need to download this React code from somewhere. So where do we put this

somewhere. So where do we put this front-end code? So we could put this in

front-end code? So we could put this in another service like GitHub pages and then when we visit the website our browser will download this front-end

code from there.

However, notice in our current setup that we already have this backend computer that's running in elastic beantock.

So we can just reuse this backend computer. we can put our React code into

computer. we can put our React code into the backend computer and our browser will download the React code from the backend computer. So, this is a common

backend computer. So, this is a common setup and it simplifies our setup because now we only need to set up one computer. So, to do this step, all we

computer. So, to do this step, all we need to do is to take this disc folder and then drag it into the e-commerce

back end like this.

And I added some code in the e-commerce back end so that it works with this disc folder. So now in the command line,

folder. So now in the command line, we'll go back to the tab that's running in the back end and we're going to create the zip file again. So we'll do

npm runzip.

So this will create another zip file but with our front-end code inside.

And now we just need to upload this to Elastic Beantock. We'll go back to the

Elastic Beantock. We'll go back to the browser and open Elastic Beantock and we'll click upload and deploy.

And we'll choose a file.

And this time we'll choose the second file here and click deploy.

And we'll wait a few minutes for this to complete.

Once that's finished, we're going to click this URL again.

And now we should have our React app on the internet. So, let's try adding some

the internet. So, let's try adding some stuff to the cart to make sure it works.

I'll add a toaster and two plates.

And now, if I look at the cart, it updated. If I open it, we have our new

updated. If I open it, we have our new products in the cart and we can update them like usual.

And if we click create order, it works. So everything is working the

it works. So everything is working the same as on our computer, but this React app is now on the internet. If we go back to the homepage,

I'm going to give you a overview of how this works. So visually, this is what's

this works. So visually, this is what's happening. First we put our back end on

happening. First we put our back end on the internet. So the back end is running

the internet. So the back end is running on a separate computer and then we put our front end code in the backend computer and I set up some code in the back end so that when we visit the

website using the URL path slash the backend sends back the react code to our computer. So now we have the react code

computer. So now we have the react code running on our computer and it communicates with the backend running on another computer. So, this is how a

another computer. So, this is how a realworld React app works. When we're

developing, the front end and the back end run on the same computer because it's easier for development.

But when we put the React app on the internet, the front-end code runs on our computer and the backend code runs on another computer.

Next, we can add a shortcut to Vit to make this process a little easier. We'll

go back to VS Code and we'll go to the e-commerce project folder which is here. So remember that

we created a disc folder and then manually dragged it into e-commerce backend. We can configure VIT to put the

backend. We can configure VIT to put the disc folder in e-commerce backend directly.

We're going to scroll down to vit.config.js.

to vit.config.js.

And in this configuration at the bottom we're going to add a property called build colon curly brackets. And in here

we'll use a property out capital D dur colon and a string.

So this tells vit where to put the dist folder.

So we want to put it inside the e-commerce backend folder. So we'll give it dot dot slash to go out of e-commerce project and then into e-commerce

dashbackend slashdist and save.

So now if we go into the back end and we rightclick and delete this disc folder and then run npm run build. So in the

command line we'll open the tab that's running in the e-commerce project and then run npm run build and press enter.

It will create the disc folder directly in here. So directly in the e-commerce

in here. So directly in the e-commerce back end. So this just saves a step in

back end. So this just saves a step in our process. We can also automate this

our process. We can also automate this process further but I'll leave that as an exercise.

So now we'll save this change into git.

We'll go to the git section and we'll use the message save build

result in ecommerce dashbackend and commit.

Before we continue, I want to discuss how to deploy a react app without a backend.

So notice that so far to put a React app on the internet, we needed a backend.

But what if we don't know how to write backend code yet? What if we just know React? So if a React app does not have a

React? So if a React app does not have a backend, we can actually just put the code on the internet directly.

For example, in our code here, we're going to go back to our chatbot project from earlier. And notice that this

from earlier. And notice that this project does not use a backend. It only

has React code. So to deploy this project, we're going to use npm run build again. So in our command line,

build again. So in our command line, we'll create a new tab and we'll cd into the chatbot-

project folder.

And if we need to, we can npm install and then npm run build.

And this will convert all the React code into normal JavaScript and save it in a disc folder again. So notice that inside

the disc folder, we actually just have normal HTML, CSS, and JavaScript code.

So this is actually just an HTML website and we can actually upload this code to any service that puts an HTML website on the internet. For example, here I use a

the internet. For example, here I use a service called GitHub pages and I can just upload this code to GitHub pages and it will put it on the internet. No

backend knowledge required.

To learn more, you can actually follow the same steps as my video, how to put a HTML website on the internet. However,

make sure you do the exercises in this lesson first since there's still some small configuration changes that we need to make for this to work. So, basically,

if we just have a front end, we can just upload this code directly to the internet using something like GitHub pages. But if our project has a backend

pages. But if our project has a backend as well, then we need to use a more complicated service like AWS to put the back end and the front end on the

internet.

In the rest of this lesson, we're going to improve our AWS setup to make it more real world and professional.

So, we'll go back to the browser and we'll open AWS again. And I'm

actually going to close some of these other tabs because we don't need them.

And inside Elastic Beantock in this project, we're going to go to the configuration section.

And we're going to scroll down and find the configuration for instance traffic.

If you don't see this, you can check the AWS troubleshooting guide in the description.

So here we'll click edit.

and we're going to scroll until we find the capacity section. And here we'll look for something like environment type and a drop down that says single

instance. So we're going to change this

instance. So we're going to change this to load balanced.

So what this does is it adds another computer in front of our backend computer. This is called a load

computer. This is called a load balancer. So what a load balancer does

balancer. So what a load balancer does is if we have a really busy website, one computer might not be enough to handle all the requests. So we can actually run

the back end on multiple computers and this load balancer will distribute the requests across these computers. This

allows our website to handle much more users.

So here we can decide how many back-end computers to run. Since we're just testing, we'll set this to a minimum of

one and a maximum of one.

And then we'll scroll down and click apply.

And now Elastic Beantock will set up a load balancer computer in front of our back end. And this will take a few

back end. And this will take a few minutes to complete.

After it finishes, we're going to go back to the configuration again and we'll scroll down to the instance traffic settings and just make sure that

min is one and max is one. If it's not one, we can click edit and then scroll back down and then

change it to one. And we'll scroll down and click apply again.

So when that finishes, I'll just check it again.

And now it's one and one.

So now our website setup looks like this. We have three computers, the front

this. We have three computers, the front end, the back end, and the load balancer. This is closer to a real world

balancer. This is closer to a real world setup. Again, you can watch my video on

setup. Again, you can watch my video on backend overview to learn more about these concepts.

Next, currently all the data for our React app like the products, the cart, and the orders are saved in a database

and the database is saved in a file.

However, when we put our React app on the internet, we usually put the database on a separate computer and this lets us share the data between backend

computers.

So, inside AWS, we're going to go to the configuration again and we'll scroll down to the database

configuration and we'll click edit.

And inside the database section, we're going to scroll down and find database and we'll click enable database.

Elastic Beantock will automatically create a new computer that's running a database and it will connect this database to our back end.

So, we'll scroll down and look at these options. And here we can select the

options. And here we can select the database that we want to use. So the

e-commerce back end works with the database MySQL. So we're going to use

database MySQL. So we're going to use that.

And then here we're going to look at the instance class setting. So this is the size of the computer running the database.

In the description, we'll click this link, go to lesson 10, and then here we'll follow the instructions to select the correct instance class for the

database.

And finally, we'll set a password.

And now we'll scroll down to the bottom and click apply.

So AWS will set up a separate computer to run the database. And I already added some code in my e-commerce back end to connect to this database. So it should

just work. If you have issues, please

just work. If you have issues, please check the AWS troubleshooting guide.

After that finishes, we can open the website again and it still works. If we add something to the cart, notice that the database

still works. And if we open the orders

still works. And if we open the orders page, remember that earlier I created a new order.

And now the orders are back to the default values.

So this means that we're using the new MySQL database that we set up. And now

our AWS setup looks like this. We have a load balancer, a backend, and it connects to a database on another computer. And this is getting even

computer. And this is getting even closer to a real world setup.

Next, if we go back to AWS, notice that to open our website, we use this default URL, which is really long.

So, now we're going to set up a domain name to make our website easier to access. A domain name is like myite.com

access. A domain name is like myite.com or youtube.com. It's a short name that

or youtube.com. It's a short name that makes it easy to access our website.

So instead of putting this long URL in the browser, we can just type myite.com and it will open this website. So I'll

show you how to set up a domain name with AWS.

First, we need to purchase a domain name. Most domain names cost around $10

name. Most domain names cost around $10 or $20 per year, so this section is optional. If you already have a domain

optional. If you already have a domain name that you purchased before and you want to use, feel free to skip to the next section. Otherwise, I'm going to

next section. Otherwise, I'm going to show you how to purchase your own domain name. There are many services we can use

name. There are many services we can use to purchase domain names. I use a service called namecheep for all my websites like superimple.dev.

In the description, we'll click this link, go to lesson 10, and click here to go to namecheep. So, this is an affiliate link. If you decide to

affiliate link. If you decide to purchase a domain name using this link, part of your purchase will help support this channel. Thank you so much.

this channel. Thank you so much.

Once we're on NameCheep, we're going to search for a domain name that we want.

If you see a search box here, you can search for it. Otherwise, we can go to domains and domain name search.

and we'll scroll down here and search for a domain name. So, domain

names are unique. Once they are taken, like youtube.com, we can't purchase it anymore. If you don't know what domain

anymore. If you don't know what domain name you want, my recommendation is to try to register your first and last name. This might be useful for a

name. This might be useful for a personal website. So, for me, it's Simon

personal website. So, for me, it's Simon Bao. and we need to give it an ending

Bao. and we need to give it an ending like do stands for commercial. It's the most popular ending for domain names. Now,

you could pick another ending that you want, but be careful because some domain endings don't work with normal browsers.

If you're not sure which ending you want, I recommend using com or.net just to be safe because they are the most popular.

So now I'm going to click search to see if this domain has already been taken.

So it looks like this one has already been taken. So I'll just add something

been taken. So I'll just add something to it like Simon Balenge or Engineer.

And this one is available. So you might need to modify your domain name to find one that works for you.

So, we'll add this to the cart and then open the cart.

If you want to autorenew this domain name, you can click here and then we'll click confirm order.

And if you don't have a name account, you need to create an account first.

And after filling out all the information, we'll purchase the domain.

And that's it. Now we have a domain name and we own a little piece of the internet.

Once we have a domain name, we're going to set up the domain name in AWS.

So, we'll go back to AWS and at the top we're going to search for the service route 53

and we're going to write click this and open in a new tab.

So, route 53 lets us manage our domain names in AWS. We can click get started and click create hosted zones

and then click get started.

If you don't see that, we can also click this menu here, click hosted zones

and then click create hosted zone.

A hosted zone lets us connect a domain name to our app. So currently a hosted zone costs about 1.6 6 cents per day. So

you can use it for free for a few hours.

So here we're going to enter the domain name that we have. So for me it's simon balenge.com and scroll down and we'll leave it as a

public and then click create hosted zone.

And now inside here, we're going to scroll down and click create record.

So this sets where the domain name will go. We're going to leave the subdomain

go. We're going to leave the subdomain as blank and we'll create an A record and we're going to check alias.

And here we can select which AWS service we want to connect to.

So for us, we're using elastic beantock and we're going to choose the region. If

we go back to the tab that's running elastic beantock, we can see the region up here. So for me, I'm using the region

up here. So for me, I'm using the region Ohio.

So go back to route 53 and I'll search for the region Ohio and select it. And

we should see our app here. So I'll

select that.

and then scroll down and click create records.

And finally, we need to tell NameCheep or the company that you use for your domain name to redirect to AWS.

So inside NameCheep or your domain company, we're going to go to the settings and we're going to find the domain. So

in namecheep it's in domain list and here you may need to verify your email. So we'll click this and check

email. So we'll click this and check your email for the verification. So this

might take a while. So we just have to wait until the verification is complete.

And we may need to log out and log back in to our NameCheep account for the verification to update.

Once verification is complete, we should be able to go back to the domain list, find our domain, and open the settings for the domain.

And in the settings, we're going to look for a section that's called name servers. If you're having trouble

servers. If you're having trouble finding this in namecheep or your domain company, please check the AWS troubleshooting guide in the description.

And then in here, we're going to click this dropown and we're going to set custom DNS because we're going to use AWS for this.

So now we need to enter some name servers. To find these, we're going to

servers. To find these, we're going to go back to AWS route 53.

And I need to zoom out a little bit to see this. Inside the hosted zone, we

see this. Inside the hosted zone, we have some records here. and we're going to look for the record NS or name server.

So in the NS record, we should see these four URLs here. So we just need to copy these over to namecheep or your domain

company. So we'll select this and copy.

company. So we'll select this and copy.

And then inside NameCheep and here we'll paste.

And we'll go back and select the second name server.

copy and paste.

If we need to, we can add two more name servers.

And here we'll select this and copy.

And here we'll paste.

And we'll select the last one. Copy.

And here paste. And then save.

So what this does is when we open our domain name in the browser, NameCheep is going to redirect to AWS and then AWS

will redirect to Elastic Beantock or to our app.

So this setting will take a while to update. Sometimes it finishes in just 10

update. Sometimes it finishes in just 10 minutes, but it could take up to 24 to 48 hours. So we just have to be patient.

48 hours. So we just have to be patient.

So once we waited for a while, we can try opening a new tab.

And in here we'll type http colon double slash and our domain name.

So for me it's simon baenge.com and press enter.

And this will redirect to our app. So

now we're able to access our React app using a short domain name that's easy to remember.

Next, I'm going to explain why we enter HTTP in front and why we see this not secure warning here. So this means that

our website is not using encryption.

This means that any data we send to this website can be intercepted by a hacker.

To enable encryption on this website and make it secure, we need to set up an SSL certificate, which is a special file that enables encryption.

To get an SSL certificate, we can use AWS.

So, we'll go back to AWS Route 53 and then at the top we'll search for another service called certificate manager

and click here and we can request a certificate. If you

don't see it, you can also go in here and click request certificate.

We'll use the default value and click next.

And here we're going to enter our domain name. Make sure to enter your domain

name. Make sure to enter your domain name.

And we'll scroll down and make sure DNS validation is selected.

And scroll down and click request.

And then we'll wait for this to finish loading.

And now AWS needs to confirm that we own the domain name. That's why it says pending validation.

To do that, we can just click this create records in Route 53 button. If

you don't see this, please check the AWS troubleshooting guide.

And it should show up here. And we'll

click create records.

And we'll wait for this to finish. We

may need to refresh a few times until it says it was successful.

And now that we have an SSL certificate, we can use this in elastic beantock. So

we'll go back to elastic beantock and then in the configurations here, we're going to scroll down to the

instance traffic settings and click edit.

And we're going to scroll down until we find this listeners section.

And here we'll click add listener.

For the port we're going to use 443.

And for the protocol we're going to use HTTPS.

HTTPS means we're going to have a secure connection to our website. And this

usually uses port 443.

And here we're going to choose the SSL certificate that we just created.

And we should be able to leave the SSL policy blank and click save.

If that didn't work, please check the AWS troubleshooting guide. So this

basically adds an SSL certificate to the load balancer. And now any data sent to

load balancer. And now any data sent to our website will be encrypted.

So, we're going to scroll down and click apply.

And again, this will take a few minutes to complete. So, we just have to wait

to complete. So, we just have to wait for it.

Once that's complete, I'll close some of these other tabs and I'll create a new tab.

And in the URL, we're going to type https colon double slash. So this tells the browser to use the secure connection to our website

and then we'll type our domain name. For

me, it's simonbowenge.com and press enter.

So now the not secure warning is gone and we're using a secure connection to our website that uses encryption.

Also now if we just type our domain name in the URL without HTTPS in front and press enter

it will default to using the secure version. So that's how we set up an SSL

version. So that's how we set up an SSL certificate and HTTPS in AWS.

And now we have a professional and realworld setup for our React app.

In this section, I'll show you how to delete everything we created in AWS.

However, I recommend to do the exercises of this lesson first to get more practice with AWS and then do this deletion.

Also, I try to keep everything we created in the free tier. The only

exception is the hosted zone in Route 53. You can use it for free for a few

53. You can use it for free for a few hours. So you could keep running these

hours. So you could keep running these services and practice AWS if you want to check your AWS bill. We can go to the profile and click billing and cost

management.

And now after you finish the exercises, I'll show you how to delete everything just in case. So in elastic beantock, we

can click this actions dropown and click terminate environment.

And in here we need to type the name of the environment which is here and click terminate.

Once that's finished, we can go up here and go to route 53.

And in this menu, we can go to hosted zones.

and we'll open the hosted zone.

And inside here, we're going to select the A record and the CNAME record and delete these records.

And then at the top, we can delete the hosted zone.

And in here, we'll type delete and click delete.

Once that's finished, at the top, we'll go to certificate manager.

And in this menu, we're going to click list certificates.

And we'll select the certificate and click delete.

Type delete and click delete.

You can also delete your entire account if you want by clicking your profile and clicking account and then close account. Although you

lose access to the free tier if you do this. I usually keep my account open for

this. I usually keep my account open for a while to practice with the free tier.

So now we put our React app on the internet and we created a professional real world setup and that's the end of this lesson. In this lesson we learned

this lesson. In this lesson we learned AWS or Amazon Web Services which is a collection of services that help us put

stuff on the internet. We learned EC2 which lets us rent a computer from AWS and is known as infrastructure as a

service or IAS. We learned Elastic Beantock which manages EC2 and sets up all the software that we need. This is

also known as a platform as a service or path. We put our backend on the

path. We put our backend on the internet. We learned how to build and

internet. We learned how to build and optimize the front end and put it on the internet. We learned how to deploy React

internet. We learned how to deploy React without a back end. We added a load balancer and database to create a more realworld setup. And we learned how to

realworld setup. And we learned how to set up a domain name, SSL certificate, and HTTPS for our website.

Here are some exercises to help you practice what we learned in this lesson.

In this lesson, we're going to learn some of the updates in the new version of React, and we'll learn how to use TypeScript with React.

On the React website, there's a page that lists the updates in the new version of React. You can find a link to this page in the description.

So there's a lot of changes here and many of these changes are related to using React in a framework which is basically a layer on top of React.

For now I'm just going to go over the changes that are related to this course.

The first change is called support for document metadata. So this means that we

document metadata. So this means that we can put elements that normally go inside the head section like the title, link and meta elements directly inside our

component like this. So this lets us change the head section when we render this component. For example, in our

this component. For example, in our project, we used a title element to change the text in the tab when we switch pages. The way this works is when

switch pages. The way this works is when this component renders, React will put this title inside the head section and

this will change the text in the tab.

Before React 19, we had to use an npm package like React helmet to do this.

After React 19, we can just put these elements directly in our components. So,

it's easier.

Another change is called ref as a prop.

Earlier in this course, we learned about refs and we can use a ref to get access to an HTML element directly.

We can also give a ref to a component.

For example, if we want to get an HTML element inside this component.

Before React 19, ref was a special prop.

We can't access it inside this component. We had to use a feature

component. We had to use a feature called forward ref.

After React 19, ref is now a normal prop. We can access it like any other

prop. We can access it like any other prop and we don't need to know about forward ref anymore, so it's easier.

The next change is the introduction of the React compiler. The React compiler optimizes our React code. For example,

let's say we had a component like this.

We have a counter and two other components inside. When we click the

components inside. When we click the counter, this element will update, but it will also recreate these other two components. Even though clicking the

components. Even though clicking the counter does not affect the other two components.

That's because by default, when a component updates, it will also update or recreate all the components inside.

And this may cause performance issues.

To avoid this issue before React compiler, we had to use three features.

Use memo, use callback, and memo. And

this prevents a component from being recreated unless one of the props changed.

So don't worry if you don't understand this code because after the React compiler, the compiler will just add these optimizations automatically.

And now we can just write our code as normal and we don't need to worry about use memo, use callback or memo anymore in most cases.

So again, the React compiler optimizes our React code. All we have to do is to set up the React compiler and we will

get these optimizations. We don't have to change any of our code.

Now, let's learn how to set up the React compiler in our project. In the

description, we'll click this link, go to lesson 11, and here we have the instructions for setting up the React compiler. I put the setup instructions

compiler. I put the setup instructions here because this process might change in the future, and it's not easy to update the video. So, follow the

instructions that you see on your page.

For me, the first step is to install the React compiler npm package. So, I'm

going to select this command and copy it. And then in my project,

it. And then in my project, I'm going to go to the command line and create a new tab. And I'll close these other tabs so that I can start fresh.

And first, I need to make sure I'm running inside e-commerce-pro.

So, cd ecommerce- project and then I'll paste the command and press enter to install the react

compiler npm package.

And then I'll go back and the next instruction is to copy this react config. So, I'll select this config and

config. So, I'll select this config and copy it.

And then I need to update vit.config.js.

js and put that react config in here. So

I'll go to the project and open vit. doconfig.js.

And at the top I see this react config.

So I'm just going to replace it and paste and save.

And that's the setup. Again, the

instructions might be different when you watch this video. So follow the instructions on your page.

Next, let's check if the React compiler is working. So, we'll go back to the

is working. So, we'll go back to the instructions and down here we have some instructions for checking if React compiler is working. Again, follow the instructions

working. Again, follow the instructions on your page because they might have changed. So, first I'll start the back

changed. So, first I'll start the back end and the front end using mpm rundev.

I'll go back to VS Code and in the command line I'll create a new tab and I'm going to go into the backend

folder using cd ecommerce-backend and run mpm rundev.

And I'll go to the front end tab and I'll also run mpm rundev.

So now both of them are running. I'll go

back to the instructions and the next step is to install the React DevTools Chrome extension. So

we'll click here.

So this is an extension made specifically for React. It has a bunch of features that help us with React development.

So here we're going to add this extension to our browser.

And once that's finished, I'll go back to the instructions.

And the next step is in your project, open the console and open the components tab. So, in VS Code, we're going to open

tab. So, in VS Code, we're going to open this project in the browser and I'm going to rightclick and inspect.

And in the console, we're going to click here. And we should have a new

here. And we should have a new components tab.

So, we'll click this.

If it gets stuck, you can refresh.

And this shows us all the React components that are on our page. If we

scroll down and if we look at our components, they should have a badge beside them called memo. This means that the React compiler is working and it's

optimizing our React components.

Now, let's go back and look at some more changes in the new version of React.

The next change is removed prop types and default props. So prop types were an older feature of React. It basically

lets us check the type of a prop.

For example, here we can check if the prop text is a string. If we run this app and text is not a string, it would

show a warning in the console.

So now we use a different tool called TypeScript which is better at this type of type checking. So React removed the prop types feature in favor of

TypeScript.

React also removed default props. If a

prop is undefined, this feature lets us set a default value. So now we can do this with normal JavaScript. So we don't

need this React feature anymore.

Now that we learned that propt types was replaced by TypeScript, let's learn how to set up TypeScript with React, we'll go back to VS Code.

And to set up TypeScript with React, we can use the create vit command. So in

the command line, we'll create a new tab and make sure this is running in the React course folder. And we're going to run the command npx

create-ash vit. And we'll type at to

create-ash vit. And we'll type at to give it a specific version. And we'll

click this link in the description. Go

to lesson 11.

And we'll use this version of vit. So

copy the version that you see on your page.

And here we'll paste and press enter.

If it asks to install the package, press Y and press enter.

And as a review, create VIT creates a new project. So let's name this project

new project. So let's name this project ecommerce- project-ts

or TypeScript and press enter.

For the framework, we're going to press down and choose React.

And for the variant, we're going to choose TypeScript.

So this will create a new React project that uses TypeScript.

If we look at the code inside source, notice that it uses tsx files instead of JSX.

TSX means this code uses TypeScript while JSX means it uses JavaScript.

So now to run this project, we're going to follow the instructions that we see.

So for me, I'll cd into e-commerce dash project-ts and run npm install to install all the packages that we

need.

And then I'm going to open the tab that's running the front end. And I'll

press Ctrl C to stop the front end so we don't have any issues. And then in the TypeScript tab, we're going to run mpm

rundev to start this project.

And now we'll open this in the browser.

So I already have it open. So I'm going to go in here and open this tab and refresh.

Now we have a new React project. But

this project uses TypeScript instead of JavaScript.

And now I'll give you an intro to TypeScript.

Let's go back to our code.

And inside the TypeScript project, we're going to open app.tsx.

So first of all, what is Typescript?

Typescript is just JavaScript with extra features.

So notice that this TypeScript code is the same as JavaScript code. The syntax

is the same and the features are the same. For example, in here

same. For example, in here in Typescript, we can create a variable the same way as JavaScript using const

message equals the string hello.

And then we can console.log log message.

So as you can see, TypeScript is just JavaScript.

However, TypeScript gives us some extra features on top of JavaScript. The main

feature is we can add types to our variables.

So what are types? Remember that

JavaScript has different types of values like numbers, strings, and objects.

In Typescript, we can set what type of value is inside a variable.

For example, in this variable, we have a string. So, after the variable name, we

string. So, after the variable name, we can type colon space and string.

So, this tells TypeScript that this variable contains a string.

So now below this if I type message and then dot TypeScript knows that this is a string. So now it's able to suggest all

string. So now it's able to suggest all the features of a string like two lowercase

and brackets.

So using TypeScript our computer can give us better autocomplete suggestions.

Next, if I type message to fixed and brackets, two fixed only works with numbers.

Because TypeScript knows that this is a string, it's going to give us an error saying that too does not work on strings.

So, this feature is called type checking. TypeScript checks if this code

checking. TypeScript checks if this code works with this type of value and this helps us avoid errors. In JavaScript,

there is no type checking. So if I want to put this code on my website, JavaScript will just let me do it and it will crash my website. But in

Typescript, if I want to put this code on my website, I would save this code and then in my command line, press

control C to stop the server and run npm run build.

Notice that TypeScript actually blocks us from building this code and putting it on our website because there's an error with the types.

So, as you can see, TypeScript gives us type checking, which helps us avoid a lot of these coding errors and helps us keep our code safer.

Another feature of TypeScript is type inference. Type inference means

inference. Type inference means TypeScript can figure out the type automatically.

For example, in this code, this variable obviously contains a string. So we

actually don't need to set the type manually here. If we delete this type,

manually here. If we delete this type, TypeScript will infer or figure out that this is a string. So I can remove it and save

and the error check still works because TypeScript knows that this is a string.

Another example of type inference is up here in use state. So this count variable contains the number zero.

TypeScript will infer or figure out that count is a number.

So if we do count to two lowercase and brackets, it's going to give us an error because two lowercase only works with

strings and TypeScript figured out that this is a number. So, as you can see, TypeScript is just JavaScript, but it adds extra features like type checking

and type inference to our code, and this helps us find and avoid errors. So, now

let's save this code. And we'll save these changes into git. In the git section at the top, we're going to use the

message create new React TypeScript project and press commit.

So, we just learned how to create a new React project that uses TypeScript.

Now, let's learn how to convert an existing project, like our e-commerce project, to Typescript. To do that, we're just going to move all of our

changes over to the new TypeScript project.

Before we begin, if you have any issues during this process, please check the troubleshooting guide in the description since things might change depending on

the version of VIT.

To make this easier in the e-commerce project, we're going to delete the node modules folder for now.

And then we'll make a copy of this folder. So we'll rightclick,

folder. So we'll rightclick, copy, and we'll collapse these folders and click the outside and rightclick and

paste.

So, this just helps us keep track of progress when we're moving the changes over. So, we're going to start from top

over. So, we're going to start from top to bottom. First, we'll look at the

to bottom. First, we'll look at the public folder. So, in here, the change

public folder. So, in here, the change we made is we added this images folder.

So, we're going to take the public folder and we're going to drag it to the TypeScript project and click move

and click replace.

Next, let's go into the source folder and we're going to move our changes over one by one. So, first in the assets folder, we didn't make any changes to this

folder, so we're not going to move it over and we can just delete this folder.

As a reminder, we're not trying to move all of our code over. We want to start from a default TypeScript project and then only move our changes over to the

new project.

So let's continue and look at the components folder. So this folder is

components folder. So this folder is completely new. So we're going to move

completely new. So we're going to move this entire folder over to the TypeScript project inside the source folder

and click move.

And if it asks to update the imports, we're going to click no because we're going to move everything over.

Next, we're going to go back up and the pages folder is new. So, we're going to drag this folder into the TypeScript project inside source

and click move and update the imports. Click no.

Next, we'll scroll up and the utils folder is new. So, we're going to select this folder and drag it into the TypeScript folder inside source. So,

move and click no.

And next, we'll keep going one by one.

For app.css,

we made it empty. So, we're going to move this over. So, drag it into source.

Click move and click replace and scroll back up for app.jsx.

We made a bunch of changes in here. So,

we're going to move this over. So, drag

it into source and click move.

However, notice in the TypeScript project, the file is called app.tsx.

So, we're going to replace this code with our file. So, first we're going to select this and delete app.tsx.

And then we'll rightclick app.jsx

and rename and rename it to tsx.

Now, we'll scroll back up and continue moving our changes.

So index.css

we completely changed this file. So,

we're going to move it into the TypeScript project into source.

Click move and click replace and scroll back up. And finally, in main.jsx,

main.jsx, we just added the router. So, let's move this file as well. We'll select it and drag it into source

and move.

And again in Typescript the file is called main.tsx.

called main.tsx.

We'll select it and delete.

And we're going to rename our file.

Right click, rename main.tsx,

main.tsx, and press enter.

Update the imports. Select no.

We'll scroll back up and we moved all of the code from the source folder so we can delete it.

Next, we don't need to move the starting code folder because this was just for practice when we were setting up this project. So, we can just delete this

project. So, we can just delete this folder.

Now, let's move all the files over to the TypeScript project. So in git ignore, we didn't make any changes to this file, so we don't need to move it

over and we can delete it.

In eslint.config.js,

we added one change to this file at the bottom, which is we added this rule to disable prop types. So we'll select this

code and copy.

And in the TypeScript project, we're going to open eslint.config.

And at the bottom in this rules object, we're going to paste and move that change over and save.

So again, we don't want to move all of our code over. We just want to move the changes over because a lot of this code is specific to TypeScript.

So, we'll scroll back up here and we can delete this file because we moved it over.

Next, let's keep going in here. For

index.html, we changed a few parts of this code. So,

we're going to move these changes over to help us compare this code with the TypeScript version. I'm going to scroll

TypeScript version. I'm going to scroll down and take this index.html HTML and then move it at the bottom here so that I can

compare these side by side.

So first the first three lines here we did not make any changes so we can skip them.

And then here the next three lines we also did not make any changes so we can skip them. And here we added a base

skip them. And here we added a base element. So we're going to select this

element. So we're going to select this and copy. And in the TypeScript version,

and copy. And in the TypeScript version, we're going to paste that change.

And here we also deleted the title. So

in the TypeScript version, we're also going to delete the title.

And here we added a font called Roboto.

So we're going to move this change by selecting it and copy.

And in here we'll paste the font. And if

we need to fix the formatting, we can select this and press shift tab to remove some indents and I'll scroll down.

And for the rest of the code, we did not make any changes. So now we moved all the changes over. I'm going to save this file and close this for now.

And then in the copy, we can delete index.html.

index.html.

And next, we don't need to move packaged lock.json over because this will be

lock.json over because this will be autogenerated when we npm install. So,

we can just delete this file and I'll scroll back up and we'll move over package.json.

In this file, we didn't change anything at the top, but we did add some dependencies and dev dependencies. So,

we're going to move these over. We'll

select the dependencies and copy.

And then in the TypeScript project, open package.json.

package.json.

And in these dependencies, we'll type comma and paste.

And then we'll remove any duplicates.

So, we'll remove React and React DOM and save.

And we'll scroll back up and open package.json.

And we'll do the same thing with the dev dependencies. So, we'll select all these

dependencies. So, we'll select all these dependencies and copy.

And in the TypeScript project package.json JSON in the dev

package.json JSON in the dev dependencies at the bottom we'll type comma and paste

and we'll remove all these duplicates.

So I'll remove eslint and I'll remove these duplicates and these duplicates

and these duplicates and remove this until there are no more duplicates remaining.

And now we'll save.

And then we're going to run npm install to make sure we successfully install all these packages. In the command line,

these packages. In the command line, we'll go to the tab for the TypeScript project and we'll run npm install.

And now we can scroll up and delete package.json.

package.json.

And we'll keep going for readme.md. We

didn't change this file. So we can delete it.

And this file setup test.js is new. So

we'll move this over to the TypeScript project.

And we'll scroll up and we're going to move over vit.config.js.

So in here we added a bunch of configurations.

So in the TypeScript project we're going to drag vit.config.ts ts at the bottom

and we're going to move our changes over. So, inside the config,

over. So, inside the config, we added some stuff for the React config. So, we're going to select this

config. So, we're going to select this React config and copy and then select this code, remove it,

and paste.

And we'll keep going. So, all of these configs are new. So, we can just select this code and then copy.

And inside the TypeScript version, we're going to paste and save.

So, now we moved all of our changes over to the new project. And we can delete this file.

And I'll close this for now.

And finally, vtest.config.js.

JS is new. So, we can drag it into the project.

And now we moved all of our changes over into the TypeScript project. And I can delete this copy.

Next, we're going to go into the TypeScript project and we're going to fix the errors. First, we'll open main.tsx.

main.tsx.

And in here, instead of importing from app.jsx,

app.jsx, the file is now app.tsx.

So we're going to update that.

Also, we have an error here. So this

code tries to get an element from the page using the ID root. However, this

element might not exist. So TypeScript

gives us an error telling us this value might be null. However, if we check our index.html

and scroll down, we have an element here with the ID of root. So, we know that this element definitely exists.

In main.tsx,

to tell Typescript that this value definitely exists. At the end, we're

definitely exists. At the end, we're going to add exclamation and save.

So this tells Typescript that this value definitely exists and it will not be null. And now the error is gone.

null. And now the error is gone.

Next we'll open app.tsx.

And up here we get some errors when we are trying to import these files. The

reason we get these errors is because these files are still.jsx

files or JavaScript files. So, we could rename all of our files totsx, but then Typescript will start doing type checking in these files and we may

get a bunch of errors.

Instead, in our files, we can scroll down to tsconfig.app.json.

tsconfig.app.json.

And inside here, we're going to add a setting double quotes allow capital J S

colon true and comma and save.

So this setting lets us mix TypeScript and JavaScript files in our project. So

now in app.tsx, tsx.

Our TypeScript code can also import from JavaScript files and it won't cause an error. So the allowJS setting lets us

error. So the allowJS setting lets us gradually convert a JavaScript project to TypeScript, one file at a time.

Now that we fixed the errors, let's run this project again to see if our e-commerce project works with TypeScript. in the command line. Make

TypeScript. in the command line. Make

sure you're in e-commerce project ts and we're going to npm rundev and press enter.

And now if we open this URL in the browser and refresh and now you can see that our e-commerce

project is working with TypeScript. If

we try some of the features like add to cart, you'll see that everything still works. If this does not work for you,

works. If this does not work for you, you can check the troubleshooting guide in the description.

Now, let's go back to our code and let's rename our folders so that we use TypeScript by default. We're going

to scroll up and we're going to rename e-commerce project. Right click, rename

e-commerce project. Right click, rename to e-commerce project dashjs for JavaScript.

And then we're going to rename e-commerce project-ts to e-commerce project.

So now by default our project will be using TypeScript.

And just to make sure, we're going to go to the command line and stop the V server. And we're going to delete all

server. And we're going to delete all our tabs. So here we'll also control C

our tabs. So here we'll also control C to stop the back end and delete all the tabs. And then we'll reopen the command

tabs. And then we'll reopen the command line using the terminal menu and new terminal.

And we're going to restart the back end using cd ecommerce-backend mpm rundev and create a new tab

and we'll run the front end cd ecommerce- project and npm rundev.

And in the browser, we'll refresh and our TypeScript project still works.

We'll go to VS Code. And finally, we're going to organize these folders a little bit. So, right now, we're no longer

bit. So, right now, we're no longer using the e-commerce project JavaScript version or the React basics folder. So,

let's click outside and we'll click here to create a new folder. and let's call it old dash projects.

And then we'll drag the JavaScript version into here.

And we'll move React Basics into here.

So now our folders are a little bit more organized.

So now let's save this into Git. We'll

open the git section and at the top we'll use the message convert e-commerce

project to type script and commit.

Next we're going to learn an intro to TypeScript with React. First, we'll go into our files and in the project, we're going to go to

source the utils folder and we're going to look at money.js.

Currently, this is a JavaScript file.

That means there is no type checking in this code. So, we're going to convert

this code. So, we're going to convert this to TypeScript by right-clicking and rename.

And we'll rename it to money.t. ts or

typescript.

So this converts the file into typescript and now it will enable type checking and now we will get an error here.

So this error says amount sent implicitly has an any type. So what this means is that earlier we learned the feature type inference which means

typescript can figure out the type automatically.

However, in this situation, TypeScript does not have enough information to figure out the type of amount sets. So,

we have to set the type manually.

To set the type of a parameter after this parameter, we're going to type colon space and then the type of this value. So, in this case, amount sent

value. So, in this case, amount sent should be a number. So, we're going to type number and save.

And now that TypeScript knows what type of value this is, the error will go away. And now we successfully converted

away. And now we successfully converted this file to TypeScript.

Let's do another example. We're going to go to the components folder and we're going to convert header.jsx into

TypeScript. So we're going to rename this file to header.tsx.

to header.tsx.

So tsx is just a TypeScript file, but the X means we can write HTML inside this file. So it's just like JSX except

this file. So it's just like JSX except it uses TypeScript.

So now this converts the file to TypeScript and it enables type checking and we get some errors here.

If we look at this error, we get a similar error. Cart implicitly

has an any type. So again, this means that TypeScript does not have enough information to figure out the type of cart automatically. So we have to set

cart automatically. So we have to set the type manually.

We might try to add the type after cart like this. However, this is not how we

like this. However, this is not how we add a type to this code because remember this code is actually a shortcut for this code. This is called the

this code. This is called the dstructuring shortcut.

So this whole thing is the parameter.

So we need to add the type here after the parameter.

So this code is a shortcut for props which is an object. To tell Typescript that this is an object here we're going

to type curly brackets and then inside here we can also tell TypeScript what properties are in this

object. So in this object we have a cart

object. So in this object we have a cart property. So in the type we're also

property. So in the type we're also going to add a cart property. And

remember that the cart is an array like this.

So we're also going to tell Typescript that this cart is an array using colon and square bracket semicolon.

So again, this code tells Typescript that this value is an object with a property called cart and the cart is an array.

Next, we can also tell Typescript what is inside this array. In front of the array, we can type curly brackets to tell Typescript that this is an array of

objects.

And inside this object, we can also tell TypeScript what properties each object has. So inside our cart array, each

has. So inside our cart array, each object has a product ID and this product ID is a string. So we can tell that to

TypeScript using colon string semicolon and each object also has a quantity and this is a number. So we can tell that to

Typescript using colon number semicolon and each object has a delivery option ID

which is a string. So colon string semicolon.

So using this code we can tell Typescript exactly what type of value this is. It's an object with a property

this is. It's an object with a property called cart. And the cart is an array.

called cart. And the cart is an array.

And each value in the array has these three properties.

So now TypeScript can actually look at the rest of our code and check if each value in the array has a quantity and if we accidentally misspell quantity

here like this. TypeScript can use this type here to check if we made a mistake.

So this helps us avoid a lot of mistakes when we're coding. So, let's add that back and save.

Next, we're going to organize this code a little bit. So, putting a complex type directly in the code like this is a little hard to read. So, we can actually

take this type and then save it separately.

above this component we can use type space and then give this a name.

So here this value is the props for the header component. So we'll name this

header component. So we'll name this header props and we'll type equal and we're going to move this type up here.

So we'll select this type and cut.

And then in here we're going to paste.

So this is called a type alias and it works just like a variable but for types. So we can save a type in here and

types. So we can save a type in here and then we can use this type later in our code. For example, down here, we can

code. For example, down here, we can just use this type header props and it will substitute this type into

our code just like a variable.

And now our code is much cleaner. So

that's an intro to how to use TypeScript with React. We basically add types to

with React. We basically add types to React features like props.

So now let's save and we'll save these changes into git.

In the git section at the top we'll use the message convert

money utils and header to type script and commit.

Finally, we're going to learn how to use AI or artificial intelligence with React. After we learn React, we can use

React. After we learn React, we can use AI to help us write React code faster.

The easiest way to get started with AI is to use GitHub Copilot, which is built into VS Code. Before we begin, AI tools

are changing very quickly. If something

in this section is not working, you can check the troubleshooting guide in the description.

To set up GitHub Copilot, we're going to install the GitHub Copilot extension.

So, in the extension section, we need to make sure we have the GitHub Copilot extension installed. If it's not

extension installed. If it's not installed, we can search up here for GitHub Copilot

and install this extension.

Once we have that installed, we're going to click this C-pilot icon up here and we'll need to log in to our

GitHub account. So, we'll click sign in

GitHub account. So, we'll click sign in and then we need to log in to GitHub. If

you don't have a GitHub account, you can create one by clicking here or going to github.com.

github.com.

So, I'm going to log into my GitHub account and then I'll click continue and I'll click here to go back to VS Code.

Once we finish the setup, we can start using some features of AI. The first

feature is autocomplete.

So, let's say that we're in the header and we'll close this window for now.

And let's scroll down to the HTML and we're going to go to the right section.

Let's say that inside the header, we want to add a link to a login page. So

here we can just start typing in this code and the AI will give us some autocomplete suggestions. To accept

autocomplete suggestions. To accept these suggestions, we can press tab.

So this creates a new link and some text. And I'll press enter.

text. And I'll press enter.

And it gives another suggestion. So I

press tab.

And this creates the closing tag for the link.

So you notice that the autocomplete is very smart because the AI can read and understand the rest of our code and it can suggest code that follows the same

patterns as the rest of our code. For

example, here it creates a link element and it gave it a class name that is similar to the other class names.

However, when using AI, we may need to go in and modify things to make sure we get exactly what we want. So, here the AI created a link to the homepage, but

what we actually want is a link to a login page. So, I can click here and

login page. So, I can click here and modify the URL path to slash login.

And I can also change the text to login.

And I'll change this to login. And I

don't really have an icon for the login page. So we can delete it.

page. So we can delete it.

And I'll change this to login.

So using AI, I'm able to write this code a lot faster.

Another feature of AI is we can give the AI instructions.

For example, let's remove this code for now.

And we can click this copilot icon.

and it will open this chat window. And

inside here we can just tell the AI what we want to do. For example, in here we

can say in the header add a link to the login page and make

sure in this dropdown you have agent or edit selected and we'll press enter.

and the AI will make edits to our code.

So here you can see that it added a login link like before. So we can press keep to keep these changes or undo if we

don't like these changes. So this looks good to me. So I'm going to press keep.

And again I'll go in here and modify it a bit. So here it added the login link

a bit. So here it added the login link after the orders link but I want to put this before the orders. So I can just

select this code and cut and at the top paste that code.

So, as you can see, by using AI, we can write React code faster. But you'll

notice that we still need to understand the code to check if it's what we want and to modify the code if we need to.

So, it's important to learn how to code first and then we can use AI to help us code faster. So now I'll go into the git

code faster. So now I'll go into the git section and I'm actually going to undo these changes because this was just an example.

And that's the end of this lesson. In

this lesson, we learned some of the updates in the new version of React. We

learned how to set up the React compiler to automatically optimize our React code. We set up a new Typescript React

code. We set up a new Typescript React project using create vit. We did an intro to TypeScript and learned basic features like type checking and type

inference. We converted our e-commerce

inference. We converted our e-commerce project to TypeScript.

We learned how to use TypeScript with React. And we learned how to use AI with

React. And we learned how to use AI with React to help us write code faster. Here

are some exercises to help you practice what we learned in this lesson.

Good job on finishing this React tutorial. If you want to continue

tutorial. If you want to continue learning with me, you can check out the premium version of this course where I will be adding extra lessons and projects in the future. Currently, the

premium version has 11 lessons, but I'll be adding more lessons in the future.

You can also check out the membership for extra content on AI and backend.

As the next step after learning React, I recommend moving to the back end and learning the command line and NodeJS.

I'll be putting my work in progress on these technologies inside the membership first, so be on the lookout for that.

Thanks so much for watching and taking this course with me and I'll see you in the next one.

Loading...

Loading video analysis...