React JS Course for Beginners - 2021 Tutorial

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
react is one of the most popular JavaScript frameworks in this comprehensive and well made course. Thomas Weidman falck will teach you everything you need to know to start using react. Hello, and welcome. I'm Tomas vevo to developer from Sweden. And thank you for enrolling this course. I'm actually a little bit of extra proud on this one, because I created a lot of courses during the years now, but this one is the first ever course I created because I love react. And I wanted to create courses. So this is the third iteration the third version, meaning that I've improved it a lot and listened to you guys on what stuff you want in the course. So I think it's actually really good. There's always room for improvement, of course, but this one, I really enjoyed this one. And it was fun making it also. So hopefully, you'll find a lot of basic stuff and intermediate stuff, and maybe some advanced stuff to learn in this course. And I think we have to get started. So let's do that. Let's take a look at the application that we're building in this course. And it's a nice little move application that is based on the Movie Database API. So you'll have to create an account at the Movie Database. But we'll do that in the next video. So I thought I could show you the application so that you have a little feeling about what we're going to build in this course. And this one is always going to show the most popular movie here we have this hero image. So we're going to create this one. And we also have some text, and we have a header up here also, then we can search for movies, or examples, Star Wars. And we'll see all the movies here. So that's how the basic functionality of this application is. And if we click on the movie, you can see that we get all data from that movie. So that's nice. We're going to show the actress and also some information about the movie itself, we can see the revenue, the budget, and the running time, for example. And here, you may think that you can also click on actors. And yeah, of course, we could do that. But I have to limit this tutorial somewhere. So this course is not going to go there. But it's a great foundation, if you want to build upon this application. So you can add in the functionality of showing information about the different actors and stuff like that. We also have this little breadcrumb menu appears, we can go back to the homepage. And in this version of the course, this is version three, I'm going to show you how to create the styles also are going to be fairly quick when I show the stars because I still want to have the main focus on react itself. So that's something that's new in this version three of this course. And of course everything is going to be responsive, we're going to create that one also, as you can see here, the grid, for example, with the movies, it changes depending on the viewport size. So that's nice. So it's a fully working application. And to be honest, I'm quite proud of this design, I created the design myself course I'm both a developer and the designer. So that's why I love doing design stuff also. And I think it looks pretty neat. Actually, I've updated it slightly, since two previous versions to look a little bit more modern. But I think it's mostly Yeah, I changed some colors, for example, on the bottom and stuff like that. Alright, so that's the application. In the next video, I'm going to talk about the Movie Database API, and how you can register to get your own free API key that I'm going to use in this course. Okay, so let's talk about the Movie Database API. That's the API that we're going to use in this course. And the Movie Database has a great API for fetching a lot of movies, TV shows and stuff like that, we are going to focus on the movies. So that's what we're going to do here. And you can sign up for a free account at the Movie Database. So just go to the movie db.org. And click Join TMDB. And then you can fill out a username and password an email and create an account. And when you have created an account, you probably get an email where you have to verify yourself before you can log in. But when you have created your account, make sure that you go back to the movie DB and click on login. And then you enter your username and password just as a regular site that you log into. All right, and then you're presented with this dashboard kind of thing. I think it's a dashboard. And the only thing you have to do is go up here to your profile and click on this round button up here. And then you have the settings here so she'll settings. And then at the left menu here, you can see that you have something that's called API. So click on API, I guess I probably have to blur this ones out because I don't want to show you my own API key. This is the one that we using API key version three auth. So this is the one that we're going to use. So make sure to save this somewhere for now because we are going to add it to our application in a little while. So make sure that you have easy access to this one as we're going to paste this in into our application in a little while when we have bootstrapped our application with something that's called create react app. And I'm going to talk more about that in a little while. Before we start creating our application, I just want to talk a little bit about react and what it is. So if you go to the React js.org, you can read more about react. And this is a great starting point, if you just started out with react, they have different documentation, they have tutorials, and a blog and stuff like that. And you can read everything that you need to know to get started with react. So I tried to make this course kind of beginner friendly. But react is kind of at least intermediate in its own nature. So it's hard to make it really, really beginner friendly. It also depends a lot on how you learn stuff, I love to learn stuff in this product oriented way, where I just build some product and learn along the way. So I only create courses on how I want to learn stuff myself, but it's very individual. So some may think that it's not beginner friendly at all, and so many things that it is. That's why I also recommend to check out react js.org to read about the very, very basic stuff, at least in react. So what is react? Yeah, React is a JavaScript library for building user interfaces, as they tell you here, I think, actually that this sentence is a little bit misleading, because you're using react for so much more than to just build a user interface. For example, I build a lot of stuff, I build small games, I build a Pac Man game, for example. And I build all the logic in react also. So it's not only the view layer, so it can be a little bit misleading here, I think. Just thinking about that you create the components for the view. But that's not the case, you can use react for so much more if you want to do that. And in this application, we're building everything in react. So we have all the API calls and everything it's done from react. So that's how we're going to use it in this course. And react uses declarative peridinium. I don't even know if I pronounced that correctly. But hopefully, you know what I mean. So react is declarative. But for example, jQuery is imperative. And when something is declarative, you explain, in this case, the user interface, how it will look, you don't have to tell it exactly how you want to achieve that look, you just tell it that we want our UI to look in a certain way. And then react takes care of the rest. For example, in jQuery, we have to grab the DOM elements. And we have to modify the DOM elements. And we have to create them row by row, and then attach the element to the DOM itself. So there can be a lot of code involved in doing something simple, actually. But in react, for example, we have as the Savior, it's component based. So we create a component, and then we just tell react to use that component. And it will render out that to the dome for us. And this will be more clear as we go along in the course and create our own components and create the application itself. So don't worry if you don't understand everything right now. So it's declarative, its component base and learn once write anywhere yet as to tell you here, they don't care about the rest of the technology stack. So that's great, you can use a lot of stuff in combination with react. So what is a react component? Yeah, we can take a look here, for example, here they create, this is a class and this is kind of, I like to call it the old way, the classes still exist, I don't use them anymore. And in this course, we're going to focus on creating functional components. And I'm going to tell you more about that later. And in the end of the tutorial, when we're finished application, I also going to show you how to convert some of the components, the stateful components to class components, just in case, you need to know how to create class components also, because the reality is, if you start working for a company or a client, there may probably be some components that are still class components. Because there's a lot of applications made in react that's made before we had state in functional components. That's why you had to had a class before to have stayed in them. And we're going to talk about that later also. So this is a component they created with a class and they call it Hello message. And as you can see here, they using something that's very much like regular HTML, they have this tag here with a Hello message. And this name is a so called prop the sending in, and we're going to talk more about props also later, so don't worry about that. But this is actually not HTML. It's something that called JSX. And that's something that we're also going to learn in this course. So we create the component here, we tell it to use this component and react will take care of the rest and create this div with our text Hello. And in this case, it's going to be the name that we send in with a prop. So the name is going to be Taylor. It's going to type out Hello Taylor. As you can see here. So this is very, very neat with react, we can reuse these components in our application. So that's short on what react is. And as I told you, we're going to learn a lot more stuff in the course itself when we create application. And hopefully, at the end of the course, you'll have more understanding of react and how awesome it is. Because I really love react, I'm really passionate about using react. And actually, this course is also something that I'm very passionate about. Because this is my first ever course I created. And this is the third version, meaning that I have listened to people that have enrolled this course before and changed stuff and added stuff to make it more optimal and more perfect. And hopefully, you will enjoy this course. For this course, I provided you with a sip file that you should download before you start the course. And this zip file contains a few folders here, as you can see, and it may look maybe a little bit different when I am the recording of this course, because I haven't really recorded it yet, but I think it will look this way. But if it looks a little bit different, it's okay. Hopefully you can read the folder names and understand what they for. So I'm going to provide you with a folder that's called files to be copied to the project folder. These are files that we're going to use for the course. So I have created a file for us the setups API, so we don't have to write our own functions for fetching the data. So I'm going to show you that when we fetch data from the API, I have a config file and a helpers file. And I'm going to talk more about those later also. And then I have a few images that we also need for the course. So that's why I have this folder that we're going to copy over to a project when we have created it, and the public folder, the index dot HTML file, I have this here, because I'm using a Google Font for this one. So I've already provided that one in the index dot HTML, so we don't have to do that ourselves. So that's the one that we have to copy later. And I'm going to show you that when the time comes. And you're also going to have two options. If you don't want to create everything from scratch, when I set up the application, you can just ignore that and start from a project without the styles. And this is if you want to create the styles also, I structured this course. So you should be able to fairly easily just skip the parts where I create the styling for the components. Some people have, you don't want to create the CSS and the styling. So that's why I made it in this way. So this is the one you should use if you want to create the styles. Otherwise, you use the one that's called with styles, that one will provide you with all the styling, so you don't have to type in the styles. And you can skip those videos. So if you want to start from one of those projects, you navigate inside of that one, and in your terminal, you type npm install, and that's going to install all the dependencies for you. And then every time you start up the application, you can type in NPM start. And that's also something that I'm going to show you, so don't worry about that. Then you have a folder with the finished app if you want to check out the result. But please be aware here, you have to put your own API key in a file that's hidden here now is called dot end. inside of that one, you have to paste in your own API key, otherwise, it won't work. And that goes for the step solutions. Also, I have provided you with step solutions that corresponds to each video. And if you want to run an example, from a particular step solution, you also have to paste in your API key in the dot m file. And I also got to talk more about the dot m file. But this is the start of files. So you have to think about if you want to create the styling in this course, and you also have to think about now if you want to set everything up from scratch. Or if you don't want to do that, you can just start from one of these folders here, navigate inside Odin type npm install, or if you're using yarn, you should be able to use that one also. And then NPM start or yarn start to start up the application. Alright, let's move on in the next video. I'm just shortly going to talk about the tooling that I'm using for this course. Just a short, short little video about what tooling I'm using for this course, I think you already should know this tooling and have it installed to be able to fully take advantage of this course. Otherwise, it can be a little bit hard. if you for example, haven't used NPM that I'm going to use to install dependencies. I suggest that you learn about that first, because this is a beginner slash intermediate course in react. It's not a beginner course in coding, you should know some JavaScript and especially iOS six syntax, we're going to use a lot of iOS six syntax in this course. So it should be a good idea to shape up your knowledge in JavaScript before starting to learn. react. But that's only my opinion. But of course, you should do it your own way. If you want to learn react before vanilla JavaScript, it's totally up to you, I shouldn't tell anyone on how they want to take on their coding journey. All right, so I'm using NPM. And that means that I have to have node installed, we're not using no de s, per se. But no, Deus includes the NPM package manager. So that's why we have to install that one. So if you don't have that installed, make sure to grab the latest version and install it. Then I use Visual Studio code as my ID. So that's what I'm using in this course. And then I'm going to use create react app and bootstrap our react application really fast and easy. So that's what we're going to do. And I'm actually going to do that in the next video. So let's get started with our application. I'm happy to see that you're going to create this project from scratch. And we're going to use create react app to bootstrap our application. So let's get started. If we look at the homepage for create react app, you can find it at create dash react dash app dot Dev. And then they have something here in the menu that's called get started. And the only thing that we have to do is remember this row here mpex, create dash react dash app. And then you have the name of your application that you want to create an empty x is something that's provided with NPM in the latest versions, so you don't have to globally install create react app to use it, this will make sure that we grab the latest version. So I always use mpex, instead of first globally installing create react app. So this is really great, because then I know that I'm using the latest version, and you don't have to install it globally. But if you want to do that, you can of course install create react app globally first, but this is the command that I'm going to use. So make sure that you navigate inside of your terminal. I'm using a terminal that's called hyper, I get a lot of questions about that what terminal I'm using, I actually don't remember the name of the theme, but I style it a little bit to my likings. So that's sweet. So hyper is a great terminal. If you want to have a customized terminal. You also have a built in Terminal in Visual Studio code, of course. So let's get started, make sure that you navigate inside of a folder where you want to create the reputation. And then we type in MP x and then create dash, React dash app. And then we have the name of our application. And I'm going to name it react dash or dB. And RM DB stands for react Movie Database. So that's the best I could come up with. You can use whatever name you want. And then we can hit Enter, and then wait for it. It will install everything for us. So it will take a little while. All right. Hopefully that installed correctly for you. And create react app has now hopefully bootstrap or application, you could set up this yourself and not use create react app. But create react app is actually used in in many production applications. And it's actually used right now for a client that I work with. And it's a fairly large application. So you can do a lot of stuff with create react app. And it's using Babel and Webpack in the background to set up direct environment for you. So that's what you can do yourself if you don't want to use crate react app. But I'm not going to show that in this course, because I think it's a little bit advanced for a beginner course. And actually, we're going to be fine with create react app, that's all that we need. So we also want to make sure that it works. So make sure that you navigate inside of the product folder, I'm going to clear this and then type in a CD, React dash or MDB, or whatever you named it. And then we're inside of that folder. And then we can type NPM start. And it should start up our environment. This is the finished one that's here now. So it's going to be replaced by this application here. So it's working. And we have successfully bootstrap our application. And that's sweet. In the next video, we're going to install a few dependencies that we're going to use for this project. We are bootstrap the application. And now we're going to install some dependencies that we're going to use for this project. And the first one is going to be something that's called react router. And react router is the standard in react application for handling routes, because this is a single page application. And we need something to handle or rolling because we are going to have different pages. And the one that we're going to use is called react router. There is another library that's called reach router. And I'm actually using that one in version two of this course. But the team that created reach router and react router is the same team. So they're going to kind of merge them together into react router, version six. And this one is still in beta mode, but I've talked to them and I think that I should have this one in this course, because it will soon be out. And the API won't likely change because we're not going to use the most advanced stuff in this router library. So we will be fine. And we have some instructions down here. I'm at github.com, forward slash react training forward slash react dash router, forward slash releases. And down below here, we can see that we have some instructions on how to install it. So I'm going to bring up my terminal, do something like this. And we could of course, just copy this one and paste it in. But in my courses, I wanted to learn as much as possible. And it's always a great idea to not copy paste too much and type stuff in because that will make you remember stuff much easier. So that's what we're going to do now. So I'm going to type in MPM II, or if you're using yarn, you can, of course use that instead, I'm going to use NPM for this whole course. And I'm typing in I instead of typing out the complete word install, that's a short term for install. So NPM I, and then we need to install something that's called history. Also, that's another library that's used in combination with react router, and we can install them in one go. If I type history here, then I have a blank space. And then I can type in the other library that I want install. And in this case, it's going to be react dash, router, dash dome. And then we have an add sign. And next, and this will grab the better version of react router. So press enter, and wait for it. Hopefully, that installed for you correctly. So I'm going to clear my console again. And we're going to move on to something that's called styled components, styled components is a super great library to use in combination with react with styled components, we can create our CSS in isolated and scoped components. So that's really, really great. And we have a lot of features that we have, for example, in SAS, we can do nesting and stuff like that. And we can send him props and change our styling dynamically. And we're going to talk more about styled components as we go along in this course, because we are going to create the styling. If you choose that path there, I really think you should if you want to have some CSS practice, but it's up to you, I provided you with different alternatives for this course. So we're going to install style components. And you can read more about it at style dash components.com. So go back to the terminal, and we type in MPM is styled dash components. And we press enter. Alright, that went smoothly. So clear the console yet again, and we move on to the last dependency that we need. And that is something that's called prop types. Prop types is a great tool in react, where you can type check your props that you send into your components. So as they say, here is runtime type checking for react props and similar objects. So that's great. Today, a lot of people use TypeScript instead, then you don't need to use prop types. And I actually use TypeScript a lot myself, I'm starting to like it actually. But in our case, we're not using TypeScript. Right. Now, I'm going to show you that at the end of this course in a special module that I created, where we refactor everything to use TypeScript instead. But for now, we're not using TypeScript. So that's why we're going to use prop types. And I'm going to talk more about this later in the course. And I've placed it title at the end of the course, because I don't want too much stuff going on when we learn react. So that's why, so I'm going to talk about it at the end of the course. And when you create a component that has some props, you should use prop types to do type checking on your props. But I'm not going to do that first, I'm going to add it in later in the course. So we don't get distracted or have too much stuff going on. All right, to go back to the terminal, type in NPM. I dropped dash types, and press enter. So that's it. That's our dependencies. And of course, I didn't mention it at the start of this video, you should of course be in the folder that we created the application that we bootstrapped with create react app, it's very important, you have to navigate inside of that folder. Otherwise, it won't work because we're installing the dependencies in that project folder. Alright, in the next video, we're going to copy some files from the store to file c file to this project that we're going to need to make this work. If we look inside of our project folder, React dash orientdb, we can see that we have some different folders and files here. And for example, if we look in the public folder, we can see that we have some image files and the index dot HTML file. And this is the folder that the dev environment is going to build for us. So the public folder is the finished files that we're using for running the application. So that's everything inside of there. And the source folder. The src folder is going to be the folder where we create all our stuff for application. So you can see we have some CSS file, we have an app file, an index file and an index CSS file. We also have a test file. We're not going to do any tests in this course. So this one, we're not going to use. And we have a service worker, we're not going to use this one either. And we have the set of tests that we're not going to use. If we take a look inside of a zip file, the starter files that you should have downloaded for this course. And we take a look inside of the first folder here, one files to be copied to product folder. Alright, so that's the files that gonna be copied to the project. So make sure that you mark them here, copy them, move back to your folder, your project folder, and paste them in. And then you're going to choose to replace the old folders. This one is in Swedish here. So you probably don't understand it if you're not from Sweden. But what it says here is to replace it, so I'm going to click that button. And then it's going to ask me if I want to merge the source folder or if I want to replace it. So if it asks you to merge it or replace it, always choose replace. All right, so we successfully copied the files. And if we take a look inside of the public folder, here, we're going to have exactly the same files. The only difference is that I've added in a Google import of a font that's called Abel or Apple, I don't really know, if I pronounce it correctly, it sounds better to pronounce it, Abel. So I think that's the correct one. That's the only thing I've changed here. And that's the in the index dot HTML file, the other files remain the same. So that's the public folder. And if we look inside of the src folder, you can see that it's lesser files now. And that's because I removed all the files that has something to do with tests, or the service worker and all the CSS files that we don't need, because we're going to use styled components. And I also added in some files and a folder, we have the images folder. And this one, of course contains the images that we're going to use for this course. And then I have a file that called API dot j s. And inside of this file, there are some functions that are going to handle the API calls to the Movie Database API. And in the previous versions, we actually created this ones ourselves in the course. But I think that was just a distraction from react and react syntax. Because this is a course about learning react. And the thing is that this is regular JavaScript inside of this one, it has nothing to do with react per se. So that's why I created this one for you instead, and placed them in a file. And of course, I'm going to talk more about these functions when we reach that point in the course. And then I have a config file. And this config file contains everything that has to be set up with a Movie Database API. And I have a helpers file also, and help us file contains a couple of functions that will help us to convert some numbers into money, and also to convert our time. And I'm gonna talk more about these two files also, later in this course. So these are the files, hopefully this one will work. So if we go back to our terminal, and this one is running now, so just to be sure, I'm going to break it and run NPM start just to see that it works. It's always a great idea to see that stuff works when you're sharing something. And then I go to my browser and reload the page. And you can see I'm at localhost 3000, just as before. But now this nice little rotating react logo is removed, and it says start here. And that is because I removed that one. And I've modified this file so that we can start from here now in this application. So if it says start here, you know that you successfully copied all the files, hopefully, and it should work for you. In the next video, we're going to move on and actually use that API key that you got when you registered for the Movie Database API. Okay, we got one more thing to do. And then we finished with the setup of our project. And that is that we're going to create a dot m file and paste in our API key. So in our application folder at the root, we're going to create a new file, I'm going to call it dot E and V dot m, and create react app has built in support for environmental variables, the only thing that you have to do is to name them with react first. So react, underscore, and that's important, otherwise, it won't recognize it. And this one is going to be called AP underscore API underscore key, all capital letters. And then we have an equal sign. And then you can paste in your API key here. And that's everything you have to do. So just paste it in just after the equal sign, and you're good to go. And save the file. This API key is then used in the source folder in my config.js file. You can see that our get it to here, process dot n dot react app API key. And this is all managed inside of the Create react app. When it starts up or dev environment and creates all the files for us and stuff. It will take care of these various really important to market with react underscore before the actual name of the environmental variable and all this Here is something that I created for you. So you don't have to care about this. So I create the different resources from the endpoint on the Movie Database here. And we're going to use these resources in the course later. And then I'm going to talk about more. So I have different endpoints for the search, for example, and to get the popular movies. And this was our for the bonus videos at the end, where I create the login, and voting that also provided with the Movie Database API, you can log in with your account, and cast a vote on a movie, or on old movies. If you want to do that. Then we have the image base URL. This one is also from the movie database. So these ones are provided from the API. So just use them according to their instructions. And we have a backdrop size, we can set the size of the backdrop and the poster size on the images, we can set different sizes here and I mark them here for you if you want to try to change them and see what it does. So we don't have to think more about these as I set them up for you. And there's also a file, it's called API dot j s. And inside of this one, I created the actual code that is going to fetch the data, we can call these functions later when we fetch the data. And we don't have to type in all of this ourselves. And of course, I'm also going to talk more about these functions later when we fetch the movies. So this one is for fetching all the movies, and this one is for fetching one movie. And then we have this one here that will fetch the credits. And below here, these are all for the bonus material also. So you don't have to care about those in the kind of main part of the course. So we have three functions here that is going to fetch data for us. So that's one thing I changed actually, in this version of the course before this, we created these ones ourselves in the course, but I think it's a little bit advanced for a beginner course. And I also think that it takes the focus on react itself, because this is JavaScript, it's not react specific code. So that's why and I want this experience, I want this course to be a fun course also. So you don't get tired and stop the course and won't finish it. So that's why I created these ones for us. Alright, so that's the config and a py file. And then I have one more file that's called helpers dot j s. And this one contains two functions, that's going to help us to calculate the time and also convert to money, because the numbers that we get from the API has to be converted both the time and the money. So I'm going to use these ones later in the course also. Alright, so create the dot m file, create a variable, React underscore app, underscore API underscore key capital letters equals and then you paste in your API key. Otherwise, it won't work because you can't access the API. one really important thing to notice here is that this environmental variable won't be safe, because it will be visible in the client. So don't think that this one won't show up in the browser, of course, you have to look for it. But if you're good at looking through code, you will be able to find this API key. So this is not a safe way to provide an API key if you want to hide it from the browser. In our case, it's not that kind of a secret key, that doesn't matter. And for the sake of the course, it would be too advanced to create a system that will hide this for us completely. So notice, this one won't be safe in the client. Before we move on, I want to talk about a really important aspect of react that I think a lot of people actually forget. And that is when we create stuff with react, we are also using something that's called JSX. And it stands for JavaScript, XML. And if we look here, I'm at the React js.org page now, and they show us here how to create the component. And this is a class component. And as I told you, before, we are going to create functional components. So we're not going to create class components for this application. But they are using JSX. Here, and this is JSX. You may think that this is HTML, but it's actually not it's JSX. And JSX is something that is really great to use in combination with react, because we can render out our different components like this by using HTML ish syntax. I think a lot of people actually forget it. Because I don't know exactly the percentage, but I think at least 99% of the applications use JSX. In combination with react, some people don't use it. And that's what I'm going to talk about here. Because you can create components without JSX in react. And that is if we scroll down here, you use something that's called create element on the React objects react dot create element, we specify if we want some props. And then we specify the Child Elements for this element. And you can see up here, React dot create element, we have the component that we want to create, we have the props, and also we have the children and this is the spread syntax in JavaScript, he has six. That's why they use three dots here to explain this though. This one Here is actually the same as this, this one here, will transpile down to react dot create element. But it wouldn't be practical to use react dot create element for every component and everything you do in react, you can see that it's not that readable, and it will get kind of messy. And I actually think that react wouldn't be that fun to use if you use it this way. So I'm just going to show you how to create an element with react dot create element also. And in the next video, I'm going to talk more about JSX. But now I'm going to show you just a small example on how you can create an element with react dot create element. So let's move back to our terminal and make sure that our dev environment is running. So NPM start, always use NPM. Start, when you start up your dev server, you can see that we have it running here now. Then I go back to Visual Studio code. And I'm going to be in the app.js file. For this one, it's inside the src folder. And this is kind of the heart of our application, we have the index.js. That is the start file for the application. And you can see the there are import the app component here, these imports are e6 syntax for import. So we can import a model. And in this case, the model is a component. And it's called app. So I import that one here. And then it's used here and this one is JSX. So this is the heart of our application, we have both a library that's called react. And we have react Dom because react can be used for other stuff than the DOM, for example, you can create native apps with react. But we are going to use the library react DOM. And this one is all set up with create react app for us. So you can see that from the React Dom that we import here, we call the render method. And we give it the component that we want to render. And we'll tell it where we want to render it. So from the document dot get element by ID, we get the root element. So if we look inside a republic and the index dot HTML, you can see that we have a div here, that's called root. And it's inside of this div, that we're going to render out our complete application within close to public folder node, and go back to the index.js file. So we're telling react to render our application to a div that's called route. And it's also in something that's called react strict mode. It wasn't that before. But this is a default. Now with great drag that in strict mode is actually great. It's going to do a few more checks if you do some stuff that it shouldn't be doing when you code your application. So it's always a good idea to using the strict mode in react. Alright, so let's move back to the app.js file. And as you can see, here, we have this element here, we have the div that's called AP. And I render out start here. And that's the one that we saw before, when we started up the application. You don't have to type this in if you don't want, because I want to show you this, this has nothing to do with application that we're going to build. So I'm going to create a little component now. And then I'm going to remove it and we can continue on creating our application. I'm going to do it with an arrow function, I like to use arrow function, they don't do it here. But you can change this one if you want to an arrow function const app equals, and then we create an arrow here instead, like that, I'm used to using arrow functions. So I use them for components also. So const, I'm going to create a component that's called store, and I have an arrow function. And then from react, we import react here, you always have to import react at the top, and another call create element, I have a parenthesis, I'm going to create a div. And then we're not going to have any props because we haven't talked about props yet. So I set that one to now, and then I'm going to render out the screen. This is a little store like that, and I'm going to remove the sidebar, we can see the component here. So this is instead of using JSX. And if we want to render this one out, instead of returning this one here, I'm going to return the store. And as this is the function now, I also have to call it like this, save it. And then I'm going to go back to the application. And you can see this is a little star, so it renders out perfectly. And this is just a small example. And I want to just for you to notice that you don't need to use JSX. And this is actually the React functionality at its core. So you don't have to use JSX. But we are going to use JSX because it's sweet, and it's fun to work with. And I think actually that it would be a small l creating applications without JSX at least I think so. So, I remove everything I created here and save the file. Again, just make sure that it works stored here. And it works and that's great. So that's a little bit about react dot create element and using react Without JSX, just a small, small note on that one, I'm not going to go any deeper into it, because I don't think it's actually relevant to use react without JSX. So that's why. Okay, I talked a little about using react without JSX. But I actually don't think that's a great idea. So that's why I also want to talk a little about JSX before we move on with this application. So JSX stands for JavaScript, XML, and it's pretty similar to regular HTML. So if we take a look here, you can see that they create an h1 tag here that says hello word. And this looks just like plain HTML. But as they say, here, this fun attack syntax is neither a string nor HTML, I actually don't think it's a fun attack as to say here, but alright, you get the ID, why JSX. We can read here more about why we are using JSX. And the main thing here thing is that they don't want to put markup in one file and logic in another file, they want to have them combined in one file. And that may sound scary for some, because a couple of years ago, you shouldn't ever mix them together. But in react, it works really great. And as they say, here, rack components contain both markup and logic. So JSX is something that is created to look pretty similar to HTML, there are a few differences. And I wanted to talk about those here. Because in this case, we create an h1 element. And that looks exactly the same. But there are some stuff that differ from regular HTML. And for example, you can see you can embed JavaScript as expressions here. For the source area in the image tag, for example, you can use curly brackets, and then you embed your JavaScript expression. And that's super great that you can combine them this way. And also, as you look at tab index, it's camel cased that differs from HTML. And they say it here also seems JSX is closer to the JavaScript, then to HTML, react, Dom uses camel case property naming convention instead of HTML attribute names. So remember that, that you have to use camel case in JSX. And there are some few differences. For example, when you set a class on an element, you don't use the class keyword, you use class name, camel cased. And they also mentioned it here. And it took a little bit of time for me to get used to this one. And no, I actually typing class name when I type out regular HTML. And also, it's good to know that JSX is quite safe, it prevents injection attacks and stuff like that. So I think you'll learn a lot about JSX. As we go along in this course, because we are going to use practical examples in this course, not the most important part is to remember that JSX is not HTML. And it's also used camel casing when you create an attribute. Before we dive in and create our components with state and props, and all these vital things in react, you can sit down, relax, have a drink, have a beer, have a cup of tea, or whatever you're drinking. And just listen to me in this video, where I'm going to talk a little about props and state in react, the first thing you can do is to imagine that this is a room seen from above. And the gray circle here is a lamp that's not turned on. And the orange one is a lamp that's turned on, each of these lamps has a light switch that is often on. So if I click this one here, I can turn this light on and the light switch is going to change to on. And this one I can turn it off. So both lamps are off, and I turn this one on, and I turn this one on. And this is made possible because I can use state in react. So I have two states for the lamps. I have one state for the first time and one for the second lamp that is a Boolean that is telling if the lamp is on and off. But if we think about this, we actually have a state of the room also, because we need a state also for the light switch to change from off to on. Because these are kind of tied together so that you can look at the state in different perspectives. In this case, I will look at the state from the room perspective. So I haven't placed the states in the lamps or in the light switches, I have placed the states in the room itself because we have a room stage and for the room is going to be if the lamps and the light switches are on or off. So we have a state for the room itself. And this is what I talked about in the for example the React documentation, they tell you that you can lift up the state to a parent component if you want to use that stayed in multiple child components. Because if we placed the state in the lamp itself, for example, we could only access that state in the lamp unto its child components. Of course, we could place the light switches as a child to the lamp, but that wouldn't be the most effective way of doing it. And it would complicate things if you want to reuse your code. So what I've done here is study is that I had this room here and I placed the components in the room and I'm also going to have the state in the room so we can use that state both for the lamps and the light switches and I'm going to show you how Do this now, and also talk a little bit more about state and props. So if we take a look inside of the code here, this is the application that I created for you. You can also open it up from the source files in this course, I provided it there. So I have the index file, the standard index file that shows the app component, and app component is actually going to be the room. So I could also name this room because this is actually the room component. And as you can see here, in the room component, I'm creating two states. In react when you create a state with hooks, you use something that's called the use state hook. Before we had hooks, we had to use classes to have state in them. So you couldn't ever create a functional component that has stayed in them. But now we have hooks, and that means that we can have stateful functional components. And that's sweet. So when we call this use state hook, we can initialize it with an initial value. So in this case, I'm giving it false, because I want this lamp to be turned off initially. Then I do something that's called ear six destruction here on destruction of this array that I get back from the use state hook. So we can name our state here to whatever we want. In this case, I name it is lamp one on and then we have the Center for the state center is lamp one on. And there's a few things you should know about state in react. And the first one is that you should look at the state as immutable, you should never mutate the state, then that means that you always should use the state setter that you get back to set the state in react. If you're modifying the state directly, for example, try to change this one. This means that your component won't rerender. And that's no good. And it can also cause a lot of trouble in the future for you in the application. But if you use the setter and change the state and don't mutate the state, your component will rerender and update the DOM. And this is how stuff works in react, you update the DOM when your components rerender. And one more thing with functional components is that we can add as many states as we want with the use state hook in the class components, you can only have one state, so you have to turn to create an object with different properties to hold your state. So this is super sweet, we can divide the states up now depending on how we want to structure the state. So in this case, I created two states, I have one for the lamp one, and I have one for lamp two. So they are doing the exact same thing. The only difference here is when I initialize it, I set this one to true and this will turn lamp two on. Alright, now I have two functions. And these ones are going to be called when we click the light switch. So I have one for the light switch one and one for the light switch two, you could have one function instead. But I want to make it really, really clear on how stuff works. So that's why I created two of them. So we have one function for the switch one and one for the switch two. And this one will set is lamp one, that's the setter for the state one for the lamp one. And what I do here is that I provide it with an inline function. And when you provide the state setter with a function, it will get called with the previous state. So in this case, I'm going to flip that boolean value. So when I click the button, the first time this value is going to get be true instead because it's false initially. And this one for a button two is going to be false because it's true. All right, these are functions for a light switches. So if we looked at the JSX, here, what we return to the dome, this one is a room component. And if I go up here, you can see that this is the style component that we're also going to talk a lot about in this course, I create a style component, that's a div here. So I set some styling on that one on the room itself, I make it 500 pixels width and 500 pixels in height, then I set a border on it, and the margin zero in order is going to center it on the screen. So everything is wrapped in this room component, then I have a component, that's the lamp, I'm going to talk about that in a second. And I also have the light switch. So we have the state in this app component. That's the room. So this is where I kind of gather all the states for this little simple application. And this way, I can use this state in both the lamp component and the light switch. Because as you can see here for the lamp component i created something that's called props, props is something that you can create and that will get sent along into your component that you create props is an object. So you can create as many properties on that object as you want. In this case, I created a lamp on Prop. So this one will be sent into the lamp component in the prop object. I also created a prop that's called position. And this is how I can make the lamp appear on the left or on the right in the room. And lamp on is going to be the state for the lamps. So this one is going to be a Boolean. And that way this component will know if the lamp is on and off. And I'm going to show you that in a second. And I do the same with a light switch. And for this one I have the callback as I showed up here. I give this one a prop that I call callback. It doesn't have to be Call callback, that's the name that I chose. And the switch on, I'm going to give it a lamp state for this one. So you can see that I use the lamp states for both the lamp and the light switches. And this is what I talked about before, if we created the state for the lamp in the lamp itself, we wouldn't be able to access this state for the light switch, then we have to create the light switch as a child of the lamp. And that's no good, as you probably can see now, because now we can place as many lamps and light switches we want in our room. So it would be much harder to do it if we place the stain in the lamp itself. And I also have a position prop for the light switch. So let's go inside of the lamp component that I created here. I also have a wrapper div for this one that's a styled component. So I wrap everything in that div. And the interesting thing with style components is that they also can have props because they are also valid react components. So we can use props in our style components to modify our CSS. And that's one of the super strengths with style components, I think, because as you can see here, this is this is something that's called a template literal. And in this template literal, we can grab the props that are sent into this component. So in this case, I create dollar sign and curly brackets, and I can use a JavaScript expression. And I have this inline function here that gets the props. So if we look at the wrapper component down here, you can see that I also send in a prop lamp on and the position. So I'm just sending along these props that are initially sent into the lamp component. So I get them in the lab component, and then I also send them along to the wrapper component. That's the style component. And by doing this, I can, for example, check here, if the props dot position equals to the left, then I'm going to set the left value to 20 pixels. Otherwise, I set it to three or underneath two pixels, and that will place it to the right in the room. So this way, I can modify my CSS and make it very, very dynamic. So that's really sweet that you also can use props in the style components. Alright, that's how style component and props works. So if we look at the lab component here, I'm sending in these props here. And what I'm doing here is I'm using iOS six destructuring. So from the objects that we get that you usually call it props, I'm destructuring out these values that are sending, if I didn't do the destructuring here, and I just do it like this, you can see that it wants me here now, then I have to type in props, dot and props, not because the props is an object, so I have to grab those specific properties from the toggle. But if I destructor it out as I do, here, I don't have to type that in every time. So I just structure out the properties here instead. And there's a few things you should know about props because they differ from state. And the main difference is that the props are passed into the components. And you should never ever change the props in the component that gets the props, the props, values are changed from the parent that is sending in the props to the component. So if the props change in the parent, it's also going to rerender, this component here. So never ever change the props values in this component, you can change the state in the component with a state setter. And that's how you, for example, can trigger a rerender. When you change the state in a component. So that's fine, you should change the state in the component with the setters. But a prompt should never be ashamed in a component that receives the props. When the prop value changes, this component will rerender and it will have the new value in the props. So that's how props works. All right, we can check out the light switch. Also, I'm doing the same here I am destructuring out the props here. And I have this bottom component. That's the star component. And I modify it with props here also. So I'm doing the exact same thing here. And you can see here that are sending the callback, that's the function that I have in the app component here. So that's the one I'm sending in with a callback prop into the light switch. And then I have my button, and the button has an onClick handler an onClick handler will trigger this callback function. And this makes this component very dynamic because by using props, you can make your component dynamic. And you can use it in different situations. In this case, I can send in whatever callback function I want to be triggered when I click on the button. So that means that I can use this button in different situations. In this case, I also showing the switch on and off because I was sending in the prop switch on. So it probably won't be useful, too much less than this use case specifically. But if you want you can use this button for something else done to trigger a lamp to be turned on or off, you can turn something else on and off and have another callback function and that will work. So that's what you use props for. Also, you can make your components dynamic and reusable by giving them some props. And by using these props inside of the component. You can adapt your component and change the logic you can change the JSX and what it should render and stuff like that. So that is really useful to us. props for that. Alright, so that's short on state and props. I hope this one gave you some insight before we start creating our own. So let's move on in the next video, I'm going to talk more about style components and what they are. There's one less thing I want to talk about before we start creating some code for real. And that is styled components. Because in the next video, we're going to create a global styles for our application. And we're going to do that with styled components. So just a short talk about style components and why it's so great. And I think the biggest benefit is one that you get scoped CSS. And that means that you can have the same class names for different components, it doesn't matter because it's scoped to that component. And number two is that you can use syntax, kind of like sass, for example, you can nest stuff, and you don't need to have polyfills, and stuff like that, it will create all that automatically for you. And number three, is that you can have props inside of it. And props is something that we're going to talk a lot about in this course, because it's an essential part in react. And that means that you can modify the CSS by sending in different props to your styles, you don't need to know exactly now how props work, because we're going to talk about that later in the course. And also, you can use just plain regular CSS, and that's super great also. So that is some benefits that style components will provide to you when using it in your application. So we already install this library. And when you use it, you have to import something that's called style, I think they have an example down here, here, input styled from styled components. And style is an object that holds different properties. For example, in this case, they want to style a bottom. So these properties corresponds to what they are called in HTML. So if you want to style a button, if you want to create a style component, that is a button, you use style dot button, and then you have a template literal. So this is something that's called a tag template literal. And that is a function that you call with a template literal. So this is e6 syntax in JavaScript. And it's super great, because if we move up here, again, you can see, we have this template literal. Here, you have the starting backtick. And you have the end back to here. And inside of here, we can write our CSS. In this case, they're using style dot A, because they want to style an a tag. And then they do some stuff here, plain regular CSS. But here is something that's happening. That's not plain CSS. And this is because we using a template literal here, we can use JavaScript expressions inside of this template literal. And when you want to use an expression inside of a template literal, you do that with $1 sign, and you wrap it inside of curly brackets. And then you can have any JavaScript expression that you want inside of here, and it will interpolate it into the string. And in this case, you can see that they have their props, and they have an inline arrow function. And from the props, they grab a prop. That's called primary. And you can set this CSS conditionally, depending on this primary prop. And we're going to talk more about this later, as I told you, so don't get intimidated. If you don't understand this syntax right now, hopefully, you will understand it fully when this course is over. This is just a short introduction, before we create the global styling. And we're going to do that in the next video. It's time to start coding. And we're going to start by creating some global styles. The first thing you have to do is to start up your dev environment. And you do that by navigating inside of the folder of your application. And then you type NPM start, and that will start everything up for you. And hopefully it looks something like this, it should say start here. And it's always a good idea to have your console open. I'm on Chrome now. So it looks something like this. And also I can recommend an extension. That's called react developer tools. And then you will have access to something that's called components here. And if we open that up, we can see our application here. But in this case, we don't have any components yet. So it will just show the app component here. But this is a great tool when you develop stuff in react. So highly recommended install react developer tools. Okay, so let's move back to our application inside of Visual Studio code, or whatever ID or using an inside src folder, we're going to create a new file that I'm going to call that I'm going to call global style, capital G and capital s.js. So this is going to hold all the global styles for our application. And we're going to create a global styles with style components. So that's why we have to import a special thing from the style components. That's called create global style. So we start by doing that import curly brackets. Create Lobel style camel case, that means that there's a capital D and a capital S. And we ported from style dash components. And this is how we import the module with e6 syntax. In this case, it's not what's called the default export from this library. So that's why we grabbing it inside of the curly brackets, we are going to create default exports from our different components. And then we don't need to use the curly brackets. But I'm going to show you that later when we create our first component. Okay, so we have this create global style method that we imported. Here, we are going to use a global styles inside of our app component later, meaning that we want to import it here and use it down here in the JSX. So that also means that we have to export this styled component from this file, so export. And this is a const. Also e6 syntax, it stands for constant. So that's what we have in JavaScript. Now we have let's we have const. And we have various, I'm always using const. Before I know if this one is going to change, and then I change it to a left, it's going to change in the application. But usually const will do, at least when you do functional programming, as we mostly going to do in this course. So const means that this one is not going to change. As with everything, there are special cases when it can change. For example, if you create an object with a const, you can change the properties in that object, but you can't change the object itself. Alright, enough about that. This one is going to be called Global style. And this is a component, and every component that you create in react is going to have a capital letter to begin with. So capital G and capital S in this case, and it's going to equal and then we call this method that we imported up here, create global style. And in this case, we're not going to have a dot and something here because this is the global style. So we're going to have double backticks, creating our template literal. And then I do like this. And then we can write our CSS inside of this template literal. And the rest of your is going to be regular plain CSS. So first, I want to set up some CSS variables. To call on Route, we do that on the route. And when you create a CSS variable, you do that with double dash. And then you have your variable name. So max width, this is camel cased, as you can see here, are going to set the max width to 1280 pixels. And then I have another variable double dash white. And then I set my white color, another variable double dash light gray. This one is going to be E double dash med grade, or medium grade. And this one is going to be 335 re 535 double dash, dark gray. And this one is one c one c one C double dash font super big. That's a funny name, I forgot that I call it that. All right, you can call it whatever you want. This one is going to be 2.5 REM. And the next one is double dash and font big 1.5 REM double dash font med or medium 1.2. REM. And the last one is going to be double dash font small, one REM. And that's our CSS variables that we're going to use for this application. Then I'm going to set the font for the whole application and also do some resetting here. So I have an asterisk. Like that, I set the box sizing to border dash box. And then I set the font family to able and that's the Google Font that is important from the index dot HTML file. And then a how to backup font or sans serif. Alright, that's the resetting then on the body. I'm going to set a few things also. So we're going to set the margin zero, the padding is going to be zero, like that. And then as I told you with start components, you can nest stuff inside of the body, we can nest the h1 tag like this, and set the font size to two REM font weight is going to be 600 and the color and I'm going to grab this from my variables that I created up here. And when you grab a variable in CSS, you do that by typing out various parenthesis and then the variable name in this case it's going to be double dash white. So that's the h1 then I'm going to set the age three The font size is going to be 1.1 or M. And the font weight is going to be 600 on that one also. And then one more thing to do here, and that's the p tag. So font size, one REM for the p tag, and the color is also going to be white. So var, double dash white. And then I also do some auto formatting. And sometimes when I do this, create global styling, the auto formatting doesn't work. I don't know why. So I do it manually instead and save the file. Always remember to save your files, it's very easy to forget to save the file, and then it doesn't work. So this is everything that we need for our global styles. Now we're going to move inside of the app.js file. And up here where we import react, we can mark it with styles. And then we import global style from dot forward slash global style. So this means that we import in this one that we created here, this constants called Global style, we can import it because we export it inside of this file. We don't do a default export, as I'm going to show you when we create components. That's why we use curly brackets and import this as a named import. And we're importing it from the file that's called Global style. You don't have to type out.js. It's enough we just typing out global style, it will figure the file extension out itself. Right there we have our global stock component. But how do we use it in our application, we should place this at the top level of our application. And as we're going to have a component that wraps are complete application. In this case, it's the div that's called app, it has a class name of app, we're going to change this out later when we have the routing setup. But for now, that's a wrapping div. So inside of that one, we can use a global style. And we self close it like this, we don't have any props to send into this one. And we're not setting a class name or stuff like that. So when you use the playing component without class name, and props in react, you do it like this. And this is very similar to an HTML tag. So we save the file, go back to a browser. And the only thing we can see now is that the margins and padding have changed here, it's just right at the edges here now. And it wasn't that before. So we know that our global styles are working. And we can actually just comment this one out, save the file, go back to a browser. And you can see that the margin is there now. That way, we know that it's working. And hopefully we didn't do any mistake in the CSS itself. So it should work. Otherwise, we have to adjust that later. All right, in the next video, we're going to start creating the header component for the application. So we're going to create our first real component in this application. And it's going to be the header component. So the first thing we do when we create a new component is to create a file for that component. And you can see that we have our src folder here and we have an images folder. But we don't have a folder, that's going to hold our components by usually create a folder, that's called components. That's what I'm going to do now. components, all lowercase letters, and inside of this folder, we're going to create all of our components. And the thing is that the structuring of an application is something that's highly subjective. So you can have your own opinions on how you want to structure it. And if you want to structure it in a different way, you can of course do that. But please be aware that this course will have this folder structure. And you have to think about it. If you change stuff yourself. If you just want to focus on learning react, I highly recommend that you use this folder structure that I created for the course, I also going to have a folder for each component because I want to separate out my styles and have the styles in separate file and have the component itself in a separate file, I've created this course you don't have to create the styles if you want. So that's easier for me to handle it that way by separating the mouth. So therefore, I also think it's nice to have everything related to component in its own folder. So we're going to create a new folder inside of the components folder. That's called header. capital H. So we inside the header folder, and this is something in Visual Studio code. It won't show a complete tree structure here when you just have one folder. But this will change later. But we're inside a header folder. And inside a header folder, I got to create a new file that's called index.js. And this is also something that's highly subjective actually, because I'm going to create my component in the index.js file. So we're going to have one folder for each component, and each folder is going to have an index dot j s file. And this is great when you import stuff as I'm going to show you later. But it's not that great if you, for example, have 10 components open up here, they all are going to be named index dot j s. So that's the downside by doing it like this. But this is a fairly small application. So I don't think it matters. But I can actually show this if we have a component that's named test component, we import it like this. And from dot forward slash, we have our folder, that's called test component. Like this, of course, we don't have this one Oh, this is just an example. It's exported as a default export. So we import it like test component without the curly brackets, we can name it to whatever we want. But I like to name them just exactly as they are in the files. And we import it from the test component folder. And then if we have a file, that's called index.js, we don't have to type out anything more here, it will automatically grab that index.js file. But if we named this file, for example, test component, also, we have to specify it like this. We have to type it out two times. And I don't like to have to type it in two times. So that's why I'm using an index.js file instead, as this is a fairly small application. So we don't get confused up here when we have a lot of components open. So that's my explanation to why I'm using this structure. And that's also why are named my files like this. Alright, so delete this one here, we're also going to create placeholder components for the styles, because we're going to use the style components inside of this component itself. So that's what we're going to do. And we do that by creating another file. That's called heather.styles.js. And this is how I like to name my style component files. So I have the component name, and then I have a dot, and then I mark it with styles. And then I have a.on, the file extension. Alright, so from the style components, we import styled, like this import style from style components, components, it should be an S. Now, I'm just going to create placeholder components because I am going to create the styles in the next video. So if you have choose to skip the styles, you don't have to do them. Justice before, you always have to export these ones, because they are in a separate file, and we are going to import them in the index.js file soon. Export const I have a component that I like to name wrapper, and it's going to be a style dot div. So this is a div that I'm going to start. And I just have the double takes. And I ended there because this is just a placeholder now, so we could just copy this one. But as I told you, I want to repeat stuff and type it in many times when you learn things. So we export const, I have another component that is going to be called content. And it equals from the start, we have another div double backticks and then we export const logo, IMD and it equals a style. And this is an image, it's the logo that we're going to style, double backticks and and it and then we export const TMDB logo. img, be careful with the capital letters here. This is the Movie Database logo. So capital TMDB, capital L and capital II. From the styled, we're going to style another image like this. So this is the four style components that we're going to use for this react component. So save the file, and I'm going to show you in the next video, how to create the styles the actual CSS, but move inside of the index.js, we're going to create our header component. Now, the first thing you do when you create a react component is to import react capital or from react. And that will make sure that we are using react in this component. Then I have some images for the logo. So if we look inside of the image folder, I have the TMDB logo. This is an SVD. So we just see some code here. And then we also have the React movie logo. And that's also an SVG. So move back to the index dot j s, we're going to import this ones now. So import our IMDb logo, you can name it to whatever you want here, but I chose to name it RMD v logo, you could just name it logo, of course if you want to do that, but I want to separate them out because we're going to have the TMDB logo also. And we're going to import it from dot dot forward slash that's in the header folder that we want to go up one more folder so dot dot forward slash again. And then we have our images folder. And then we grab the React dash movie dash logo dot SVG. In this case, it's really important that you also type out the SVG extension, otherwise it won't work when it's an image. So that's the rmvb logo. Then we import the TMDB logo from doc dot forward slash dot dot forward slash images, forward slash TMDB, underscore logo dot SVG, like this. And as you can see, this can be a really long file path here. And that's no good. In some cases, of course, you could set up this with create react app, so you use absolute important step. But I choose to not do this in this course, as I want this to be kind of beginner friendly. And to be honest, we're not going to have that long file path. So that's why Okay, so that's our logos. That's our images for the logos down, we're going to import the styles that we created inherit old styles dot j, s, because we export them here, as I told you, so we want to import them in this component. So import curly brackets, we have our wrapper, we have our content. We have our logo, IMD, we have our TMDB logo, no logo, IMG TMDB logo IMG. And we're going to import this once from dot forward slash header dot styles ended with a semi colon. I'm going to remove this sidebar here so we can see what we're doing. That's it, we have everything we need to assemble this component for now. So we're going to create a component that's named header. And we're going to use just functional components in our application, because now you can have stayed in your functional components. A couple of years ago, you had to create a class if you want to have some state, but now we have hooked and we can use just functional components. So I like to create my components with an arrow function. So cost header equals parenthesis, and a fat arrow. And that's an arrow function, you can have regular function if you want to have that also. And then of course, you just do it like this instead function header. You have curly brackets, but I like to have the arrow function. And that's because you can make an implicit return like this, if we just returning JSX, we can add parentheses, and you don't need to type out return. And in our case, we're going to have the wrapper. That's the style component that we created. And inside of the wrapper, we're going to have the content. That's also a style component that we created. And then I'm going to have the logo IMG. And we can set the source on this one because this is an image tag that we styled. So we can use the same attribute the SRC is going to equal and we have imported our our IMDb logo, or IMDb logo, like this was set on OLT. Now we can name it or IMDb dash logo. And then we can self close it like this. So that's a logo for this application. And we have the Movie Database logo TMDB logo, IMG we have the SRC, it's going to be the TMDB logo IMG and we set the old TMDB dash logo, and we self close it, do some auto formatting. And now you can see. Okay, I just named it TMDB logo, of course, that style component, we shouldn't use that. So TMDB logo course. Now you can see that it complains here, because we're not exporting this one, it says it's never used. And that's because we don't export it. You should always export it. And I like to do the export here at the bottom. So export default header. And this is also a sixth syntax for exporting something. So in this case, we don't have a named export, we export it as a default. Some people like to have their export here, instead, I don't like that. So that's why I have it at the bottom here. But you can do however you want. And this is our header component for now. But we're not actually using it. If we go back to our application here, you can see that nothing has happened because we have created a component, but we're not actually using it yet. So we have to do something about that. So let's go back to our app.js file. And inside of this div here the wrapping div. This is also something that you have to know because in react you can always just return one component, you have to wrap the components if you have multiple of them in another component or in something that's called a fragment that I'm going to talk about later in this course. So inside of here, we're going to have Our header component, but first, we have to import it, of course. So what I like to do, I like to mark it with components, like this. And then I import Heather from dot forward slash components forward slash Heather. Like this, when you want to use a component in react, you have to import it first like this, this is a module that we import, our component is a module that we import with EF six syntax like this, right, and then we can use the component here for now we don't have any props for this one. So just as we did with the global style, we can insert the component here down in the JSX. And we have our header. So do some auto formatting and save it. And if we go back to our browser, you can see that we can't really see the images now. And that's because we haven't set the styling for the images now. So that's what we're going to do in the next video. Or if you choose to not create the styles, you probably will see the header up here. Now if you're using the styles that you copied over to your product folder, but in the next video, we're going to create the styles and that will make the header show up with the logos we have created or had a component, but we can't really see anything. So we have to create the styles for it. Also, you can see it. Yeah, it looks like crap here. So we have to give this some styling also. So we see it have nice little logos and or header. So inside our file, that's called header.styles.js. We're going to start by creating the reference style component, we're going to set the background on that one background. And from our variables, we're going to grab the one that called dark gray, like this. And then I'm going to give it some padding zero and 20 pixels. And that will give it some padding on the sides. We'll save it, go back to our browser. And now you can see that we see all gigantic logos here on our gigantic header. So we have to do something about this one also. So we have our content div. This one is going to be displayed as a flex, because I want to place the logos on the left and the right. And we can do that with flex. So first we align items to center. And this will align them vertically. And then we justify the content. And we set it to space between and this will create space between them and push them to the side one is going to be pushed to the right and one is going to be pushed to the left. And I'm also going to set the max width of this one. And that's why I also have a container that called content because the rapper is going to have this background of dark gray. But I don't want the content itself to have the full width, the max width is going to be from our variable dash dash max with like this. And I'm going to set some padding at the top and bottom are 20 pixels and zero on the sides. And I set the margin to zero, all and this will center the content div itself, save it go back and see what we've got so far, you can see that they are pushed to the size. And that's great. Flexbox is really neat to do stuff like this, but the size isn't correct on the logo. So we have to modify this. So we have our logo IMG. That's the main logo, and that's the style image, we set the width to 200 pixels on this one, save it, go back to the application, you can see that we have the correct size here. But we also want to change this size on the logo when we are on smaller devices. So we create a media query at media screen and Max dash with I don't really know if you need to actually use screen today. I think it's not necessary, but I'm used to that. So I will do that. I set the max width to 400 pixels. This means that when the screen size is lesser than 500 pixels, this one will kick in. So we set the width 150 pixels on that one, save it go back to our application and see what we got. So I can make this smaller. And you can see that there. The logo gets smaller also. So we know that the media query is working. And this is also something that's super great with styled components, because you can nest the media queries as I did inside of this component. I think this is very readable to do it like this because you know that this specific media query belongs to this component. All right, so that's the main logo. Then we just have the style, the TMDB logo also. I'm going to set the width 200 pixels on this one. And then I set a media query on this one also at media screen and Max with 500 pixels. So it may see seem redundant to have two of them here. But actually, as I told you, I think this is very readable. If you want to change a media query for just that component, you can do that inside of the nested media query here. And I like that a lot. So for this one, I'm going to set the width to 80 pixels, and save it, go back to the application. And there you have it, this is our header. And you can see that it's working on both of the logos when we make the viewport smaller. Sweet, that's the stars for the header. In the next video, we're going to scaffold out our homepage. Alright, we're going to start building the homepage for our nice little application. And we're going to have all this stuff here, on our homepage, the homepage is going to be what's called a container component. And then we're going to create different components. For example, for the hero image for the search bar for the thumbnails for the grid, and for the Load More button. Let's go back to our code editor. And inside a components folder, we create a new file that we call home. dot j s capital H. And this one, I don't have a folder for this one, because this is kind of more container component. So we don't have any styling in this one, we're going to apply the styling on the individual components instead. Alright, so the first thing we always do when we create a component in react is to import react, import react from react, then I'm going to create a little comment here and call it config because we're going to import some stuff from the file, let's call config.js. And inside of this file, I've set everything up for you that's needed for the Movie Database API, and I export them here in an object. So we're going to import a few things from this file in the home component. So go back to the home dot j s, and we import curly brackets, we're going to import the poster underscore size, all capital letters, we're going to import the backdrop, underscore size. And the image underscore base underscore URL. Remove this sidebar here. We're going to import them from dotnet, forward slash config, like this, and be very careful here with the spelling all capital letters and underscore. Alright, then later, we're going to import a lot of components here. So for now, I just mark it like this, we're also going to import to hook. So I marked that one also. And we're also going to import an image. So if we go back and look here in the images folder, I have this image that's called no underscore image. And this one is a fallback image if we don't get an image back from the Movie Database API. So we have this funny little smiley balloon here that will fall back to if we don't have an image to go back to the home.js. And we import are going to call it no image. And when you do an import like this, you can call it whatever you want. So doesn't need to be named like this. I'm going to import from doc dot forward slash images. And I grabbed the no underscore image dot jpg, very important to have the file extension when importing images like this. Alright, then I'm going to create the component itself. And as I told you, I like to create it with an arrow function, you can have a regular function, if you want to do that. I have a const home, I have a capital H. All react components always have a capital first letter. Very important always name your components with a capital first letter. So home capital H. And then we don't have any props for this one. So I just leave it empty here the parenthesis and then I have an arrow function. And I have curly brackets because this one is going to have some logic inside of it, we have to have a return statement and make an explicit return. So return for now we can just return a div that says homepage like this. Alright, then we can also actually scaffold out our states that we're going to have in this component. And for that one, we're going to need a hook that's called use state. So make sure to import that one up here. You type in a coma and then you have curly brackets. And we import use state from the React library. And the use state hook is the hook that you use in functional components in react to create a state. So when we call the use state hook, we'll get an array back. The first value is going to be the state value itself and the second value is going to be the setter for the state. And the standard for grabbing and using these values is to use the Six syntax for destructuring. So I create a const, or the structure of the state and the setter for the state set state. And you can call it whatever you want here, but I want to call this state, you could call it cool like this, but I don't actually think it's that cool. So I'm gonna stick with state like this. And then we have an equal sign, and we call the use state hook. For now, we'll leave it empty, but it could provide it with an initial state in here. But we don't do that for now. So as you can see, here, I'm calling use state and this one will give us an array back. So from that array, I destructor out the state and the setter for the state. Otherwise, we could do it like this. But you shouldn't do that. We have a const stayed, you stayed like this, and this state will be an array with the first value date value here. And then we have the setter, or the state as the second value. And then as we didn't destructor, this one out here, we just put it in this constant called state. If we want to grab the state, we have to type it in like this, to use the index zero because that's the first value in the array. And if we want to set the state, we have to grab the setter like this with the second value in the array, that is the index one. So that's no good. Actually, it's much better to do it like this, instead, we destructed out and we can also name them individually by doing it like this. Alright, so this is the way to go, this is the way you should do it. So that's the state we'll that will hold all the movies, then we're going to have the state for the loading, the loading and set loading equals use state and this one, I'm going to give an initial state, I'm going to set it to false. And this is also great with the use state hook, you can have as many of these ones as you want, you can split the state up into multiple ones. And you couldn't do that in the class components in react, because before we had the use state hook, we needed to create a class to have state in react. And then we just had one state and you have to have a state object with all the stuff in it. But now we can separate them out into different states. And that's super great. So I'm going to create the third one that are called error and set error. And this one is going to be used if we receive an error from the API. So we can have this as a flag, and we set this one to false also. Right. So that's the states, we have to do one more thing, because we have created this component. And we also have to export it. So export default, home like this. See if we can get some more formatting. Now it looks great. Anyways, alright, save the file. But if we go back to our application, you can see that we don't see anything yet it just start here. That's because we have created a component, but we're not actually using it. So in the app.js file, up here, where we import the header, we're going to import home from dot forward slash components, and home like that. And then we can use that component down here. So we remove start here and use a component and we self close it, because we're not sending in any props. So we just type out the name in a tag like this, save the file, go back to the application. And you can see that it says homepage. And that's great. We know that it's working. And you may wonder why we have all these warnings here. But they are just warnings because we're not using these values. Now, they will disappear later when we use them in the component. So nothing to worry about there. In the next video, I'm just going to do a short talk on the standard hooks, that's indirect library, and then we move on and actually fetch some data from the Movie Database API. Okay, before we move on, I just want to make a brief talk about the built in hooks that's in the React library, we can also create our custom hooks. And we're going to do that in this course also, but we have some hooks that's built in that you probably going to use most of the time when you create react applications. So I'm on the React js.org. And I'm in this chapter here that's called hooks. This is great if you want to know more about hooks, because honestly hooks can be a little bit hard to grasp in the beginning. So I highly recommend that you actually read this chapter here if you're completely new to hooks. And if you're new to react, this is a great way to start doing some reading before you do any course or create anything with react. It's always a good idea to have some basic theoretical knowledge before you start with something. But of course, it depends on how you like to learn stuff, so I shouldn't tell you how to do it. Alright, so they have an introduction to hooks, they have different chapters here, we actually going to look at this one number seven hooks API reference, and I'm going to talk about the hooks that's built in the library, sort of separated in basic hooks and additional hooks. And the basic hooks are probably the ones that you're going to use not maybe 99% but perhaps 95% of the time, and then you're going to create some own custom hooks and use some special hooks sometimes. So we already talked a little about the use state hook. That's the one that you use for creating state in a functional component in react. So that one we imported in the last video, and we initialized it and set it up in the home component, we're also going to use the hook that's called use effect. And use effect is a hook that you can use for side effects. So in our case, we're going to grab data from an API, and that's a side effect. So we're going to use the use effect hook for grabbing that data. And we're going to use the state to keep that data in our application, then you have a hook that's called use context, we're not going to use that hook in the main part of this course. But I am going to use the use context hook in the extra chapter at the end, where I create a Movie Database, login in the application and make it possible for you to cast a vote on the movies, then I'm going to set up a global state that holds the login information of the user by using the use context. So that's the basic hooks. And then you have some additional hooks use reducer, that's something that's very similar to if you, for example, have used Redux. The use reducer is very similar to that one. And it can be used instead of the use state hook if you want more. I don't know if it's a more complex state. But yeah, yeah, maybe a more complex state than the use state, we want to use it in this course. And the use callback and use memo hooks are hooks that you can use to memorize stuff. If you don't want to recreate for example, a function on each render, they are very handy if you for example, run into something that's called an infinity loop with the use effect. That's very common actually, in react that you can do that. Because if you set the state in a use effect that will trigger a rerender. And if you have a dependency in the use effect, for example, a function that recreates on each render, that will trigger that effect again, and that will set the state again, and it will trigger the effect again. And yeah, you get the point here, it will create an infinity loop, then you can use the use callback to wrap that function inside the use callback hook. And that won't recreate the function on each render. Because by default, if you create just a regular function, React will recreate that function on each render. And use effect. If you specify that one in one in something that's called a dependency array that we're going to talk about, then that use effect will trigger again, because it will think it's a new function because that function has been recreated on the next render. So use callback and use memo or hooks you can use to memorize stuff in react, but I think there are a little bit more advanced, so I won't use them in this course, they use ref hooked, we actually going to use that one because I'm going to show you a little trick in this application. And a neat little use case to use this one use ref is basically a hook you can use to create a mutable value that won't trigger a rerender, you can see just maybe like you're kind of a regular variable that won't trigger a rerender. So we can use this one to create a mutable value. Because if we have it in a state, it will always trigger a rerender when we change that value. But if we change the value with the use ref hook, it won't trigger a rerender. Use imperative handle, I've never used this one. So I'd actually don't know what is for use layout effect, it's very similar to use effect. They only differ in when they trigger. So there's no use case for the use layout effect in this course. So I won't go into detail. And use debug value. I haven't used this one either. These are the built in hooks in react. But I think the strength about hook is that you actually can create custom hooks. And we're going to do that in this course also, that was a brief introduction to hooks in react. So in the next video, we're going to fetch some data from the Movie Database API, we're going to use the use effect hook and the use state hook for that. Alright, let the fun begin, because now we're actually going to fetch some data from the Movie Database API. And that's super exciting, because it's always great when you see the magic happens when you have that nice little JSON object with all the data that we fetch from an external source. I like that I love it. Alright, so we're going to be in the home.js file for this one. Now, the later we're going to kind of break this one out and place it in its own custom hooked. But for now, we're going to be in the home component and created inside of here. So we're already importing US state. But we're also going to import use effect, because we're going to use this one for fetching the data. Then I have this file here, that's called api.js. And inside of this file, I created all the functions for fetching data from the API. And I will also say that this will probably one of the most advanced videos in this course and also one of the longest so you can care a little extra about this video because it's kind of advanced stuff in this one. Alright, in this file. api.js, I have this omit here where I export a couple of functions. The three first ones are the ones that we actually need to care about the other ones is for the bonus material for this course. So you don't have to care about that now. So this one is the one that we're going to use now fetch movies, and this will fetch a lot of movies, multiple movies, then I have this fetch movie without the s and this one will fetch an individual movie. And then I have fetch credits. And that's the credits for the movie itself. So these ones are going to be used for the individual movie page. And if we take a quick look at this fetch movies, here, you can see that this one has two parameters of search term and page. So we're going to give it the search term and the page that we want to fetch. And I have a ternary operator here. And that's ies six syntax for kind of a shortcut for if an else so I do a check here, I check if I have a search term, and then I have a question mark. And if this one is true, if I have a search term, it will run this one to the right to the question mark. And if this one is false, I have a colon here, it will run this one to the right of the colon. It's a shorthand for if and else, then I have to do this because we have different resources from them point depending on if we're doing a search, or if we're grabbing the most popular movies. So that's why I have this ternary operator here. If we in the search, we're going to use this resource from the endpoint here and also attach the search term. And then we also grab the correct page. So we add this as a parameter to the URL. And then I return on the wait. And I actually waited two times. And that's because I first await the fetch from endpoint. And then I await when I actually converted with JSON, because this one is also async. So that's why I have to await. And as I have an await, I have marked this one with an async. So I'm using the async await syntax for this one, you could also use the good old them. But I think that's not as readable. I actually like this a lot more. So that's why I'm using the async await syntax for this one. Alright, and I think that's it for this file. We don't have to care about this, because we're going to import this function. So go back to home.js. And just below here, I'm also going to remove the sidebar on market with API. And then I import API from dot dot forward slash API. And this will give us this object where we can access those functions are talked about. Alright, so that's the API, then down in the actual component here, just above the return statement, we can create a new function that we're going to call fetch movies. And as we fetching from the API, and we're going to use a wait, we have to mark this with async. And then it's going to have two parameters is going to have the page and the search term. And we can set the default value on the search term to an empty string like this. And I have an arrow, and I call the brackets. So we create this function here is an async function, because we're going to fetch from the API and await the data. This one is going to get the page we can send in what page we want to grab. And then we can also send in the search term, we haven't actually created this one yet, because this one is going to be another state when we create the search bar. So we're going to add in more states here later, and also have a state for the search term. And if we don't send in a search term, we're going to fall back to an empty string. So we set this one as default. So that's the fetch movies function. We're going to read this in a try and catch block, try and catch. And we can get the error in this case, I'm not actually going to set the error, I'm just going to have a flag that setting if it's true or false. But of course, you can have a state where you can store the message from error Also, if you want to do that. So in the catch, we're just going to have set error, and we set it to true. And here to see how I use this setter for the state. So we destructor it out here. And to set a new state for that one, we call this one and we give it the value. So I call set error, and I give it the value true and this will change that state to true inside of try block will first going to set the error to false. Because now we grab a new data. So we have to make sure that this one isn't set to true because we don't have an error before we have fetched anything. And we're going to set the loading to true because now we're fetching so we set this flag to true. And this is how we can keep track on when we actually fetching and we can show the loading spinner and stuff like that. All right. Then I create a course that I call movies. And this course is going to hold all the movies. So I'm going to wait. And from the API that we imported up here. We have that function that I showed you. That's called fetch movies with an s really important, and then we're going to give it the search term and the page So this will hopefully grab the movies for us. And we can try yourself with console log movies. But if we go back to our application, you can see that we don't actually get anything here because we haven't triggered this function. And we have to do that in a use effect. So we have the function now, but we haven't triggered it, do some more formatting, and go below the function here. And we call the use effect. And the use effect is called with an inline function like this. And then we can do what we want inside of this use effect. So what we want now is to trigger this only on Mount only when we mount this home component on the initial run of this one. So we can do this by specifying a comma here, and an empty array. This is what's called a dependency array. For the use effect, we can specify different dependencies on when we want this use effect to trigger. In our case, we just wanted for now, the trigger when we start up the application, and when the home component mounts, so I specify this as an empty array for now. And when we specify it as an empty array, it will just run once. So that's really neat. In this case, we can just call fetch movies, we're going to send in one, because we want to fetch the first page, we can also mark this one actually with initial render. So we are specified an empty dependency array, meaning that it will only run once on the initial render. And inside the use effect, we call our fetch movies function. And hopefully, we will get the console log of all the movies if we save this one and go back to our browser. And yes, you can see here we have the movie object here. So in this object, we have the page one. And this is all from the Movie Database API. So it's nothing that we have set up here, we have a total pages of 500, total results of 10,000. And we have the actual movies in a property that's called result. And this is an array, and we get 20 movies at a time from the API. So that's sweet, we know that we grabbing data, and we know that it does triggers once. And that's super great. So now when we have the data here, we can actually set our state because we have our state up here and we want to put our movies in the state. So I'm going to call set state. And for this one, I'm going to provide it with an inline function is a callback function, that's going to be called with the previous state by the state setter, if you provide a state setter with a function, it's going to be called with the previous state. And that's great, because we need a previous state when we set the state. And I'm going to show you why in a second. So we have a parameter that are called prayer, you can call it whatever you want. In the state, we want to set an object, so we want to return an object, so I have a parenthesis and curly brackets. If we didn't have the parenthesis, it would think that these curly brackets marks the scope of the function itself. And that's no good. We want to return an object and an object also is marked with the curly brackets. So we have this parenthesis before and this parenthesis after, this will make sure that we return an object. And this parenthesis here is for the setter, of course, so we have two parentheses here at the end. So I have this little neat little plugin. Also in Visual Studio code where you can see I get these different colors of the parentheses. So it's really easy to see the parenthesis, I think it's called rainbow brackets that plugin. So we're going to set the state we have the movies inside of this cost. So I'm going to use the e6 syntax that's called spread, I use three dots and spread the movies. And this is because I'm going to take this object here and spread it out here. That means that we creating a new object, it's going to take all the properties from this movies and spread them out inside of this object here. When you set the state in react, you should always provide it with a new value, you should never mutate the state in react because if you mutate the state directly, it won't trigger a rerender. And there can be a lot of trouble. You should always use a satellite this to modify the state. And you should always provide it with a new value and not mutate the state. Really, really important. Never mutate the state in react. Okay, so we have the movies. And then if you remember, we have this property here that's called results. So this is holding all the movies. But in our case, we need to decide on how this new state should look because if we load more movies, we want to append the new movies to the old state to the old movies and not wipe them out. So we have to do some check here for that on the results. So we have the results property, colon, and then I'm going to put it on a new row. I'm going to check if the page is greater than one. Then I have a question mark. This is a ternary operator here again, are going to return a new array are spread out from the previous state prep. That's the one here as I told you, this one is getting called with the previous state So from the previous state, I spread out the old result, three dot prevot dot results with an S at the end. All right, so that's the old movies that we already have in the state, then I have a coma. And I'm going to attach the new movies from the new movies, dot dot dot movies, dot results. And this one is going to append the new movies to this array. So we get an array with the old movies and the new movies. And that's great. Then we have a colon because if we're not loading more, we can wipe out the old movies and just give it the new movies that we got in this concept called movies. So dot dot, dot, movies, dot results, like this is some auto formatting. And this will hopefully work. We don't know if it works, because we haven't created a load more button yet. So we'll see that later in the course. And there's one more thing we have to do, because we setting the loading to true here. And we have to set it to false when we have grabbed all the movies. So just below the try and catch block here at the end of this function, we're going to set loading to false like this, save the file, go back to see that it works. reload it, and yes, it works. And that's super great. But we call slogging it out here, we don't know if it works with the state. So we remove this console log, and go down here somewhere just above the return statement, and we can console log out the state instead, save the file. And we hope for the best. Go back to the browser. And yes, you can see we have the state here. And you may wonder why is it showing this many times. And that's because if we look in the home component, we have three different states here. So it will rerender each time we change one of these states. And some may say and go crazy, oh, we have a lot who renders that crazy, it will make this application so slow. But yeah, you shouldn't worry about that, actually, because react will diff those things and only update things in the DOM that has changed. So it doesn't matter if it rerender this many times. And to be honest, React is fast. So even if you had a lot of rear Enders, you won't have any performance issue in an application of this scale, don't worry, it's completely okay that it renders all these times because it won't rerender the complete page, it will only run the stuff that has changed. All right, that's how you fetch data from the Movie Database API with a use effect hook and then you put it in the state with the use state hook. In the next video, we're going to take all this logic here and create our own custom hook and place that data inside of there. And then we can get rid of this one in the home component. So it will look a lot cleaner. Okay, we're grabbing data from the Movie Database API with the use effect hook and we place it in the state with the use state hook, we're going to move all this logic inside of a custom hook instead, because that will make this component A lot cleaner. And it's always great to separate out this logic, if we want to reuse it somewhere else in the application. In our case, we don't need to do that. So we do it just because we want to clean up this component and to separate out this logic. So that's why you create custom hooks. Either you do it because you want to reuse some logic somewhere in your application, or you want to clean it out and have that separated out. So inside of the src folder, not in the components folder, this time inside of the src folder, create a new folder, that's called hooks. And inside of that folder, create a new file that's called use home fetch camel casing, dot j s, capital H, capital F. And why do I name it like this? Well, React wants you to name all your custom hooks with use and then your name. That way react knows that this is a custom hook, you could skip to use use. But you shouldn't do that you should always name them with use before the name, always do it like that. Otherwise, it can give you trouble in the future. So inside of this file, I'm going to create a new function. I'm going to export it also because we're going to import this one in our home component and use this custom hooked, export const use home sets. And I create a regular arrow function like this. Alright, so that's our function, then we go back to our home component inside of the components folder. And we're going to grab all this logic here, all the states, the first move is function and the use effect. We can keep the console log for now is going to give us an error but that's okay, we're going to fix that soon. Go back to the use home fetch custom hooked paste the logic in here and it complains now because we haven't imported this ones here. So we could actually just copy them from the home component but just as before, I want us to type in stuff a lot here because we learning stuff. So we're going to import from the rack. library, we're going to need the use state. So import curly brackets, you state coma use effect. And we're also going to use the hook that's called use ref laters, we can import that one also. And we import it from react. And you can see the red, don't import react in this one, because we not need the actual react library, we just need this stuff from that library. So that's why we don't have any JSX or anything here. So that's why we don't need to import react itself, we also need to import the API. And that one, we can actually just copy this one from the home. So go back to the home, cut this one out here, the import API like this, go back to the US home fetch hooked and paste it in here. And this one should be it. All right, is more of mining. And we only have this function or we're not actually returning something, we have to return something in our custom hook also. So go down to the bottom of the function. And here we're going to return our state's for now, we're going to return more stuff in this one later, when we create more stuff. But now we return on object. And we have the state, we have the loading and error like this. And this is also a sixth syntax, as we return this object, this one is automatically going to get the property state because it has the same name. And all of these ones has the same name. So we don't have to specify them explicitly, it will figure this out itself. All right, there's one more thing I want to do inside of this one before we finished for this video. And that is I want to create an initial state. So up here, I create a const initial state, it's always a great idea to have an initial state if you want to reset stuff. And we want to do that later. So I'm going to structure the state just as the one that we got back from the Movie Database API. So we have the page, it's going to be zero initially, then we have the results. That's the property that holds all the movies are going to provide it with an empty array initially, where the total underscore pages is going to be zero. And the total underscore results, it's going to be zero also. So this is the initial state. And now we can give this initial state to the use state here where we create a state. So provided with the initial state, and this will make sure that it gets the state. All right. So that's our custom hook. For now, we go back to the home component. And now we have to use this custom hook. I already created this comment here where we're going to import it. So we import curly brackets, use movie fetch, like this, from dot dot forward slash hooks, and use home fetch. Then inside our sad little empty home component, we're going to use this one. And yet again, I'm going to use ESX destructure syntax to get those properties from the object that we exported here. We export an object with all these values here. So I'm going to destructure them out here. curly brackets stayed loading an error, equal sign and our call my custom hook use movie fit. So this will hopefully work. We console log in out to state so save this file, make sure that you also save the hook itself. And go back to the browser. reload it. Yeah, I have some arrow here. Use movie fetch is not exported, didn't I export it? export const? Yeah, it should be used home fetch, of course, not use movie fetch. A change this one to use home fetch. us home fetch homefacts like this, save the file, go back to the browser. And you can see that we have our state here. And that's great. You can see there's a lot of renders. And a lot of people will say, oh, crazy. There's too many renders, this is a performance issue. But it's actually not. So this is totally fine. But you can see that it we have our initial state here first, and it's zero, everything is zeroed out. And then we get the data here. And we have all the movies inside here. So that's sweet. And I promise you it won't be any performance issue in this application because of these renders. So this is how you create a custom hook in react. Always name your custom hooks with use before you have your name. That's really important, you should always name them like this. In the next video, we're going to start creating the components for the homepage and we're going to start with the hero image. In this video, we're going to create this hero image here in the application. So we're going to grab a background image and all the text here from the Movie Database API. Actually, we have already grabbed them. So we're going to use that data inside of the hero image component. So let's go back to our code editor. And inside the components folder, create a new folder that we call hero image, capital H capital I, and inside the hero image folder and create a new file that we call index dot j, s, and also file that we call hero image dot styles. dot j s, just as before, are just going to scaffold out the style so we can use them in the component, but I'm going to create the actual styles in the next video instead. So if you already have this file here and choose to not create the styling for this course, you already have this file here and don't need to do this. So in the hero image.styles.js import style from style components like this, then I'm going to export a cost that are called rapper is going to equal from style dot div, I'm going to create a div I have backticks like this, then I'm going to export const content equals styled.do, exactly the same and double backticks. And I'm going to have one that's called export const text equals styled dot div double backticks. And that's it. That's three Olam, save this file and go inside the index.js file, we import react from react, then we're going to import the styles. So I marked it with styles, import, wrapper, calm content, and text from dot forward slash hero image styles. Right? Then I create the component itself const hero image capital letters h n i equals and this one is actually going to receive some props. And a probe is something that you can send into component. So that component can change dynamically, depending on the props, a prop should never be changed inside a component that receives the props. So they can only change if something rerun this and they get a new prop. So that's how that works. And the props is sent into component on a prop object like this. So we have the Prop, I have an arrow function. And for this one, I'm just going to return JSX. So I can make an implicit return. So I have parenthesis so I can skip the return statement. And then I have my wrapper. And this is a style component, we scaffold it out just recently, this one can also receive a prop. So when you send in a prop to a component, you do it by naming the prop and then you give it the value. In this case, it's going to be from the prop that this component get prop. There's going to be a prop that called image. So we send out along to this style component, that's named wrapper. And in the next video, I'm going to show you how we can set the background image in this component by sending in the image URL to the style component that's named wrapper. So that's what I'm doing here. So I'm sending this URL along to the style component on a prop that's called image inside this wrapper, we're going to have the content. And inside the content, we're going to have the text like this. And inside the text, we're gonna have a regular h1 tag. And in JSX, when you want to use a JavaScript expression, you create curly brackets, and then you type in your expression. In our case, we want to show the title. And this hero image is going to receive the title from the prop that's called title like this, and you end it with a curly bracket. You can have any JavaScript expression inside of here that you want. So you can do some calculations and map through stuff and things like that, that we're going to do later also are going to show you that now we have a p tag. Yet again, I have curly brackets, I have the text and curly brackets. And that one is from the prop dot txt. There's more formatting. And then I export default hero image. This looks fine, actually. But I want to show you a little trick here now that you should use when you create your components, because now we have to type out prop dot image prop dot title prop dot text. So instead you can use e6 syntax up here and destructure out these props from the prop object. So we have parenthesis, number of curly brackets, so we have destruction of this object. And then we have the image, title and the text And then we can remove prop here on all of these. So I think you should get used to always doing it like this because it will look a lot more cleaner with the structure mount up here. So we don't have to type in prop every time. Alright, save the component. And just as usual, we can't see anything. Now if we go back to our application, because we haven't used the component yet, save it, go back to home. And up here, where I marked it with components, we import hero image from dot forward slash, hero image. And now we can use this component. So below here, instead of homepage and this div, we can just return the hero image like this. But we want to send along some props to this one also, because this one needs the title and stuff like that. And we also need to check that we actually have any movies in the state. So we can't actually do it like this, because it will throw an error if we don't have any movies in that array. So what we can do here, instead it we return something here inside of the parenthesis, because we're going to need multiple rows to move this one inside of here, instead. And as I told you before, we can only return one parent element in JSX. So we have to wrap this one because we'll have more components here later. So we can create something that's called a fragment in react, we could of course, create a div like this and move this one inside. But sometimes we don't actually want to create a div, we just want to return this without creating a div. And you can do that by creating a fragment. And this is the shorthand for fragments, you just create this angle brackets and an end angle bracket. And this will work. So inside of here, we also want to check if we actually have some results in the state. So just as before, as I did in the hero image itself, if you can see are in the JSX, where I have a JavaScript expression, I can do the same in the home. To go back to the home, I have a curly bracket, and now I can use any JavaScript expression that I want. So I want to check if state results. And the hero image is going to be the first movie, it's going to be the most popular movie. So I grabbed the first element in the array, I check if that one exists. And then I do something that's called a short circuit. So I have double ampersands. And I'm going to move this column bracket to the end of here, because I want this one to be nested inside of this one. So this means that if this one is true, it will run this code here. If it's false, it will just fall back. And sometimes some argue that you shouldn't do it like this, because it will return the actual value false here, but JSX won't show it. But if you want, you could instead do a ternary operator like this. So if this one is true, we return the hero image. And then we have colon otherwise we return null, we can put it on its own roll. And this will also work. And we want to give this theory some props. So we have a prop of image. And that one is going to equal. And this one I have to construct because the image URL is constructed by the image base URL that we that we get here, and also the backdrop size. So I have backticks in dollar sign curly brackets, I'm going to grab the image base URL like this. And this one is going to be long, so I'm going to remove the sidebar. So this is a template literal. And you can interpolate expressions like this in a string literal. Alright, then I'm going to add the backdrop size, like this. And then I'm going to add, you can see I have dollar sign and curly brackets for all of them here, dollar sign and curly brackets again, from the State DOT results, I grab the first element again. And then we have something that's called backdrop, underscore path. Be very careful about the spelling here. So you get that correctly. It's really, really easy to make a typo here. And then it won't work. This will get us the image URL. And these ones are all set up in this file here. Let's call config. They are set up as per instructions from the Movie Database API. You can see the image base URL is this URL here. So that's the one and then I set the backdrop size. You can change this size if you want and try it here. You can make them smaller, and you can set them to the original size. I set them to width 1280 in this case. So that's what I'm grabbing here. And I'm generating the string here by merging them together in this template literal here. Right now we have the title. And we get that one from state auth results. The first element and we have a property that's called original underscore title like this. And then we have the text yet again from state results. From the first element, you could also break this out in its own variable if you don't want to type this in every time. So there's probably been a lot of things you can optimize in this application. But as this is a beginner slash intermediate course, I don't want to do a lot of stuff like this, because it will only take time. And it will be confusing with all the other stuff going on. So we have a property here, that's called overview. And these are, of course, all from the Movie Database API is nothing that I have created. These are named like this from the Movie Database API. All right, do some auto formatting. So you can see here I send in three props, image, title, and text. And these are the ones that I destructed out in this component itself. So when you want to give a prop two a component, you do it like this, you named the Prop, and then you give it the value. And then you can grab those props inside of this component. So save the file, go back to the browser, and you can see that we can't see anything yet. But if I mark it here, you can see that we have the text. But we don't actually have set any styling for this one yet. So that's what we're going to do in the next video. And then we'll hopefully see this nice little hero image in our application. It's time to create the styles for the hero component. So move back inside of the code editor, and the file that's called hero image dot style dot j s that we created in the last video. So we have all these components here, and just give it some space here. And we're going to start with a wrapper, and to the wrapper, we send in a prop. If you remember this one here, you can see we have this image prop here. So just as we do with regular component, we can send him props to style component. And this is something that is super great with style components. Because this way, we can do some stuff with a CSS. And in our case, we want to set a background image, the usual way you did that back in the days was that you had to create some inline CSS when you had a dynamic image. And you didn't know from the beginning where it came from, or what didn't what his name was, you had to set it with an inline styling on the element itself in the HTML. But in this case, we can do it much, much cleaner and sending a prop to this component. And we set the image here. And also we're going to create if you look here at the finished application. I don't know if you see it now. But there's a slight little gradient down here also, because I want this text to be able to be seen on any different background. That's why I have a dark little gradient below this text here. So that's what we're also going to create. So in the repple component, we have this div that we styling here with style components. So we have the background. And we're going to set a linear gradient first linear gradient, parenthesis, and is going to go to bottom RGB a and I use this because I want to set the alpha value 0000. And these values are auto generated from somewhere on the internet, I usually do that when I create gradients, it's so easy to just go there and type in your gradient and it will give you the code. So that's why all these values may seem a little bit odd. This one is 39%. And the RGBA is going to be 0000 again, and 41%, rgba, 000 and 0.65. That's the alpha value. And I see you know that this one shouldn't even need to have to have these ones here. I think actually, I can remove this one here. We don't need that one. And then we said 100%. And just after the parenthesis, the end parenthesis, we have a comma. And then we specify the URL. And now we can grab that prop that was sent in here. And you do that as this is a template literal, just as before we use dollar sign in curly brackets, and we can grab those props, you create an inline function and this one will get called with the props. And from the props, we grab the image and if you want to destructure amount, you can do that also here, then you have a parenthesis and then hold the object. Then we restructure the image. And we do it like this. Right. Now we have a coma from the variable, regret dot Ray. And hopefully this will work. Do some auto formatting and save it go back to the browser. And you can see that we actually had the image here but we haven't set any other properties. So that's why it will look like this. So let's go back here and we're going to set the background On size 100% and cover, we're going to set the background position to center the height is going to be six 600 pixels. position is going to be relative, because we're going to absolute position or text. So that's why we have to set this to relative. And we're also going to have a slight animation on this one. So I set an animation that are going to call animate hero image, and is going to be for one second. If we look at the finished here, you can see that it kind of fades up. So that's the animation that I'm going to create. And I do that below here. And nested inside of here. So act keyframes, and the name is animate hero image. I go from Opacity is going to be zero to Opacity is going to be one, save it, go back and see what we've got. There you have it, there's some little border up here. I don't know why. Let's see if it's sort itself out when I create other styles. But you can see that it it animates in here quite smoothly. So that's great. Alright, let's fix the other components. So we have the content, padding is going to be 20 pixels on that one, we set a max width, and we grabbed from our variable max width. And Morgan is going to be zero in order to save it, let's check it out, you can see that it's in the center now. That's great. And that one removed that nasty little border up there also, that's sweet. Then we have the text. Let's create that one also, I set the cell index 200. Just to place it on top, I set the max with the 700 pixels on this text position is going to be absolute. from bottom we're going to set it to 40 pixels and margin right is going to be 20 pixels. The min height is going to be 100 pixels. And the color is going to be from the variables we have the white. All right, so that's our text. And inside we have the h1 tag. So for that one, I set the font size. And for more variables, we have font, super big camel casing. And then I'm going to have a media query on this one media screen. And Max course I have to end this way to see my colon max with 720 pixels. And I set the font size to variable dash dash formed big, so I'm making it slightly smaller. Right, that's the h1. Then we have the p tag, it's gonna have a font size. From the variables, we grab font med. That's the medium size. And then we have a media query media screen and you set the max with the 720 pixels. For that one, the font size is going to be a variable font small. So this means of course, that up until 720 pixels, we will use the form small otherwise it will use the font medium. And the same goes here, we use the font big up until 720 pixels otherwise was used the font super big. All right, then we're going to have a media query on the text itself. So media screen and max width 720 pixels. And we set the max with 200%. And there may be room for optimization in the CSS because I haven't put the most focus in the CSS for this course, as this is a course in react. But I wanted to show you how to create the CSS also. So that's why I included it. But there are room for optimization I'm sure of that. Go back and see what we got in it. seems to be working. Let's see what happens. Yeah, you can see it gets smaller. And that's great. Now, it's actually starting to get fun because now we see different stuff happening here, things are displaying on the screen. And that's what I like with front end development to actually see it's put together like this. Alright, in the next video, we're going to create the logic for the grid component. So we have our hero component, and the next component would be the actual search bar. But I'm going to save that one for later. So we're going to create this grid now instead, in this video. So let's start by creating a logic just as usual. And in the next video, we create the styles, go back to the code editor. And inside the components create a new folder, that's called grid. And inside the grid, create a new file that's called index dot j s. And another file is called grid dot styles dot j, s and capital G on the grid, of course, and just as before, we're going to be in the grid dot styles dot j s first to create the placeholders for the style components. So import styled from styled components, then we export the columns that we call wrapper. And as you can see here, this is great with starter components, because I named them the same, but it doesn't matter, they will be scoped to that component. So we can have this exact same name. That's super sweet. So the styles won't interfere with each other. So style dot div, double backticks. And then we export const content, and that equals A styled dot Dave, also n double backticks, save it and go inside of the index.js file. So we import react from react, hopefully you're starting to learn is now so this will be in your muscle memory later. Then we have the styles, we import the wrapper, and the content from dot forward slash grid styles. Then we create a component itself const grid equals, and I'm going to destructure or two props that we're going to send into this one. So header and children. I have an arrow function, and I'm going to do an implicit return. And you may wonder what children is. And that is a default prop that we can use in react. When we nest stuff inside a component, they will be accessible in the children prop. So that's great, I'm going to show you how that works in a second, we're going to have a wrapper. Then we have an h1 tag. And then I have curly brackets because I'm going to grab the header prop and display that here. Then we have the content. And for that one, I create another curly bracket, and I grab the children. So that means that whatever I wrap inside of this component, when I use it, I can display it here by displaying the children, then we need to export default grid like this and save it. So this is pretty much it for the grid component. If we go back to the home.js file, we can import it up here. Import grid from dot forward slash grid. And then just below here below the hero image, I'm going to use the grid here. And this one is going to get one prop is the header equals popular movies. So inside the grid, I'm going to map through all of the movies in the state. So I have curly brackets and State DOT results. I map that's also a sixth syntax, we have a movie. In this inline function, I can make an implicit return. So I have parenthesis. And I use a lot of e6 syntax here as you can see, and hopefully you know a bit about it before you start this course because it will be too long of a course if I explain every little syntax in detail, but I try to explain some stuff for you. And hopefully, you'll learn a lot also from it. But the map method is something you can use instead of a for loop. So use the map on the array, the results array, and it will map to each item in the array. We haven't created a thumbnail yet. So we're going to create a div. And I think we have a property that's called title. So I map through every movie and now I'm just going to show a div in the grid that shows us the movie title. Or format it save it go back to the application. And you can see that we have all the movies here so displaying the title, and you can see that it also warns us now each child in a list should have a unique key prop That's when we map through things, we have to market with a key also otherwise, React will complain. React is using this internally to diff stuff and to optimize itself. So we can set a key on this one. And we're going to give it the movie.id. So this is a unique ID that we get from the Movie Database API, it's sometimes return two of the same movie, and this one will actually give a warning done. So it's some bug in the API, I think, because it should only return one of each movie. So if it gives you a warning, it's probably that because it has probably returned more than one of the same movie. So you could actually add something else, you could add a random number, also to the movie ID if you have that problem. So let's go back to the application. And you can see that it doesn't complain now. So now it's happy, we have provided a unique key. And that's super great. And we have the titles, but it looks like crap. Now because we haven't styled it and we haven't created the thumbnails yet. In the next video, we're going to style the grid itself, and then we're going to create the thumbnails. So we have our grid, but we have to style it also. And that's what we're going to do in this video. Move back to the code editor and in the file that's called grid doc stars dot j s in the grid folder, we have already created this one here. So we're just going to fill them up with CSS. And also I can tell you, if you don't have that plugin installed in Visual Studio code, I have a plugin that's called VS code dash style dash components. So that's the one that's create this nice syntax highlighting inside of this style components. So that's a little tip if you haven't installed that one. Alright, so let's create the stars for the wrapper. First, we're going to set the max width from our variable that's called max width. Then we set the margin to zero auto, that will center the div, and we give it some padding zero and 20 pixels that's padding on the sides. And then we have the h1 tag, I'm going to set the color from the variable mid gray on that one. And then also, I'm going to have a media query. So at media screen, and Max dash with 768 pixels. And this one is going to change the font size from the variable font big. Alright, save it go back to the browser. And you can see that we have this nice Morgan's here, but we haven't actually created a grid yet. So that's what we're going to do next. Inside the content component, we're going to display a grid. Then we set something that's called grid template columns, grid dash template dash columns, we're going to set this one to repeat. And this is a little trick you can use if you want to create a responsive grid, so we repeat these columns, we set it to auto fill a coma, and then we use the min max 200 pixels, that's the minimum width that those little thumbnails can have. And then we set it to one fragment, so we don't specify an exact pixel width on the max value. And this is CSS Grid syntax. And the CSS Grid will probably require a complete course on its own. So I'm not going to go there. Grid gap, we're going to set that one to two REM so that will give it some spacing between the rows and the columns, save it, go back to the browser, and you can see that we have our grid. So now it's showing us five items on each row. If we do like this, you can see that it is responsive. And that's super great. That's a neat trick you can use if you have a grid like this, just with one row in CSS Grid, you can make it fully responsive. So that is really, really cool, actually. And it works because we set this one to repeat the columns, and we set it to autofill. And then we set a min and max value. So we're telling it when it's 200 pixels wide, it can't go lower. So then it removes one column instead. And it's going to do that all the way down to the mobile devices. All right, that's the styling for the grid. It was pretty fast. I think. In the next video, we're going to start creating the thumbnails. We have the grid now, but we haven't created the thumbnails for the movies. So that's what we're going to do next. Move back inside of the code editor and inside the components folder, create a new folder that you call thumb, capital T inside of that folder, you create a new file that's called index dot j s. And then you create another file that's called thumb dot styles, dot j s, I hope you're beginning to see the pattern here on how I structure the components. So first, we're going to start in the thumb dot style dot j s, just as before. So we import styled from styled components. And for this one, we're only gonna have one component. So export const. Image capitalized. And this one is going to be styled dot IMG because we styling the image here. Right, save it and go back to the index.js file or the thumb. So first, we import react from react. Then we mark it with styles an import image from dot forward slash thumb styles. We're going to import some more stuff here later, because these thumbnails are going to be clickable, we're going to create that later when we have set up the routing, and also started to create our movie page. So for now, we create our thumb component, cost thumb equals, I'm going to destructure out an image prop movie ID and clickable, I make an implicit return on this one, because I'm only going to return JSX. For this one, I'm going to have a wrapping div, like this. And then we're going to use this prop to tell if it's clickable or not. And then we're going to have a ternary operator here. But for now, we're just going to return an image. That's the image that we created here. The source is going to be wrong the image prop. Eric is that an old of movie thumb on that one. With self, close it. And then down below here, we export default, some save the file, then we're going to go back to the home component and also import this one. So up here, import some from dot forward slash thumb. Alright, and below here, where we map through all of the movies, we're going to use a thumb instead of this div, remove this one here, and we use the sum, then we're gonna have a key for this one also, because we always need to have a key when we are mapping through components like this and display them. So the key is going to be just as before the movie.id we're going to set it to clickable, that's going to be true, it's always default to true. So you don't have to do this, if you want to set it to true. For now that one isn't working, because we didn't utilize it in the component itself. But we're going to fix that later. Then we have the image prop and we're going to give it the URL to the image. And for this one, we're also going to use that fallback image if we don't have any image for the movie. So we're gonna have a taller operator here, movie dot poster underscore path. So we're checking if we have imposed a path if we don't have that we're going to display the fallback image. But if we have this path, we know that we can grab that image. So we have a question mark. I'm typing it on another row here, but it's the regular ternary operator. Then we have the image base URL. And I'm actually going to show you the other way now not do it like this here. But you can do it the old way with plus, instead, where the poster size, and then we have the movie dot poster path, movie dot poster underscore path. Be very careful with the spelling, it's very easy to make a little typo here. And that will break everything. Alright, so that is when we have a poster path, then we have the colon. And we're going to display the no image if we don't have a poster path. So that's the image, then we're going to send in the movie ID. And that is because when we click on a thumbnail, we need to have the movie ID for that thumbnail. So we know what movie to grab and display on the individual movie page. So movie.id and then we're going to close the thumb component. So be very careful here. It's a little bit nested. And it's very easy to type something wrong here. But this should be right i think i really hope so. I save it back to the browser. And as you can see we have the thumbnails but it doesn't look right. And that's because I haven't styled them yet. But at least we display something. So in the next video, we're going to start the thumbnails some to make it look something like this instead. Really pretty modern. I hope Okay, we soon have a grid with nice little thumbnails, we just have to style the thumb component itself. Inside the thumbnail styles dot j s, we already created this one, we're going to style it inside of the image style component. So we're going to set the width to 100%. The max width is going to be 720 pixels, transition, all 0.3 seconds. And that is because I want some nice transition on hover. Objects object dash fit is going to be cover border dash radius is going to be 20 pixels. And the cover here will center the image and make it fit nicely into the thumbnail. So that's a really handy little rule you can use in CSS for stuff like that. I also got to have an animation on this one because I want it to fade up, we can actually look at that in the finished application. You know, you can see here that these thumbnails are also fading up just as the hero image. That's what I wanted animation for. So I call it animate thumb. 0.5 seconds. So we're going to create that animation. So add keyframes and animate them. Right from a set the opacity to 02. It's going to be opacity one, that's the animation. And then I also want to set the hover effect. So colon hover like this. And I said to pacity to 0.8, there's an auto formatting and save it back to the application. And as you can see, it's looking great. So that's nice, it's working, it's starting to look like something, we can compare it to this one here, and it looks exactly the same without the search bar. So we have a few things left to do, we have to create the spinner also when we loading and the search bar and the bottom for loading more. In the next video, we're actually going to create the spinner component. So we have that ready when we want to show it when we're fetching more. Okay, we have our hero image on our grid. So we're going to create the spinner in this video. Back inside of the code editor and the components folder, and inside a components folder, create a new folder that we call spinner. And then we create a file, let's call index dot j s and another file. Let's call spinner dot styles, dot j s, it's been beginning to be a little bit repetitive here. But as I said so many times before now is always great to repeat stuff when you learn it. So even if it's boring, it's better to repeat it, because then it will be in your muscle memory later. So that's why I repeat a lot of stuff also in this course. And this one is a little bit special actually because we have the component itself in the index.js file, but the component is really just going to be a styled component. So in this index.js file, we're just going to import the start component in this file. So we can create this actually in this video and then we import it and then it will be finished. So in the spinner.styles.js file, we import styled from styled components. We export a const that we named spinner, and it equals A styled dot div double backticks and inside the backticks we write our CSS, we set the border to five pixels solid. And we have the variable of light gray. We set the border dash top to five pixels solid with a variable dash dash med gray. We set the border dash radius to 50% because this one is going to be a circle so that's why the width is going to be 50 pixels and the height is also going to be 50 pixels. We have an animation on this one also. We call it spin 0.8 seconds is going to be a linear animation and is going to be infinite. That was at the Morgan 220 pixels. All right, then we create an animation at keyframes. Spin we go from 0% Transform. we rotated Cyril degree, here, I'm using PreSonus data. So you can use whatever you want. We didn't do that in the thumb styles I'm using from two in that one instead. So I like to change stuff a little bit when I create courses like this so that you see that you can create it in many different ways. So here, I'm using percent instead. And it should say, transform, not Transform, transform, and rotate zero degrees, and it will see my colon. And then we go to 100%. And the transform is going to be rotate 360 degrees, some auto formatting, and save it. Then we go back to the index.js file in the spinner folder. And for this one, we just import the spinner that we created a style component. So from dot forward slash spinner dot styles. And then we export it, export default spinner. So that's it for this component, we can actually see if it works also. So go back to the home page home.js, we import it first here. Imports spinner from dot forward slash spinner. Alright, and then here just below the grid, we can place the spinner and also a soy, we don't actually need the use state and use effect here more so we can delete those ones also save the file, go back to the browser. And as you can see, just below here, it's spinning like crazy. And of course, it's only going to be shown when we fetch data from the API. But for now, we're showing it all the time, but we're going to fix that later. So that's how you create a really simple spinner with some CSS and style components in react. In the next video, we're going to start creating the search bar. So we created a grid with a thumbs and we have our hero image and we want to create our search bar. Next, if we look at the search bar in the finished application, we can see that we have this nice little icon here and I created this myself, first I had an icon from Font Awesome. But then I thought maybe we shouldn't import the whole Font Awesome library just to have one outcome. So that's why I created an SVG image instead. And then it says search movie, and then we can type in something to search for in here. So this is how it works. So let's go back to our code. And inside a component folder, create a new folder, that's called search bar, capital S, capital B. And inside of that folder, you probably guessed it, we create a file, let's call it index dot j s, and a file that's called search bar dot styles. dot j s. And we do as we always do, we're going to be in the search bar dot styles dot j s, and we're going to scaffold out the style components import style, from style components, then we export a const, called wrapper. And he's going to equal a style of theme. And we have double backticks. And we export, not triple backticks double backticks and a semi colon, then we export the course that called content. It's going to equal style dot div, double backticks and a semi colon, save it go back to the index.js in the search bar folder, we import react coma, we're also going to import a few other stuff here, we're going to need to use state we're going to need to use effect. And we're also going to need to use ref this one. And we import it from react. So why do I need these things? Well, the state we're going to use to create what's called a control component. And that means that we're going to have our input field but it's going to be controlled by react, the input field is going to be based on the value in the state. We're going to use the use effect to trigger when this local state changes. And then we're going to update the search term so that it will fetch new movies from the API. And use ref is going to be used to show you a little trick that we can use if we don't want to do something in the use effect on the initial render. So then we're going to import the image that's going to be that little icon I showed you. So import search icon, camel casing from dot dot forward slash dot forward slash again, images and we have something that's called search dash icon dot SVG. Don't miss the file extension there. Then we have the styles, the import, curly brackets, wrapper and content from dot forward slash sport dot styles. All right, so that's our imports. And then we create a component const search bar, capital S capital V equals, and we're going to destructure out the prop that's going to be set search term camel cased by a narrow. Now for this one, we're going to make an explicit return because we want to have some logic in it. So we have a return statement, parenthesis. Now we have our wrapper. And inside a wrapper, we're going to have our content like this. So the first thing we need is the icon and it's going to be an image. So image SRC is going to be the search icon. We can set an author on that one, also search dash icon with self, close it like this, just a regular img tag, then we're going to have an input field. And it's going to be a type text. We're going to have a placeholder. Let's go going to be searched movie. And then we're going to have an on change handler and value. But for now, I'm just going to surf close this. And to do some auto formatting and export this component, export default search bar. And then we're going to import it in the home component just to see that we got something here. So go back to the home, and close all this, go back to the home. And just below the hero image, we're going to place that component But first, we need to import it. So import search bar from dot forward slash search bar right down below the hero image just above the grid, we can place a search bar, save it go back to the browser. And you can see that we have our input field here. But we haven't started yet, of course. So hopefully it's gonna look something like this, when we're finished, go back to the code and the search bar in index.js file, we're going to make this what's called a controlled component, a controlled component in react is a component that react control. So the input value is going to be based on a state that we create. And when that state changes, it also changes the value in the input box. And this is great because then we know that our state is in sync with the actual value in the input field. We create a state of here const, we can call it state and set state equals use state. And it's going to be an empty string for stores. On our input field, it's all formatted them like this, I want to have them like this, instead, we're gonna have an on change handler equals, and for this one, I want to create an inline function, you could also create a function up here for that one if you want to do that instead. But I want to show you how to do things differently. So in this case, I created an inline function, we have the event, or you can just type in E, for example, you can name it whatever you want, then we set the state with the event dot turn target dot value, and this will give us the value in the input field. And we need to have this inline function as we are actually invoking this function here with that value, otherwise, it won't work. So by having this inline function, we can provide this one with value. So that's why you have this inline function. Otherwise, it will run this function instantly. And that's no good. So if we, for example, had a function that we didn't want to send in some arguments to that we just want to trigger on change, we can have it like this instead. And that will work but in this case, we want to send in the argument or the current value. So that's why we have this inline function. Alright, so that's the unchanged and then we set the value to the state. And there we have successfully created a control component. We can see if it works, go back to the browser, type something in and you can see the value here now is controlled by react. As soon as we set this value to some state value here, we are making this a control component. And every time it changes, it's going to trigger reset state and it gets the value here and replace the value from the text input. In the state, and then the value is displayed in the textbox itself. So it's kind of a closed circle here on how things work. It goes around in this way. Now we have our input field, but we want something to happen. Also, we want to set the search term that we're going to create in our hook that we created before. So we actually going to create a new state inside of use home fetch. So up here in the US home fetch hook, we're going to create a cost, call it search term capital T, and set search term, then it's going to equal use state. And we'll set it as an empty string initially, then we also need to export this one. So export it down here. And we only need a setter for this one. So we can export the set search term like this, save the file, go back to the home.js. And up here, where we where we use or use home fetch hooked, we can destructure out the set search search term, the set search term arrived. And this one is going to be the prop for our search bar. So I'm going to call this prop set search term also. You can call it whatever you want. And then I give it to set search term. So this way, we pass this along down to our component to the search bar, so that we can use it in the search bar. So when this one triggers when we set the search term is going to trigger here. So actually changing the state in our hook here. That's exactly what we want, because then we can use it in our hook when we fetch stuff. But in this case, we want to have a slight delay when the user types something in before it tries to fetch the data, we can look here in the finished application, you can see when I type something in here, that I have a slight delay, otherwise, it wouldn't be a good user experience if it just instantly started to fetch data. So that's why I do it this way instead, otherwise, we could have used this state to actually fetch the data. But in our case, we want a slight delay. And then we set the search term that we're going to use for fetching. So that's why I have dual states for this one. So let's create a use effect in the search bar use effect. We have an inline arrow function just as before. And we have the dependency array. And we're going to fill it out in a second. I'm going to show you how to create a timeout in react now and how we can use it in a use effect. So first we create a timer. We use the set timeout that's built in JavaScript, we have an inline function for that one. And then we're going to call the set search term. That's the one that we created. And we're going to give it the state like this. And I'm going to set it to half a second, that's 400 milliseconds. So this one will trigger after 500 milliseconds. If you want some other value, you can of course type that in instead. And you can see here now that it instantly complains, because we haven't specified this as a dependency. So we specify and set search term as a dependency. And it also complains, because it needs the state, that's also dependency to this use effect. So this linting rules are actually really good. It tells us stuff so that it is so that we actually do this correctly. And we should always specify the dependencies and handle it inside of the use effect if we need to. Alright, but there's one more important thing we have to do with the timer. And that is declared a timer on each render, because otherwise, it will just create a lot of timers. And that's no good. And there's a handy little thing with the use effect that we can use for this. Because if we return a function in the use effect, so every time before a new render, it will trigger this function. So we can clear our timeout inside of that function. And this will take care of that we clean up this timer. So we don't have a lot of timers that just ticks in the background. And you can imagine you have a lot of stuff that you want to do maybe to clean up stuff. So you can always do that in a return function with the use effect. This one doesn't trigger until this render has finished and is going to render again. So that is sweet. We can say this one. And we can actually go back to the use on fetch. And up here. We can console log the search term, so we can see that something is happening. So go back to the application again. Yeah, I have a typo somewhere. Maybe I didn't save the home. Save go back to the browser. Yeah, no, it's worse. You can see it's really important to save your files because it will break otherwise, be sure to save all the files. So if I type in test, and you can see here after 500 millisecond it will trigger. So that's sweet. We know that that is working and we Use this to fetch data from the API. But there are one more thing I want to do. And I promised you to show you a little trick with the use ref. And that is because the use effect always trigger on the initial render, and we don't want to trigger a fetch. When this component mounts, we only want it to trigger when the user has typed something in. So that's why I'm going to create a cost that's called initial up here. And I'm going to use ref. And I set it to true. So when we call the use ref hook, this one will create a mutable value for us that you can compare to something similar as a mutable variable. So we have this initial const, and the actual value is going to be in the initial dot current, that property will hold the value true right now. So I set is the true and inside the use effect, I'm going to check if initial dot current, that's going to be the true value right now, if it is true, in it, it should say initial, like this, right? Then I instantly going to set the initial dot current to false. And you can see here, I can mutate this variable directly, I don't have to have a setter for this one, because this one won't trigger a rerender. That's the biggest difference from a state that when you use ref, it won't trigger a rerender. And then if this one is true, we know that this is the initial render, and then I'll just return, we don't do anything more inside of the use effect. And we set it to false. So next time, this one triggers, this one is going to be false. And it's going to run our logic. So this is how you can create a neat little code snippet here, to skip the initial render in the use effect, save the file, just make sure that it works. Yeah, and it seems to be working. We've learned how to create a control component in react, and the component controls the input field with the state. So the input field always has the same value as the state and that's the control component or state is synced with the input field. And then we created a timer that will trigger each half a second and call this set search term to set the stay there. And the state is going to be the value from the input field. And we also pass this one along from the US home fetch. So that's how you pass data down to your components. That's what props are for, you can pass data down to your component, and we can use it in that component. And that means that we also have this value in our use home fetch hook to use the fetch data later, that can remove this console log for now, save the file, and this will be it actually for the search bar. In the next video, we're going to style the search bar. And then we're going to create the logic for fetching the data. were created our search input field, but it doesn't look good. So we have to style it also. And that's what we're going to do now. So in our search bar dot styles file, we're going to create the wrapper first. And I'm going to display it as a flex. I'm going to align items center. Now not aligned a line I set the height 200 pixels. The background is going to be from the variables, we have the dark gray. And I'm going to give it some padding on the sides, zero and 20 pixels, do some more formatting, save it go back to the browser. And you can see that we have the search bar here. And now we have to style kind of the inner part of the search bar. And we do that in the content. Inside the content, I'm going to set the position to relative because we want to place the icon with an absolute position. The max width is going to be from the variables we have our max width, the width is going to be 100%. The height is going to be 55 pixels, the background is going to be from the variables met gray. And Morgan is going to be zero in order. And the border dash radius is going to be four pixels and the color from the variables we have our white. Save it go back and see what we've got so far. So we have this inner part now of the of the search bar to add the style icon and the search bar input field itself. So inside the content, we're going to nest some stuff here we have our icon that's the IMG I set the position to absolute. And this is why I use relative appear, otherwise it won't work. So it needs to be relative to the actual content div is going to be left 15 pixels. So 14 pixels, and will is going to be 30 pixels, save it go back. And now it seems to align correctly and it also has the correct size. Great. Then we have the input field itself. So down below the IMG type in input, we set the font size to 20 pixels in this one position is going to be absolute left is zero, margin is eight pixels. And zero padding is going to be 000 and 60 pixels. border is zero, the width is going to be 95%. The background is going to be transparent. The height is going to be 40 pixels. And the color is from the variables and is going to be white. So go back to the browser. And you can see that it works now but we have this nasty little outline, you shouldn't remove the outlines, actually, but in this case, I think it's fair to do it because it doesn't look good. So I'm going to remove them. So inside the input, I'm going to nest focus. And I'm going to remove the outline, I set it to none. And hopefully that will remove it. Yeah, you can see it removed. Now. One thing you can do also, if you want is to style this for mobile devices, maybe make it a little bit less insight in font size, and stuff like that, if you want to really fine tune it here, but it seems to be working now. All right, and that's it for the search bar. That's the style for the search bar. In the next video, we're actually going to hook this up to the API and fetch some data. We've created our search functionality on our search bar, but we can't really search for anything. Yep. So if we type something in, we just get this console log here. So we're going to implement the actual functionality where we fetch the search data from the API. Let's go back inside of the code editor. And we're going to be in the use home fetch hooked. And down here, where we say initial render, we're going to change this one to initial and search like this, because we're going to use this use effect both for the initial render and the search. And it's actually pretty easy, because now we just have this empty dependency array, meaning that we only trigger this use effect once on Mount. But we also want to trigger this one each time to use the search for something. And up here we have our search term. And in this one, we're going to store what the user typed in in the search bar. And that means that we want to trigger the use effect when the search term changes down here in the dependency array, we specify a search term, meaning that this use effect will trigger each time the search term changes, and it will also trigger one time on Mount. So we can actually use this one for the initial setting also. Because when we search for something, we always want to fetch the first page just as we do on the initial amount. So that's fine, we're fetching the page one. But we also want to provide the search term. And that's also fine for the initial fetching, because the search term is going to be an empty string. So we know that we're fetching the most popular movies, because we're not specifying any search term. There's one more thing though, that we have to do, and that is to wipe out the old state before we make a new search, because we want to wipe it out and then make a search, show the loading spinner and then show the new movies that we grabbed from the search. So we can set state to the initial state here, and that will wipe out the state. And that's really all there is to it. So we say this file, go back to our application, we try to search for something. And you can see that it works. Now this one changes because this one will always grab the first element in the array of movies. And that's fine. Actually, you can have it like this if you want, but I want to remove this hero image when we're in a search. We can do that also to go back to our code. And then inside of the home.js. Down below here where we show the hero image. We can also specify that we don't want to show this one if we have a search term, so not search term, double ampersand so now we're checking that we don't have a search term and also that we actually have a first element in the array. or movies. But you can see that you won't see her now. And that's because we haven't exported this one from our hooked. So go back to the hooked. And down below here, we can export this one also search term like this, save the hook, go back to the home notice, and up here where we destructure out everything from the hood, we can also destructure out the search term like this, save the file, go back to our application, we tried to search again. And now you can see that it disappears. This is exactly what I want. If you want to keep the hero image, you don't have to do this. And then it reappears when we don't have anything in the search bar. All right, there's one small thing that I also want to do, and that is in the home.js. And if we look down below here, where we have the grid, I'm going to create a ternary operator now because now it says popular movies, even when we're in a search. So this one, I'm going to create a curly bracket and also curly bracket here at the end, and then I check if I have a search term, I have a question mark. And if we have a search term, I create a string I wanted to say, search result. And if we're not in a search, it's gonna say popular movies. So if we have a search term, it's gonna return what's the right to the question mark, and that search result. Otherwise, it's going to return popular movies, save the file, go back to the application. This time, I'm going to search for Indiana Jones. And now you can see that the header on the grid changes. So that's great. It says search results. And I remove this and it says popular movies. So that's our search, we have implemented all the logic for the search bar. And in the next video, we're going to start trading the Load More button. Okay, let's start creating a button that will go at the bottom here. And the spinner will not show all the time, it will only show when we loading stuff back in the code. And inside the components create a new folder that's called baronne capital V. And you guessed it, we create a new file, let's call index dot j s. And we create another file that's called Baran dot styles dot j s. And we're going to be in that file and import styled bomb style components. And for this one, we only going to have one style component. So we export const. And it's going to be a wrapper equals a style dot button in this case, and double backticks Auto format it and save it and then we go back to the index.js file. And we're going to create a bottom. So we import react from react. Then we have our styles, we import the wrapper that we created wrapper from dot forward slash buttons and dot styles. Right, now we have our component const bottom. Then I just structure two props. One is called text and one is called callback. And I create an error and I make an implicit return on this one. I'm going to add the rapper is going to be type button. And it's going to have an onClick handler. And it's going to be the callback that was sent in as a prop. And then I'm going to display the text inside of the bottom. So this is a button that we created as a start component and call it wrapper. And it's going to trigger a callback function when the user clicks on the button, and then we show the text we can send in what text we want to this button. If we want to reuse it, then we export default, bottom, save it, then we go back inside of the home component. And at the top, we're going to import bottom from dot forward slash bottom. And then at the end over JSX, we're going to show the bottom. And we have to think about this because we don't want to show the bottom if we read the last page of movies. So we have to take that one into consideration. So just below the spinner here, I'm going to use the curly bracket and create a JavaScript expression, we're going to check from the State DOT page. If that one is less than State DOT total underscore pages, we know that we're still not on the last page. And I have a double ampersand make a short circuit here. I also want to check so that we're not loading anything. So if not loading, and then I have another pair of ampersands. And I have a parenthesis, put it on a new road just to make it a little bit more readable. And then I'm going to show my bottom. So the text is going to be load more. And for now I'm not giving it the callback. This is it for now. So this statement will check if the page we're currently on is less than the total pages. And then we know that we still want to show the Load More button. And it will also check that we're not loading anything because when we loading something, we want to show the spinner instead. And we have the spinner here. So we can actually create another statement here, the creator curly bracket, and type in loading and double ampersand, and we end it with another curly bracket like this. So this will show the spinner if the loading is set to true. And if it's set to false, it will not display the spinner, but then it will display the button instead. If we go back to the application, we can see the button down below here in the corner. But it doesn't look right, we have decided also to look like this here. And that's what we're going to do in the next video. We have our ugly little button here down at the corner, so it's time to style it, go back to the code, and inside of button dot styles dot j s file and we have the wrapper here, we're going to give it some nice little style here, we start by displaying it as blocked display block, we set the background. For more variables, we have the dark gray, we set the width to 25%. The min width is going to be 200 pixels, the height is going to be 60 pixels. The border dash radius is going to be 30 pixels. And the color is from the variables dash dash white, the border is going to reset to zero, the font size is going to be from the variables font big Morgan is going to be 20 pixels and auto transition is going to be all 0.3 seconds. I'm lazy here I can set it just the property data wants to have a transition, but I said it all outline is going to be none. And the cursor is going to be pointer, then I want a little hover effect all sorts of over a set of pacity to 0.8. That's why I had this transition here. Also, I just want to check also, the font sizes here. Font big. Maybe we can use this one instead on the styles for the search bar because I think I have. Yeah, I have the font size, or 20 pixels, we can use the variable instead variable on big and see how it looks. Yeah, I think that looks nice. Actually, we can use that one instead. But let's check out the button. Yeah, you can see that it works. It looks great. Now, we only have to create a logic footer button now when so that we actually can load more movies. So that's what we're going to do in the next video. This is actually the last video for the homepage. So we're going to create the fetching logic for loading more movies. And we're going to start in the US home fetch hook that we have in our hooks folder. And we're going to start by creating a new state. So this is going to work in a way that we have a state with a kind of a flag that was set to true or false. And we set that one to true when we click on a button. And then we're going to trigger reuse effect. Because as I said before, I think this is great practice with the use effect hook and also the state hooks. So you could do this in other ways also. But this is a quite neat way of doing it we have this state that was set to true or false. And when it changes, we trigger that use effect. And then we can trigger to load more movies, we first create the state const is loading more camel casing as always. And then we have the setters set is loading more, it's going to equal and we call the use state hook we set it to false initially. And this one is going to be triggered from the button itself. So we have to export it down here also. So after the set search term, we can export set is loading more. So there you have it, I removed the sidebar, so we can see the complete row here. Now we're exporting six of those. So that's our state. So we can go back to the home.js file. And here we have our button but we first need to destructure out the set is loading more set is loading more. There's some auto formatting, and it will clean it up for us a little bit. So we just structure that one also. And that means that we can use it in this component. And one thing that we also didn't do is to actually check if we have an error so we can do that before the return statement here. If error We can return a div that says something went wrong. Like that. And that will make sure that if we get too narrow, we won't display everything here, we will display this error message instead of. So you can create a more sophisticated stuff here, if you want to do that. In our case, I think it's enough for this course. Alright, so let's move on to this set is loading more. So we have our button down below here. And we already created a callback prop. So we give it the callback prop curly brackets, and this one is going to have an inline arrow function. Because I want to call this one with an argument set is loading more. Yeah, I'm going to remove the sidebar set is loading more, and we're going to set it to true like this. So this will change this state when we click the bottom. And if we check out the application, we won't actually be able to see anything. Now, you can see that it renders when we click the bottom because it costs logs this out, so we know that it's working. And one great thing to know that is that if I click a few more times here, you can see that it don't rerender anymore. And that is because we're giving it the same value. So react won't update the state if it gets the same value. So it's good to know that with react, if you give it the same state value, it won't rerender it. So react is kind of smart, it already knows that it has the same value. So it won't do anything, a quick little pro tip in react. Alright, so we know that the button is working. So we move back to the use home fetch hook. And we're going to create another use effect down here. below the search use effect, I'm going to mark it with load more. So just as before I create another use effect, an inline arrow function, and we have the dependency array. And we want this to trigger when the is load more is changing. So it's load loading more like this. And the thing is that we only want this use effect to trigger when we actually is loading more. So if not, is loading more if this one is false, we're just going to return we don't want to do anything else in this use effect. This one should only do something when we load more movies. And what we want to do now is to call or fetch movies function again. In this time, we want to give it a State DOT page, plus one because we want to load the next page. And we also give it a search term if we're in a search. And now you can see that it was associated because it wants a few other dependencies, it tells us that we need to specify the search term and the State DOT page. That's what we're going to do the search term and the State DOT page. And now it will be happy at us. And that is because these ones are outside of the use effect. So we should always specify dependencies in the dependency array. And we should handle them inside of the use effect hook. If there's something we don't want to do when something change, we should account for that inside of this use effect. So we fetching movies, and then we set is loading more to false. Do some more formatting and save it. And hopefully this should work. So we have the use effect of triggers. When we change the is loading more Boolean. If we're not loading more, we will just return we don't do anything else in this effect. Otherwise, we call the fetch movies function. And we give it the next page that we want to fetch. And we also give it a search term. And then we set it slowly more to force again so that we go back to what it was before. And then we can do it all over again, if we want to click the Load More button again, save it and go back to the browser and see if this works. We click the load more. And as you can see, it works. And I love when stuff just works. And you can see that our loading spinner is showing showing up also. It's fast, so we can't hardly see it, but it's there. So it's working. And we can also see in the console, here we are at page 11. And we have 220 results now. So that's great. We know that load more is working. We can also try it out so that it works when we search for something. And it does. So that's sweet. I'm happy with this. Hope you like it too. You can see also those those images, some of them has some strange proportions. So if you want you can tweak the CSS to take that into account also. In the next video, we're going to start creating our routes for application. We're going to start creating the routing for our application. And before we do that, I just want to talk shortly about react router. Especially the version six that we're using. It's not officially released when I record this tutorial. So hopefully it released now, when you watch this tutorial, because it is, as they say, here, it's around the corner. And I actually talked to this guy, Michael Jackson here on Twitter. And he said that I should use this version in my course, because it's that stable now, and it's not going to change that much. And we're not going to use all the advanced functionality in the router itself. So that's why we installed the next version of react router when we install the dependencies for this application. And there are a few changes in it if you compare it to version five. And I actually don't want to talk about version five, because that will soon be deprecated. So just wanted to mention why I chose to use the version six of the React router, because this is the future version. And it has the API that is going to be used for a long time, hopefully, in the future. So that's why I use it. In this tutorial, I want to make sure that this tutorial uses the latest stuff, so that you know that you're up to date on the things that you learn. So that's why so just a few words, words here you can compare, for example, they brag here with a react router, version five, that the bundle size is 20.4 kilobytes minified. And the version six is only going to be 8.5 kilobytes minified. So if you care a lot about size on your packages, this one is drastically smaller than the version five. And then they also show you some stuff here on how you use the router. But that's what I'm going to show you in the next video. But if you want to read more about this one here, you can go to react training.com forward slash blog forward slash react dash router dash version six dash pri, forward slash. And then you can read more about it or just google react router version six, and you will probably find a lot of information about it if you want to read more about it. So let's get started. We're going to create the routing in the next video. We're finished the home page and we have our application here. And we have this nice little grid with all the movies, but we can't actually click on them to view a movie. And we can't click on the logo up here. So we have to fix that. And we're going to do that by creating some routes for our application. So the first thing we're going to do is if we go back to the code, we're going to create two more components inside a components folder, we're going to create a new file that called not found dot j s, and also not a file that's called movie dot j s, capital M on movie and capital and capital F are not found. So we're just going to scaffold This one's out. So we have something to route to. If we're in the movie.js file, we import react from react, then I create a component are called movie that is going to be an arrow function. And I'm just going to return a div that says movie. And now export default movie, do some more formatting and save it always save your files. Alright, then I copy this one. And I go inside of the notfound file that we just created. I paste it in and I change this one, I'm going to share them in one go not found like this and save it. And there you have it we have two components to play with. And this one, the movie dot j s is going to be the individual movie component for showing the movie. So we're going to be working a lot in this component later. This one is going to be a series I'm not going to create a fancy and not found component. So you can do some stuff on your own in this one if you want to do that. So we scaffold out two components. And then we can move inside the app.js file that you find in the src folder not in the components folder. So app.js. And the first thing we have to do is to actually import all the components we need from the router library from react router. We can mark it here with routing. If we want to do that. Then we import we have curly brackets, we're going to import something that's called browser router, capital D capital R. And this name is a little bit long. So if you want to rename this module, you can do that by typing s and router. So we import it as router. I think I'm going to remove this sidebar also. Alright, so that's the first one we import browser router, but we import it as router so we can use it with the name router instead. Then we import another component that's called routes. And then we import another component that's called route very similar names here. So be careful when you import these ones. And we import them from something that's called react dash router. So be very careful here. We're not importing it from just react dash router. We Pulling it from react router DOM. So this one is using react router in the background. But this one is specifically created for using in the dome. Alright, so that's all the inputs that we're going to do. So let's create our components down below here. And I'm actually going to change this one to an implicit return. So I delete the return and the curly bracket. And I want to create an arrow function instead const f equals because it's only with arrow functions, you can do an implicit return and I remove the curly bracket there, do some auto formatting, to me, it looks a little bit cleaner. And this div is going to be replaced this wrapper div that has a class name of app going to be replaced with a router to so we wrap our complete application with the router. So it's really important where you want to put the routes, you should wrap it with the router. And that is the browser router that we imported here, but we renamed it to router. So that's why I use it as router here. Then the header is going to be shown on both the home page and the individual movie page. So the header is going to be left out of the routes. So I'll leave that one here. And then I use the route component. And inside of the routes component, we can create our routes. And the first route, we're going to use the component that's called route. So we have three different components here from the router library router, we're going to wrap our complete application in this case, and then we have routes, that's going to wrap a route because you can route in different components if you want to do that. So let's say that you have a component deep down in your app tree, and then you want to create some routes for just that component, you can wrap them in this route component, and then you create the routes. So you don't need to have them here in the top of your application. And then you use the route component to actually create your route. And this route component has a prop that's called path. So we can specify the path where we want to show a specific component. And in this case, it's a forward slash because it's the homepage. And then we have another prop that's called element is going to equal and here we can give it a component. And we want to give it the home component like this. And then we also have to self close the route component. That means that we can remove this home component here. So that's the first wrote, if we want, we can save this to see that it still works, go back to the application, reload it, and you can see that it works. So that's nice, then we're going to create another route. So we use the route component again, we set the path, and this one is going to be forward slash. And then we're going to do something special here because when we're going to fetch an individual movie, we need the movie ID and we can send a long route params for that. And we create a route params for the route by specifying a colon, and then we name it. So movie ID. So this means when we create a link on the thumbnails that we're going to do soon, we can send along the ID for the movie. And that ID, we can grab that in our movie component and grab data from the API. And you can name this to whatever you want. Because this is a rod puram that you decide what you want it to be named. So I want it to be named movie ID. And then we specify the element on this one. And we give it the movie component. And we also close the route component. We haven't actually import the movie components, we can do that. Import movie from dot forward slash, components. Movie. And then we can also import not found from dot forward slash components and not found. There you have it. So that's the route for the individual movie, we save it. And we can't actually click on the thumbnail now because we haven't created that one. But what we can do is go up here, create a forward slash, and then we type in some ID. And you can see that it types out movie here now. And that is because it's showing the movie component so we know that it's working. That's sweet. And then if we remove this one, we'll show the homepage instead. Alright, we're going to create one last route. And that is for our not found component. So we create a route with a path of forward slash and an asterisk. And this will make sure that we show the not found component on any other route that don't exist. And we set the element to the not found component. And we also surf close this route, save it go back to the application. We know that it works if we specify an id like this, it shows the movie component But what happens if we create Another route here like this, yeah, then I chose to not found. And that's super sweet because then we have a fallback component if the user tries to go somewhere else in our application. So that's the route set up in our app.js file. Then if we move inside of our header component, and the index.js file, we're going to create a link on the logo. Up here, we have to import curly brackets, and the component is called link from react dash router dash DOM. And this is actually quite simple. It works the similar way as the a tag does in HTML. So we have a link component we specified to and in this case, it's going to lead to the home page, so we have a forward slash. And inside the link component, we just put our logo like this. So we wrap it inside of the link component. And this will make sure that we can link to the homepage, so go back to the browser. For now, we specify an ID. So we're in the movie component, and then we click on this logo. And we go back to the home page. So really easy to make links with react router. You can also make them programmatically. But we're not going to do that in this course, because it's kind of a little bit more advanced. And we don't really need it in this application. But we have to add a link to the thumbnail also. So that we know that we can click on a thumbnail, and that will lead to a specific movie. So inside the thumb component, the index.js file will do the same thing up here we import curly brackets link from react dash router dash dome. And we have this prop here that's called clickable because we are going to use this thumbnail for the movie poster on each individual page also. And that means that we won't be able to click that one. So we have to have this Boolean to check if we should be able to click the thumbnail or not. And the way I solve this is to create a ternary operators. So here just below the div we check if clickable is true. It's enough to type in clickable, then we have the question mark. And I have parenthesis. And I'm going to use my link component and it's going to link to and in this case, we want to use the movie ID because as I talked about before, we are going to send along this ID in the route. And we can grab it later in the movie ID params that we create here. So we have backticks. I create a template literal here. So I have forward slash, then I have dollar sign curly brackets, and I'm going to give it the movie ID and this will give it a link with a forward slash and the movie ID close the link component. And then we have our image. And in this case, I'm going to copy this one and paste it in. So this is if the thumbnail should be clickable, then in the ternary operator Be very careful here it should be after this parenthesis, I create a colon and then I create a new pair of parenthesis. And I move this image inside of that one. And I also have to end the ternary operator with a curly bracket. And then I do some auto formatting. So what did I do here? Well, I create a ternary operator checking if the clickable is true or not, I show the link component with the image wrapped inside it. And that means that we'll be able to click on this thumbnail. Otherwise, that's what's right to the colon here, I just show the image as it is or don't wrap it in a link component. So the user won't be able to click it. Save the file, go back to the application. And hopefully we should be able to click our thumbnails, you can see that we have this nice little hand here. That means that we've created a link. So if we click this one, you can also see that we have the movie ID up here. And that's the one that we're going to grab in the puram in our movie component. So it's working great. And this is actually it for the routing, there's no more routing we need to do in this application. And in the next video, we're going to start creating the movie page. Okay, we're just going to do a little bit of scaffolding in our movie component before we move on. So up here we're already importing react, we're going to import some stuff from the config also. So import, we're going to need the image, underscore base, underscore URL capital letters and the poster underscore size. And we're going to import it from dot dot forward slash config. Then we're going to have our components we're going to create new ones for this one. But two of them we already created. We're going to import the grid from dot forward slash win. Then we're also going to need a spinner so import spinner Apart from dot forward slash spinner, and then we're going to create the other ones later, we're going to create a hook for this one. And we also need an image. And that's the fallback image just as before. So import, no image, from dot dot forward slash images, and no underscore image dot jpg. And as always be very careful to actually add the extension here, when it's an image. All right, and then we have our movie component, this one is actually not going to have an implicit return, we create curly brackets, because we're going to have some logic in this one. So we create a return statement, parenthesis. And then we're going to create a react fragment, like this. And inside for now, we can just have a div that says, movie, do some auto formatting, and save it. And I think this should be it, go back to the browser. Try something else here. Or we could actually just have clicked on one of these. Yeah, and it shows movies. That's great. We know that it works. And then we can move on. And we're going to start by fetching the data from the API so that we have something to work with. All right, we're going to create our second custom hook. Now, I'm not going to create it first in the movie component, and then move it to a custom hook. Because now we know how we can create a custom hook. So that's why I'm doing it instantly in that one instead. So in the hooks folder, let's create a new file that's called use movie, fetch capital M, capital F, and dot j s. And as I told you before, it's important to name your hooks with use before the name. This is the actual finance. So it doesn't matter here. But it's important that you name your actual hook with use before. So for this hook, we're going to import curly brackets, we're going to need use state and use effect from react. Just as before, we don't really need a main react library for this one, because we're not doing any JSX and stuff like that. So that's why we're not importing it, we're going to import the API object from dot dot forward slash API. And that will give us access to all these nice functions that are created for us. Then we create the actual hooked, so export const, use movie fetch, equals and this one is actually going to have a parameter, because it's going to be the movie ID. And I'll talk more about that in a second. So that's the arrow function. And up here, I create three states, the state and setter for that state. I call the use state hooked. And I'm going to give it an empty object as default value. Now I create a loading state and set loading. You state I'm going to set this one to true initially, because this component is going to start by fetching the data for a movie, so we can set that one to true. And then we're going to have the error and a set error just as before, and this one was set to false. So you state and give it an initial value of false, right. So that's the state we're going to need for this one. And then we're just going to need one use effect. For this one, because we only fetching data one time, and that is when the component mounts, and then we're not going to fetch anything more, because then we have all the data from the movie that we need to have the inline arrow function. And we have the dependency rate. And this one is going to change if the movie ID changes, it actually not going to change now, because we just do it initially, as I told you, but as I also told you, we need to specify all the dependencies for our use effect. So that's fine, in this case, to have it there, it only going to fetch it one time. And then as a use effect can't have an async function here, we create another function that async fetch data equals async. And in this case, I placed it inside of the use effect, and I'm going to show you why in a second also. So we have an async arrow function. And then we can do our fetching logic inside of this one, and it's going to be quite similar to the other one that we did. So we have a try block. And we're going to catch the error if there is one. And if there is an error with set error to true like this. Then in our try block, the first thing we do is this That loading to true. And we also set error to false. Yes, that's we did before. And then we can fetch our data. But I have a typo here. It just say, error. Yeah, I guess I misspelled it up here. Yeah. There you have it, right. Yeah, this one too. Ah, something like that. Right. So first, we're going to grab the movie data from one resource from them point. And then we also have to grab the credits that we get from another resource from them point. So we have const, movie equals a weight. And from the API, I created a function that called fetch movie without an S at the end. There we go, going to give it the movie ID. Right. So that's the movie, then we also want to fetch the credits. So we create a cost to that when that we named credits, we await again from the API dot fetch credits. And we also give it a movie ID. So hopefully, we got all the data that we need here in those costs. But we want to do some stuff here. And that is, we only want to show the director solely because if we look at the finished application, and we go back, and we click Whoa, yeah, there you have it encountered two children with the same Keith. And this is what happens sometimes with this API. And I really don't know why. So if you get this warning, you can create your own unique key somehow, by maybe have a random number and the movie ID, I don't know, you can do it in many different ways. But for now, it doesn't really matter. So we have the movie here. And as you can see, here, we are showing the directors, we need to get the directors somehow from the API. Because from the API and the credits, we get something back, that's called crew. And the crew contains more than the directors. So we have to filter out the directors to just get the directors name. So I mark it with get directors only. And then I create the new cast, I call it directors equals and from the credits, that's the one up here, we have the crew properties. And I'm going to filter this one filter is a built in method in JavaScript, we have a member a crew member. So I'm going to check if the member dot job, this is also a property that we get back from the Movie Database API, are going to check if that one is equal to director with a capital D. And that will filter out all the directors and put them in this const. Or format it. And then we have all the data that we need, so that we can set our state, so we call sub state, that's the setter for our state. In this case, we don't need to use a previous value. So I'm just returning an object here, I spread out the movie. That's the data that we got back here. So we spread out everything from that one. And then we have a property that's called actors. And I'm going to give it the credits dot cast. So from the credits, we have the cast, and we also got the directors from the crew. So the actors is a property that I create myself that I want to have in my state. And I'm going to have all the cast inside of the actors property. And the last one is going to be the directors, there can be more than one director. So that's why it's called directors with an S. And as this is iOS six syntax, we just need to type out this it will create it like this automatically. Alright. Then we're going to set loading the false like this. Auto format it and this should be for this use effect. Actually, I think for now, we need to return something from our hook also. return an object with the state loading and error. Save it go back to the movie.js file. We can see if it works. So down here I marked it with hook. I'm going to import use movie fetch Rome dot dot forward slash hooks and use movie fetch. And then we can try out our hooked and see if we get some data back. So at the top of our component, we can destructure out the properties that we exported from the hooked I also want to show you how you can rename something when you're distracted. So we have the state that we destructed, and we have a colon, and I want to call it movie instead. So that's how you rename it. And then we destructor out loading and error. Then we call or use movie fetch choked. And we also want to give it the movie ID. But we haven't really got the movie ID. So how do we get it? Yeah, and this is from the route that we have up here, as I told you about before, we have the ID up here in the routes, we can get that one from the router. So we have to import something up here. So we import curly brackets, it's a hook that's called use params. From react dash router, dash dome. So with this hook, we can grab that params that we have in the URL. So we'll do that before we destructure out the state and everything here from our use movie fetch hook to make sure that we have the ID to send into that hook, the const, and then we destructure out the movie ID equals and we call the use params. That's everything you have to do. And this one is named movie ID because we named it that in the app.js file. We call it movie ID. If we call it something else here, we have to distract it with that name. But this will give us that ID that we have up in the road here in our application. So hopefully this will work when we tried to console log out the movie, and this is actually the state but I renamed it to movie. So that's why I can console log it out as movie. Save it. So we try it out, click a movie and nothing shows up. And I think I know why we go inside the use movie fetch hook, we also need to actually invoke this function here. So we do that at the bottom of our use effect hook. Fetch movie. Did I name it fetch data, we can rename it to fetch movie instead, like this. And make sure to invoke it at the bottom of the hook. Save it go back to the application. And now you can see that we have the data here. So we have all the actors. And we also have the directors that were filtered out here. So that's great. All the data that we need is here. I want to show you one more thing here. And that is if we were to remove this, that movie function outside of the use effect like this, it tells us here that we need to specify the fetch movie, and that's okay, because it's outside the use effect. Now, we do that. And then it gives us another warning here. And this is because this function two will get recreated on each render. And this use effect will think that it's a new function that gets on each render, and it will create an infinity loop. So that's no good. So if we want to have it placed outside of the use effect, we need to wrap it in something that's called a use fallback hook, we can import that one up here. And then we wrap this one in the use callback hook like this. And then at the end of it, we need to have a dependency array. In this case, it's empty. And then it gives us another warning. And then it says that it needs to specify the movie ID because the movie ID is something that's outside of this one here. We also need to specify this one, we specified a movie Id like this. And now it won't complain. And this one will not get recreated unless the movie ID changes. So this will stop the Infinity loop. And we can see that it won't go into an infinity loop here. If you want to do it like this, instead, you can do that. In this case, we don't need to call this function from anywhere outside of the use effect. So I'm just going to revert it back and not use the use callback hook. So I'm going to have it inside of my use effect instead. Like we had it before. Save it make sure that it works again, and it does. So that's how you use the use callback hook to stop infinity loops in react. But in this case, we won't need it. So it's better to have this function directly in the use effect hook instead. Alright, let's move on and create some nice components for our movie page. Alright, we're going to create this nice little breadcrumb navigation up here on each individual movie. So go back inside of the code editor inside the components folder, create a new folder that's called Brad Trump. capital B, capital C and you create another file inside of that one. Let's call index.js. And you create a file, let's call the breadcrumbed dot styles, dot j s a bit repetitive now, but it's good because that means that we probably be learning something here. So inside the breadcrumb dot styles file, we're going to scaffold out to style components. But first we import styled from styled components, then we export the class, that's called wrapper. And is equals a style.do, double backticks. And then we export const, that's called content. It equals A styled dot div, all formatted and save it. Go back inside of the index.js file in the breadcrumb folder, first, we import react from react, we're going to import the link from react dash router dash DOM. Because we want to be able to link back to the home page, then we have our styles, import wrapper, and content from dot forward slash breadcrumb dot styles, then we create our component cost breadcrumbed. equals, then we're going to destructure to prop is called movie title. And we create an arrow function and we can make an implicit returns we have parenthesis we're going to have the rapper num, we have the content. Now we're going to use the link from the React router DOM is going to link to and where do we think it's going to link? probably guessed it, it's going to be forward slash because we want to link to the home page. This is the first element in the breadcrumb menu. So we're going to have a regular span here. And it's going to say home. So that's the first one, then after the link, we create another span. And we're going to have a pipe like this, I think it's option seven on Mac. Yeah, option seven. Or you can have whatever you want inside of there. But I'd like to have that as a divider. And then we have the last span and that's it's going to be the movie title. Do some more formatting. And then we need to export default this one also. Next export default breadcrumb, right. So this is going to be a two level breadcrumb, we only have the home button to click on to go back to the home page. And then we show the movie title, save the file and then go back to the movie.js file. Up here where we have the component imports, we import breadcrumbed from dot forward slash breadcrumb. Right. Now we can use it down here in our JSX. One thing we can do first is that we can return something here, if we loading. So if loading return, we're going to return the spinner if we're loading something, which we are going to do initially. And if we have an error, return a div that says something went wrong, or something else if you want that. So this will make sure that we show the loading spinner initially when we load in all the data for the movie. And if we have an error, we want to show that JSX down here, I don't know why it's a spinner, you know, and deleted. Alright, so instead of the movie here, I'm going to remove this one, and I'm going to use my breadcrumb and it has a prop that's called movie title. For that one, I'm going to give it a movie dot original underscore title. And I close the component like that, save it and go back to the browser and click a movie and you can see that we have our bread crumb here. It looks like crap but we're going to style it in the next video so don't worry. And it seems to be working here with a title and everything and we can click the home button to get back to the home page. That's not so in the next video. We're going to give it some styling. Alright time to give this little breadcrumbs, some styles and we do that inside of the breadcrumb dot styles file. We have components inside of that one, we have the wrapper and the content. So let's start by styling the wrapper, I'm going to display it as a flex align items is going to be center and justify content is also going to be center. I set the width 100% The height is going to be 70 pixels. And the background is going to be from the variable that's called matte gray. And the color is going to be also from a variable but that's the white one. Save it go back and see what we've got so far. You can see that we have it here but it looks not good now, so we have to fix this also. And that's the one here does the content. So the content was set at one also to flex display flex. The width is going to be 100%. The max width on this one is going to be from the variable max width and the padding is going to be zero and 20 pixels. Then we have the span element inside our breadcrumbs, we're going to style up one also span we set the font size. What do we have in the global style here in the root? For me, I think it's the font medium. So variable dash dash, font med And the color is going to be for the variable is going to be white. The padding dash, right is going to be 10 pixels. And then we're also going to have a media query for this one. So add media screen and Max dash with is going to be 762 pixels. And I'm just going to change the font size here font size. And I think yeah, I forgot all of them now. Yeah, font small. That will do, I think. So from the variable, font small. Alright, save it and go back to our application. And there you have it, and it should change in font size. Yeah. So it's working, and the link is working. Great. There's some padding there. I have it there also, okay. Yeah, it doesn't matter, you can adjust that one if you want to do that. Alright, so that's the styles for the breadcrumbs. So let's move on and create our movie info component. We're going to create the movie info component. So we looked at an individual movie, or we can look at anyone. It's this component here, it's kind of a hero component. So I think this will be the largest individual component in this application. So we're going to do a little bit of JSX. And also, it's going to be a little bit of styling for this one. So we better get started with this move back to your code editor. And inside a components folder, create a new folder that we call movie info, capital M capital I. And then we'll create a new file index dot j, s, and then another file inside of that folder, that's called movie info, dot styles dot j s. And we scaffold out the style. So import, styled from styled components. And for this one, we're actually also going to import some other stuff here, because we need the image base URL and the backdrop size from the config. And I'm going to talk about that when we style this component, but we import them now. So import, capital letters, image, underscore, base, underscore URL, and also the back drop underscore size. And we grab them from dot dot forward slash dot dot forward slash config, right. And we scaffold out three components here. So export const, rapper, equals style, Dave, double backticks, export const. content, hopefully beginning to see my pattern on styling. In this one, I usually have a wrapper and the content. This one is also going to be styled div. And then we're going to have a third one. That's going to be called export const text. And it's also going to equal the style of div that will backticks. Like so save the file, go back to the index.js file in the movie info folder. Now we can start building this massive component. Now it's not really that massive, I think it's about 50 rows or something. All right, import react from react, and then we're going to have a component, so we're actually going to use the thumb component for this one. So import thumb from dot dot forward slash, thumb. Alright, so that's the component that we need. We also need something from the config. So import the image underscore base underscore URL, and also the poster. underscore size. From dot dot forward slash dot dot forward slash double dot dot forward slash config. Then we have an image. And it's going to be the fallback image as we always use, so import no image from dot dot forward slash dot dot forward slash, again, images. No underscore image dot jpg. All right. And then we have our styles. The import curly brackets, wrapper, content, and text from dot forward slash, move info dot styles. Right, that's our imports. Then we're going to create the component itself. So we have a const. Movie. info equals anger is a structure of a prop. That's called movie we're going to give it the movie data as a prop, an arrow function and we can make an implicit return on this one. First, I actually going to export default its export default movie info, like so, then inside of here, we're first gonna have a wrapper. And this one is actually going to take in a prop. That's going to be the backdrop image. So we have a prop that called backdrop. And from the movie, we have a property that's called backdropped. underscore path. And we close the component and inside the wrapper, we have our content, like so then we're going to use a thumb component again. And this is actually great, because you can see here how you can reuse components in react. And this is kind of the fundamentals of working with components, you can reuse them in your application. So you should always code with that in mind, if you want to reuse it somewhere, you should make the components flexible. So you don't need to create similar components, it's better to use one component that you can modify with props instead. So we have our thumb. And on that one, if you remember, we have an image prop. So we're going to give it the image. And this one, just as before, I'm going to check if it's as a movie poster path, I use a ternary operator for this one, I have a question mark. And also note, I created curly brackets here, because this is a JavaScript expression. And as I like to do it with template literals, I'm going to have double backticks. And I have $1 sign and then I'm going to grab the image base URL, then I have another dollar sign and curly brackets, I'm going to grab the poster size. And then lastly, I'm going to have a new dollar sign and curly brackets. And I'm going to grab the movie dot poster underscore path. So that is if we have a poster pass. Otherwise, we have a colon and we show the no image that we imported. That's the image prop. Then we have the clickable prop. And in this case, we're going to give it false because we don't want this one to be clickable, we set an OLT of movies thumb. And then we can close this component, do some more formatting, save it and we can actually go back to our move it up JS component and import this one here where we import the components, import movie info, from dot forward slash, movie info. And then below here below the breadcrumb or we can use a move in for component like this, we give it a drop of movie. And it's going to be the complete movie stayed. If you want, you can specify it even more in detail if you don't want to give it the complete state but I think for simplicity's sake, I give it the complete state here to work with, say the file go back to our browser. And you can see that we have our image here. And we can click it and that's great. So yes, yes, it works with some other stuff here. Yeah, it does. That's great. Move back inside of the index.js file in the movie info folder. So we created our thumb and just below the thumb, we're going to have our text. So we use the text style component. And inside of that one, we're going to have an h1 tag. And I'm going to grab the movie dot title for that one. Then we have an age three tag. And it's going to say plot or something else if you want that. Next we have a p tag. And we're going to grab the movie dot overview. And that's the short text about the movie. And inside of here, I actually going to create some regular classes with class name, because I want to show you that also, you could create stock components. Also, if you want to do that for these that I'm going to create now. But I'm going to create a regular div with a class name or rating dash directors, I'm going to have both the rating and the directors in this one. And inside of this one, I'm going to nest another div. And inside that div, I'm going to nest an H three tag that's going to say rating, like that. And then I have another div with a class name. That's going to be that's going to be score. And then I'm going to grab from the movie dot vote underscore average. And that will give us the score from the API. Let's do rating. Then below this wrapping div are going to create another wrapping div and this one going to have a class name of director and inside of that one are going to have another age retag and it's going to say director and I'm going to do a little trickier because if there's more than one director, we won't To say directors, so I create curly brackets. And inside here I oops, don't know why did like that, okay. And inside the curly brackets, I can have a JavaScript expression. And I can check if movie dot directors dot length. If that one is greater than one, I'm going to add in an S, like this. Otherwise, I just return an empty string. If there's only one, it will say director, otherwise it will say directors. then below that header, we create another pair of curly brackets, because now we have to loop through the directors and display them in our dome. So from our movie, we have this property that's called directors, we're going to map over that one. And we have a director, we can make an implicit return in this arrow function. So we have a p tag with a key, it's always important to include a key as you know, otherwise, React will complain react uses the key internally to diff stuff, so it knows what to change in the DOM. Okay, so the key is going to be from from the director, we're going to grab something that's called credit underscore ID. And this will be unique, right, and inside the p tag, we have another pair of curly brackets, and I'm going to grab the director, dot name, auto formatted. So that's the directors and this should hopefully be it. So we can save it, go back to the application and see what we got, we probably won't see anything because this text is white, I guess. Or if we check here below, we can see that we are the last it is in white now. So you can see it, the rating is 5.1. And we have a directory also. So we know that it's working, we just have to give it some styling to make it look nice. And that's exactly what we're going to do in the next video. We have finished a logic for a movie and four components. So it's time to style this one. Go back inside of the code editor. And inside the movie info dot styles dot j s, we start off with a wrapper. For this one, we set the background and this one is going to be based on a prop that we're selling. That is called backdrop. So I'm going to create a ternary operator here because if we don't have a backdrop, then we're going to set the background to be just black. And if you remember when we grab a prop in a style component, we can do that with $1 sign and curly brackets. Because this is a template literal. So that's how you create a JavaScript expression. And then I'm going to destructure out from the props. So I have a parenthesis and curly brackets again. So I'm going to destructor out the backdrop like this. And then I create an inline arrow function. And then I'm going to create a ternary operator here to check if the backdrop exists. So backdrop, then I have a question mark. And then I do another template literal. Inside of here, we have the URL. And I have a regular single quote, I don't actually know if we need this one. But I'm gonna leave it in just to be sure. And then dollar sign curly brackets. And I grabbed the image base URL. And then I have again, dollar sign and curly brackets, and I grabbed the backdrop size, and I have a third dollar sign and curly brackets. And I'm going to grab the backdrop, that's the one that we send into this component. So that is if we have a backdrop otherwise, to the right of the colon. I'm going to show a black color. And then we have a semi colon to MDS with just after the last curly bracket. This can be a little bit nested here and hard to read actually see if it does something if I yeah, it's all formatted on one row. Okay, yeah, that's fine. I'm going to remove this sidebar. So you can see this is maybe easier to read. So I check if the backdrop is true. And then to the right to the question mark are going to parse in the image base URL and the backdrop size, and then we'll have the backdrop that we're sending to this star component. If this exists, we're going to show that one as a background. Otherwise, we set the background to be black. Right, then we're going to set the background dash size. It's going to be cover and then we have the background dash position. That one is going to be center. And I'm going to set a little bit of padding on this one. So 40 pixels and 20 pixels. And I have an animation also because I want this one to fade off just as the other ones. animate movie info, camel casing, and one second and then I create The keyframes so add keyframes like this, and then we go from. Or if you want to use 0%, instead, we set the opacity to zero, and then two, or 100%. If you use that instead, Opacity is going to be one, save it and see what we got. Okay? I must have some typos somewhere because we we don't see the background. Yeah, and that's because I need to have this single quote here also, at the end, save it and go back. And there you have the backdrop. That's sweet, I can actually try also to remove those and see if it works without them. Yeah, and it seems to be working. So we don't actually need to have those single quotes. Alright, sweet. Okay, that's the wrapper move down. And then we're going to style the content itself, we set the display to flex, the max dash with is going to be from a variable max with. Then we set the margin to zero and all the background, I'm going to set a transparent black on this one. So RGB or RGBA, I don't think you need a actually 000 and 0.7. That will make it a little bit transparent. Then we have a border radius of 20 pixels. And we have a media query on this one also. So at media screen, and max width is going to be 768 pixels on this one. And then we're going to display it as a block and set the max height to none. And that's it for the content, save it, go back to the application. And you can see that we have the content here. But we need to do some more styling here on the text to get it to look exactly as we want. So we have our text style component here. And for this one, we set the width to 100%. I set the padding to 20 pixels, and 40 pixels. Set the color from the variables white. And overflow is going to be hidden on this one. Then I'm going to grab a class. That's called rating dash director. So that's the one that I created inside of here. rating dash directors, you can grab them just as a regular class in the star component. So that's why you don't need to create a separate star component for each and every element. If you don't want to do that some elements are really small. And maybe it's not justified to have its own style component. So we're going to display it as a flex and justify content is going to be flex dash start. Then we have the sport class. This one is also going to display it as a flex align dash items is going to be center and justify content is going to be center so these three will center stuff for us. And you could also create a separate class if you don't want to type them in all the time. The width is going to be 35 pixels. The height is also going to be 35 pixels background is going to be white. So FFF and the color is going to be black. And you could also of course create variables for these ones. If you want to do that and place them in the global style where we have the other CSS variables. The font dash width is going to be 800 border dash radius is going to be 25 pixels. Or you can actually set it to 50% if you want that is instead because this is a circle and the Morgan is going to be zero. That's the score. And then we have our director. So dot director the Morgan is going to be 0004 pixels on that one. And inside of that one we have a p tag and we set the margin to zero on that. And below we have the last one that's the h1 tag. And that one is going to media screen and Max dash with 760 pixels. And we set the font dash size, the variable, dash dash font big. Right? Save it go back to the application. Yeah. So there's something here that doesn't look right. And I think I know what it is. Yeah, this one is called directors. And probably, I misspelled this one yet rating directors, we should have an S zeroes on that class, make sure that you add an s and save it. Go back to the application. And now it should look right. Yeah, it does, we can see if it looks great on another movie, also, and it does. Sweet. So that's the movie info component. In the next video, we're going to check out this little movie info bar that's below here we can see the running time to budget and the revenue. Let's create the movie infobar. And that's the one here with running time, budget and revenue. We're going to start as always by creating the component first and then we create the styles in the next video. So we start off in the components folder by creating a new folder that we call movie infobar, capital M, capital I capital D. And inside of that folder, we're going to create a new file that's called index dot j s. And then we're going to create another file that's called boring stuff. No, I'm just kidding. Of course not. But it's getting a little bit repetitive here, it's going to be called movie in full bore.styles.js. Of course, we start off by scaffolding out those components, import styled, ROM styled components. And we export constant, we have our wrapper, style dot div, double backticks. And then we're going to have our content export cones content equals stand, dot div, and double backticks. Save the file and go back to the index.js file, we import react from react. And then we're going to use some helper functions that are provided for us, they will take a look in the helpers.js file, you can see that I have one function for calculating time, and one for converting the money. So this one for example, the Convert money, JavaScript has something built in that we can use for converting into a currency. And this one I said is one for converting it into US dollars, you can change this one if you want to have another currency. And this one is going to give us the time in hours and minutes. So these are the ones that we're going to import in the component. So move back to the index.js file. And I mark it with helpers. Import calc, time, camel casing and convert money also camel casing wrong. dot dot forward slash and dot dot forward slash again, help us right, then we have our styles. So we import curly brackets and wrapper and content. From dot forward slash movie and FUBAR stars, all right. And then we can create our component. So we have our concept of movie info bar equals, this one is going to get some props. So I destructure the time, the budget and the revenue. And I have an arrow function and I make an implicit return. And I think I'm also going to export default, before we start creating our JSX. So export default movie info bar. All right, we start off with our wrapper. Now we have our content. And the first div we're going to have is a deal if we have a class name or column on that one. So we have a p tag, a running time colon, then I have a curly bracket, and we invoke the function that's called calc time that we import it. And we give it the value of time, and we end it with a curly bracket. So that would give us the correct time. And actually, the other two days are going to look almost exactly the same. So I'm going to copy this one and paste them in two more times. The class name is going to be column also on this ones, but this one we can change it to budget. And instead of chart time, we're going to invoke convert money instead and we're going to give it budget. Now the last one is going to be revenue. And we also invoke convert money and give it the revenue. Right? Save it. And this is our movie in football, we just need to make sure that we use it in the movie component. So move back to the movie.js imported up here, import movie info bar from dot forward slash, movie info bar. And then below just below the movie info. We use that component movie info bar. And we also have to give it some props time is going to equal movie dot runtime budget is going to equal movie budget. And the revenue is going to be the movie dot revenue. And then we close the component like this, do some more formatting, and we get him on each row. So that's much nicer. We can see it here now. So we have these props here. Now. This should be it for a movie and FUBAR. If we save this one, go back to the browser. And nothing shows. And that's because we haven't styled it yet. I thought we should see something at least. But I guess it's because the Yeah, the text is white now. So that's why so you can see down here that we have the running time we had the budget. But the budget is actually Ciro that's no good. Or is it zeroed out on that particular movie? Yeah, it was, it didn't have any budget. Right. So in the next video, we're going to start it. Alright, we're going to create the styles for the movie. And for Boris, make sure that you insert a movie in FUBAR dot stars file. And we start as always with wrapper, we display it as flex, align the items. To center, I'm going to set a min height on this one 200 pixels. And the background is going to be from the variables and I'm going to grab the dark gray. I set the padding to zero and 20 pixels. Save it go back and see what we got so far. Yeah, we can see it down here. So go back to the code, then we're going to start the content, we display it as a flex. I set the max win over variable from the variable max width. I set the width to 100%. And the Morgan is going to be CRN auto. Then, we have that class that's called column. So dot column. That's the one if you remember that we have here the class name column. And I also got to display that one as a flex flex box is a really handy tool in CSS a line items is going to be Sunder and justify content is going to be Sunder assess the background, from our variable are going to grab med grade, a set of border dash radius to 20 pixels, the margin is going to be zero 20 pixels, and the flex is going to be set to one. Then I'm going to style the first child we have we have three of them. So I want to start the first shot a little bit differently. I want to set the Morgan dash left to zero. And I also want to start the last child with colon last dash child I set the Morgan dash right to zero. Right. Now we just have a media query left at the bottom here at media screen and Max dash with several 168 pixels are displayed as a block below that pixel size. And the column dot column is going to have a margin of 20 pixels and zero, right? This should be it, save it back to the application. If it works, yeah, there you have it. It works on mobile devices also. That's super great. That's the movie infobar. And now we just have the grid with the actors left to do and then we've finished the basic stuff with this application. Alright, let's create the last component for our application. And that's going to be the actor. Inside a components folder, create a new folder that the name actor. And then you create a new file inside of that folder that we're going to call index dot j s. And we created another file that's called actor dot styles, dot j s. And inside the actor dot styles dot j s, we import styled Rome style components. And then we export the cost that we call wrapper equals style dot div, double backticks. And then we're going to have another one, export const is going to be called image capital I, of course, equals style dot IMG, we're going to style this image tag, save it, go back to the index.js file, and we can create our actual component. So import react from react. Then we have our styles. And we import the wrapper and the image, ROM dot forward slash actor styles. Then we create the component const actor equals parenthesis and another a destructor. Out inside of the curly brackets, the name, the character and the image URL. We have an arrow function, we make an implicit return we have the wrapper, then we're going to display our image, we have the source or image URL ot is going to equal actor dash thumb. And then we close it. Now we have an H three tag, that's going to display the names of curly brackets and name that's the prop name. And then we have a p tag and we have curly brackets and we're going to grab the character that's going to be the name of the character. Right, then we just need to export default actor and or component is good to go. So go back to the movie.js file imported up here, import actor from dot forward slash actor, right, and then move down to our JSX. I'm just below the movie info bar. We're going to show these actors and we're going to show them inside of our grid. So we first display a grid. The header for this one is going to be actors. If you remember, we have this prop that's called header where we can set the title of our grid. And inside a grid, we're going to map through all the actors. So we have curly brackets, and from the movie dot actors, we're going to map through each actor. So we have an actor and an inline arrow function, parenthesis, we make an implicit return. Then we display an actor, it needs to have a key, as always, when we met through stuff in our JSX in react, so the key is going to be from the actor dot credit underscore ID. That's the key. Then we have a prop that's called name. So we're going to give it the actor dot name. And a scroll up a little bit here. And then we have a prop that's called character. And for that one, we give it the actor dot character. Like so now we have an image URL. And it's going to equal and this one is also going to be that ternary operator that we use before because we want to display a fallback image if we don't have that one. So we check if we have an actor dot profile underscore path. And then we have a question mark and we're going to return our nice little URL. So I have double backticks dollar sign and I have curly brackets and I grab the image base URL and then directly after that I have another dollar sign curly brackets and I grabbed my poster size. And then I have a third dollar sign and curly brackets. And I'm gonna grab actor dot profile underscore path. Be very careful with the spelling here. It's very easy to get a typo when you do stuff like this. Now we have our colon and if we don't have a profile path, we give it a no image. And then below here we need to close that component also do some auto formatting. So this should be my friend We have hopefully finished the base of the application. And then I'm going to teach you some other stuff that's useful in react. So this should be it, I hope, save it and go back to the browser, you can see that we have the accuracy, but it doesn't look good, because we haven't styled them yet. But at least it's working. And these are in white, there, you can see the character they play in the movie. So we're going to style them in the next video. And then we have this nice actors grid. Alright, let's give those actors some styling. So inside our code in the actor.styles.js file, we have two style components. So let's start with wrapper as usual. I'm going to set the color from our variables, we have white, I set the background. And also from our variables, we have the dark gray, I set the border dash radius to 20 pixels, padding is going to be five pixels, and the text align is going to be Sunder then I'm going to have an age three tag nested here, I set the Morgan to 10 pixels 000. on that one, and then we have the p tag is going to have a margin of five pixels and zero. All right, so that's everything for the wrapper, then we have the image, just a few lines of code left, we display it as a block, the width is going to be 100%. The height is going to be 200 pixels. And albeit dash fifth is going to be cover and the border radius is going to be 15 pixels. And this should be it, save it go back to the application. And hopefully you have a nice grid. Yeah, almost. There's something wrong here with a background. Yeah, and that's because I have a typo, it should say border radius, like that Not radius. Save it go back. And there you have it. Let's make sure that it works on all devices. And it does. Sweet, sweet, sweet. And that concludes the basic stuff for this application. In the next video, we're going to talk about prop types and how you can type check the props that you send in to your components. I'm going to talk about something that's called prop types. And prop types is something you can use on your components in react to type check the props that you send into your component. So you have this special property on your components you create. That's called prop types. I'm on the official react page. Now, reg deus.org. And just as to say here, React has some built in type checking abilities. I'm going to show you how to convert this application into TypeScript later in the chapter. So if you don't use TypeScript, you should use prop types instead. That way, you can at least type check your props that you send in it. So they tell you here to run type checking on the props for a component, you can assign a special prop types property. And I'll give you an example here. So they import the prop types that's from the library that we installed earlier prop types up here. Then they have the component name, and then assign and then assigned to this property that's called prop types. So this one has a lowercase letter to start with. And this one has an uppercase letter. So this one is the actual property on the component itself. And this one is the one that you import from the library that's called prop types. So it can be a little bit confusing, but we're going to practice this in our components. So hopefully, you'll get a grasp of it quite quickly, you have this special property on your component that's called prop types. And that is an object. And here you can specify your props. And from the prop types that we import up here, you have different types you can check against. So this one will get a warning if the prop isn't a string that this component receives. And if we scroll down here, they show you everything you can do here. And we are actually just going to do those simple checks if it's a string, a number or a Boolean. But you can also check against an object, for example, you can set all the properties in an object, and then you use something that's called shape. And then you specify your orbit shape inside of that one. So you can do some more advanced prototype validation here, instead of just check that it's an object. You can check all the properties on the object by using the dot shape. So I highly suggest that you read this one on rxjs.org. If you want to know more about prop types. I think a lot of people now are starting to use TypeScript with react. And with TypeScript. We don't have to do this. We have it for free in TypeScript. So prop types is only If you don't use TypeScript, and that's why I won't go into super detail about it either, because I think TypeScript is actually great to use in combination with react. But you should know at least that you can do some deeper prop type validation by using some of these syntaxes. Here, you can also check an object with with warnings on extra properties. And you can do an exact check here, if you want to do that. And you can also check if you send in an array that should have only numbers, you can check that also. So that you make sure that the array doesn't contain strings, for example. Or then you can do the same with an object here. So there's some really useful stuff inside of here that you can learn if you want to get more advanced into prop types. But we are going to use the most simple use cases. And we're going to check for strings, numbers, and Boolean and also for functions, I think. So in the next video, we're going to learn about the most simple forms on how we can use prop types on your components. Okay, let's start doing some prop type validation. So we're going to do that with the prop types library that we installed in the beginning of this course. So let's begin at the top here with the actor in the components folder, and then we're going to move away down and go through all our components. So in the actor, make sure that the import prop types, capital P, capital T, from Prop, dash types, right. And then just below the component at the bottom here, just above the export default, we have our actor component, so we're going to use the special property that's called prop types on that one. So actor dot prop types, and this one is lowercase p, not capital T, as it is up here. Be very careful here is can be quite confusing, actually. So prop types, is going to equal and we have an object. And then we can specify our different props that we have here. So we have the name, Prop, and the name prop. We know that this one is a string. So from the prop types that we import that capital P prop types with capital P prop types, we have something that's called string, so we're going to check against if it's a string. All right, then we have the character. And from prop types with capital P, we're also going to check if that one is a string, and we have the third one, image URL, Rob types, dot string, all of these are going to be strings. So we say this one, go back to our application. And we can see here, we're going to need to be on an individual movie here. So we have this movie here, nothing shows up here. But if we go inside, or I'm just going to close this here. So if we go inside our move it up JS component, we have our actor here. And we know that this name, for example, is a string. So if we change this one to a number, for example, 10, save it, go back to our application, you can see that we instantly get a warning here fail prop type, invalid prop name of type number supplied to actor expected string. So this is a very handy way when you develop your application to know that you're sending the correct props to your components. And this is only available in development mode, it will not be in production. So it's kind of a tool when you develop this application to actually validate your props that you're sending to your components. So we're going to change this back now, and hopefully get an idea on how it works. Now, that was our actor. Then we have our bread crumb. So just as before we import prop types, capital P capital T from prop dash types. And below the component we have the component name, breadcrumb dot prop types. With a lowercase p, it's going to equal an object. And for this one, we have a prop. That's called movie title. And from the prop types with a capital P, we're going to check if it's a string, right. So that's the bread crumb. Then we have the button. For that one, we have two props. So we import prop types, capital P, from prop dash types. And below the component. We have the bottom dot prop types. lowercase p equals an object. We have our text prop that one We're going to check prop types, capital P here and a little bit repetitive here that we check if it's a string. And then we have a coma, and we have a callback. And from the prop types, capital P, this one is going to be a function. So we have that one also on the prop types object. funk, we can check if it's a function, save it, go back to our application and check Yeah, it seems to be right. Let's have baronne. Then we have our grid, import prop types capital P from prop dash types, below the component, grid dot prop types lowercase p, then we have two props for this one, header, prop types dot string, we check if it's a string. And we actually don't need to check the children because that is a built in Prop, so we don't need to verify that one. That's the grade that we have the header and the header don't have any props, we can skip that one, we have the hero image. And this one has reom to import prop types capital P from prop dash types. Below the component, type in hero image, dot prop types lowercase p, we have our object. And we have the image we check against the prop types with capital P dot string. All of these are going to be strings. Also, we have the title, prop types dot string. And we have the text prop types. dot string, right? image, title and text. Save the component we move inside of movie info component. And for that one, we have one prop import prop types from prop data types. And below the component movie, info dot prop types equals an object. And we call it movie I think, yeah, movie. And this one is an object. So prop types dot object. And this is what I talked about before in the last video. If we go back here, you can see if you want we can save this object with dot shape. But I think there's too many properties in this object. Now to actually do this. I don't think it's worth it. So just check if it's an object. But if you use dot shape, you can shape the complete object here and check every property on the object. All right, let's move on we have the movie info bar. And for that one, we have three of them. So import prop types from prop dash types. The loader component, movie infobar equals an object. And we have the time and prop types. dot this is going to be a number so we have the number property check against. That's the time then we have the budget, prop types. DOT number is also going to be a number. We have the revenue, prop types DOT number all three of them are numbers. movie in forbore Yeah, of course, I also have to have dot prop types like this. Right? Just check the application. Everything seems to be working. Movie info isn't the fun is it because I typed in Yeah, this one is auto generated when I typed in movie info below. Okay, just remove it, save it. Then we have the search bar. Import prop types from prop data types. Right below the component. We have the search bar dot prop types equal an object. So we have the callback function. So prop types dot func, we check if it's a function. Save it. The Spinner will not have any props for that one. We have the thumb and we have three of them there. So import prop types from prop Types below the component, we have thumb dot prop types, lowercase p equals an object. And we have the image. I think image movie ID and clickable image, prop types capital P, dot string, that's the URL for the image. So it's a string. Then we have the movie ID, prop types, DOT number, the ID is a number, and then clickable. Prop types, dot, and this is a Boolean. So we have something that's called bool. And this will check against a Boolean. Right? Now, it's actually our last component, I think we don't have anything in home and movie and not found. That's the last one. And I saved this for last, actually, because we built the whole application. Sure, you should do this from start when you build a component, I didn't want to confuse you too much before we have learned more about react. So that's why I said it last. But you should have as a habit to always do this when you create a component that receives some props. So that's why I saved it for last. I think that sums it up about prop types, I'm not going to go all crazy about prop types. Hopefully you learn something here to get you started with prop types. And actually, I don't think in this application, we don't need to do any deeper checks here, actually. Okay, in the next section, we're going to see how we can persist our state in the session storage. We have almost finished replication, there are some things we can do to optimize it. Because now Yeah, it works. But for example, here, those movies here, we always reload those movies when we visit each site here. And also, when we go back to the start page, we always fetch from the API. And that's what we're going to talk about here. Because in your browser, you have something that's called local storage and session storage. And we're going to utilize the session storage to store the data that we already retrieved. If you open up the panel, and you have something that called application, and inside application, you have the storage. And there you can see the local storage and the session storage. And these here are all the movies that are stored from the application. So you can see it's the movie ID here, and here we have the data for the movie that's stored here. Then we also have the homestead. This is from the other application that is finished, not ours. I just wanted to keep them here to show you how it's going to look when we store this stuff in the session storage, local storage and session storage are quite similar. The big difference is that the local storage persist until you decide to remove it, the session storage only persist over a session. So every time you create a new session, the session storage will get wiped out. And you may wonder, wouldn't it be better to have the local storage for application? Yeah, it would probably, but this page here is based on all the popular movies. So it changes a lot. So that means if we store it in the local storage and never remove it, we always get the same list of movies here. And that's no good. So that's why it's better to store it in the session storage. And also, each individual movie here. Also sharing just because we have a rating, that one has zero rating. Okay. Let's select another one, that one has 7.6. So the rating will change depending on the voting. So there is stuff that can change in each movie also. So that's why I chose the session storage for both of them. But if you want, you can use the local storage instead, the code is going to be the same except that you swap out session storage for local storage when we write the code. In the next video, we're going to learn how to persist the state in the session storage for the homepage. Okay, we're going to learn how to persist the state in the session storage. And we're going to start by creating a little function that we can use to read from the session storage. So go back inside of the code editor, and in the file, let's call helpers dot j s that's the one are provided for you in the store defies we're going to add in a little function at the bottom here in this file. So we export the const is persisted, stayed like this equals, then we have a parameter that's called state name or name, you can name it whatever you want, then I have an arrow function. And then we create a cost that we call session state equals and from the session storage, session storage. We have a method that's called get item. And this is what I talked about before if you want to use the local storage instead, you can just change this one to local storage and it will work you just swap this one out to local storage. Alright, so we invoke The method is called get item, we give it the state name. And this will return the state from the session storage if there's a state, otherwise it will return No. So it will get the item from the session storage with the name that we provide, there would need to return something from this function that we created. So return, and I'm going to do a short circuit here, I checked, if session state. If we have something in this one here, now I have double ampersand and it will return what's the right of the ampersands. Otherwise, it will return this one. And this will be now if it couldn't find this one in the session storage. Let's say that we have something in the session state, it will run what's to the right of the double ampersand so we can return that state. But we can just return it as it is because you can only write to the session storage and to the local storage as a string. So we have to parse it back from a string into JSON. So that's also what we're going to do when we write to the session storage, we're going to first convert it to string but now we have to parse it back and forth, we can do that with JSON capital letters, parse, and then we give it the session stayed like this. And this will parse it back to JSON object and we return it save the file. And this is it for this little function. So let's move inside of the use home fetch hook down below here. Our search an initial use effect hook. In this one, we can check if we have a session state before we retrieve anything from the API. So there are a couple of things we have to consider here. Because we want to check the session storage on the initial render, before we fetch anything from the API. If we have something in the session storage, we retrieve that one instead. And later, we're going to create a hook that also writes to the session storage. And we're not going to write to the session storage if we're in a search. And that means that we also don't want to retrieve anything if we are in a search. So that's why we're going to create an if statement here. Just at the top in this use effect if and we'll have an exclamation mark, and search term. So this means if not search term, then we're going to check the session storage. So we create a new cost, call it session stale equals, and then we also have to import a function that we created in the helpers file, it's up here at the top with the market with helpers, and import is persisted state from dot dot forward slash helpers. So that's our function that we're going to use here. To the right of the equal sign, we call that function is persistent state. And for our homepage, we're going to create a state that is called the home state. So we are hard coding in the string here for this one, you can make it a little bit more elegant if you want to do that. But I have a string here that I call home state. So that's the property that we're going to write to the session storage. And this one should actually be called stayed like this. Then I'm going to nest in another if statement here. You could do this in multiple ways. But I think this one is more readable for this course. So that's why I have a nested if statement here also. So if session state, we check if we have something here, then we're going to set the state and give it the session state. And it's also important that we return because we don't want to do anything else here, because otherwise it will fetch it from API also. And this is all that we need to retrieve something from the session state, we make sure that we don't check the session storage if we're in a search. But if we're not in a search, we check if we have something here. And if we have something in the session storage, we set the state with the form that we retrieved here. And then we return, we return early from this use effect. Otherwise, it will work as before here. We set the state first with the initial state to wipe it out. And then we fetch the movies from the API. All right, save it, just make sure that everything works. And it does. So that's great. I'm also going to wipe out the old session storage here. This one is from react dev tools. So when you delete it, it will create a new one. Right. But we don't actually have something to retrieve yet, we also need to write something to the session storage. So if we go down here below our load more use effect, we're going to create another use effect. And I mark it with right to session storage. And then I have my use effect like this. This one is going to have a dependency rate. And it's going to write to the session storage when the search term seniors and also when the state changes and yet Again, I checked if not search term. Because if we're in a search, we don't want to write that one to the session storage. And this is of course, optional. Also, if you want to, to save the search, you can do that also. But I don't think that's a great way of doing it to have your last active search on the homepage. So that's why. So if not, in a search term, we can set on the session storage. And this is the same as before, if you want to store it in local storage, you change this one to local storage instead.we have a method that's called set item, just as we had the one that's called get item. In this case, we're going to set it the first argument is going to be the name that we wanted to have in the sessions to session storage. And for this one, I chose the name homestead, just as the one as I grabbed up here, really important to have the same name. It's a hard coded string there, then the second argument is going to be what we want to write to the state. And if you remember, I mentioned that we can only write a string to decision storage and to the local storage. So we have to stringify it. And we can do that with JSON, capital letters, dot stringify. And we give it the state like this. And even if we didn't specify these ones first, you can see that it complains that it wants to search term and the state now so this is the linting rules for hooks that is included in create react app. So it's really great to have that one. All right. So that's how we write to the session storage, save the file, go back to the browser. And you can already see when I say the file it that it wrote the whole state here for us. So we have the results here. And we can actually go back to the code and do some console logging. So up here in the search and initial inside the if statement where we grabbed from the session storage, we can console log, grabbing from session storage, like this. And down below here, we can console log grabbing from API and save the file. And then if we go back to the console, you can see grabbing from session storage. And if we reload the page, it works, it grabs from the session storage all the time. And then go back to the application here. And we delete the homestate in the session storage, go back to the console, reload it. And now you can see that we grabbed from the API. So if we load some more movies here, a few of them. And then we reload the page, you can see that we have them here, instantly. And that's because we save it to the session storage. In the next video, we're going to persist the state in the session storage for each individual movie. Okay, one more thing to do with the session storage. And that is to store each individual movie in the session storage. That's what we're going to do back in the code editor. So we're going to be in the use movie fetch. And we only have one use effect in this one. So down at the bottom of that one, we run that fetch movie function. And before we do that, we're going to check if we have something in the session storage just above that one. Just as before, we create a const that we call session state equals. But of course, first we also have to import that function up here. To mark market with helpers, an import is persisted state from dot dot forward slash help us. Yeah, I don't know why I did like this. Okay, to the right of the equal sign here, we got to run is persistent state. And we're going to check for the movie ID. Because each movie is going to be stored in the session state with its own ID. So that will give us null or the actual state. So if session state, if we have a session state, we're going to set the state and give you the session state. And then we're also going to set the loading to false. This one because we setting it to true up here, when we start. That's why we have to set it to false also Otherwise, it will keep on showing the spinner. Okay, and then we make an early return, just as we did before. Otherwise, it will run this function here that fetches the movies from the API, right auto format it and save it. But we're going to create the use effect also for writing to the session storage. Right this session storage then we create our use effect. With an inline IRA function, it's going to have a dependency array. And it's going to change on the movie IDs change and the state change. And these actually won't change because we're just grabbing data one time for each movie. But as I told you many times before, you should specify all the dependencies for each use effect. If there's something that won't work, because you specify them here, you should handle it inside of the use effect. And that will make sure that you have less errors in your application. For this one, we don't need an if statements, we can write to the session storage dot set item, and we're going to give it the name of the movie ID, each movie is going to be stored in the session story with its own ID, that's how we separate them out. Then we have a comma and we give it the state. But just as before, we have to run JSON stringify. State, because we can only write the string to the session storage. All right, save this one and go back to the application. And here, you can see that it already saved the movie here. So here's the movie for that one. So if we check this one out, I think it's down below here, you can see that it will instantly grab that movie. And if we choose not one, here it is zero rights to decision storage. And next time, it will instantly grab it because this one here you can see where the loading spinner on this once, but next time, we don't have to reload it. That's how you utilize the session storage to persist the state in your application. In the next section, I'm going to show you how to deploy this application, it's time to deploy the application. And for this course, I'm going to show you how to deploy it to netlify. I think netlify is a great and very easy way to deploy your react application. So that's why I'm not sponsored in any way by netlify. I just like it. And I know that there's a lot of people that likes it also. So I think netlify is a good choice for this. So the first thing you have to do is to create an account at netlify, it's free. So make sure that you create an account. And that will show you kind of a dashboard here, I have a lot of sites here now. So yours will be empty if you don't have an account already. So make sure to create an account at netlify. We will need it in the next video. So in this video, I'm going to show you how to create a production build of the application that we're going to deploy to netlify. So back into the terminal and create react app is really simple to use. It has a built in command that we can use to build our site. So make sure that you're inside your application folder. And then you run NPM, run build like this. And this will build the application for us. As it says here, it will create an optimized production build for us. So that's great. And it will place it in a folder that's called build. If we move inside our code editor again, we can see that we now have this folder that's called build. And this is a complete site in here. It's the it's the production build of our site, we have to do one small thing here when we're deploying to netlify if we want our routing to work correctly, because for example, I can show you here, this is the site here. If I go to this site and choose a movie, grab this URL, that's the direct URL to the movie, and then paste it in here, you can see that it works now. And that is because I created that little file that we're going to do now. Otherwise it won't work, it will show an error here. And that's because we using in with react router. So that's why we have to have that little file. So back inside of the code editor. And inside a build folder at the root create a new file, the name is going to be underscore redirects like this, it's very important that you name it exactly like this underscore redirects. And then inside of that one, we're going to type in forward slash asterisk, forward slash index dot HTML, space and 200. And this will make sure that the routing will work in our application. So save the file. And now we ready to deploy it on natla phi. So that's what we're going to do in the next video. I'm going to show you two ways in this video how to deploy your site to nullify, and the first one is going to be really easy actually. Because if you log into your account at nullify, and you're at this dashboard side, down below at the bottom, you will have this little sewn here where you can drop your site want to deploy a new site without connecting to get drag and drop your site folder here. And this is really sweet with netlify actually. So if we grab our folder, that's the folder here where the complete application is your working folder with application, you have the folder inside of that one that's called build. So make sure that To grab the build folder that we build in the last video, and just drag and drop it here, you can see that netlify starts to build your site. And I actually didn't have time to finish that sentence before it's published my site. So you have the link here, it will create a randomly generated name, you can change that if you want to do that, click this link. And you can see that your application is up and running. So that's how easy it is to deploy, who would nullify, that's one way of doing it. Another way is to use something that's called the netlify COI. And that's what we're going to do next. So make sure to be inside of your terminal. So of course, you're going to be in the folder where your application is, we've already built our application, otherwise, you have to build it. So NPM, run build, and also add in that little file that I showed you in the last video for the routing to work in nullify, then we're going to install the natla phi COI, I have already installed it, but I can show you again, of course NPM, install netlify dash c ally dash D. So that means that I install it globally. Alright, that installed correctly, I'm going to clear my console. And then we can run nullify deployed like this. And then you're faced with different questions here. So in this case, we're we're going to create and configure a new side. So make sure that you navigate down to that one. And it's waban Fox team, in this case, you will probably also just have one team to choose from. So select that one. And then you can create a site name, if you want to do that. I won't do that now. But you can also change it later. So we'll use the default and just press enter here. And then it asks for the public directory down here. And if you remember, the Publish directory is the build folder. So we type in dot forward slash build and press Enter. And there you have it, but the site isn't actually live yet, because we now have the opportunity to see if our site works. So you have a website draft URL, we can click that one. and here we can try our application to see that it works before we actually go live with it. Right, it seems to be working back to the terminal. And if we read here, we can add the dash dash prod flag if we want to go live with it. So we run nullify deploy dash dash prod and this will make it go live. Yeah, of course, I shouldn't have space, it should be dash dash prod like this. And the public directory is just as before dot forward slash build. And you are provided with a couple of URLs here. So this is the unique deploy URL for this deploy. This isn't actually the live site. So this is the live site here on this link, you can click that one and open it up. But I want to go inside of natla phi and check that is actually here, you can see that is here. So you can click this one and see if it works. And it works. And that's sweet. So that that is actually also quite simple to do it in the terminal like this. So if you change something in your application, you can deploy it very easily without logging into netlify from the browser. So you just type in netlify deploy. And if you know that it works, you can flag it with prod like this. And you can do this every time you change something on your site. Alright, in the next video, I'm going to show you how to deploy with continuous deployment. That means when you change something and push it to GitHub, I'm going to use GitHub for that one is going to deploy it automatically. Okay, we're going to talk about continuous deployment on netlify. Now, and that means that you can have, for example, in this case, I have a repository on GitHub that I'm going to use for this one, I published my site here to get up and I'm going to use this one for continuous deployment. And that means that when I push something to this repository here, netlify will automatically build my site and publish it. So that's really, really neat. Actually, just make sure that you add to Git ignore file to not upload the dot m file. And also just one other thing you have to do, and that is the file that we created in the build folder, you have to move that one inside of the public folder instead, you can see that I have the underscore redirects in the public folder. And this will make sure that this one is included when netlify builds the side. So that's all you have to do and push it to your repository. I'm using GitHub, you could use Bitbucket or some other service if you want to do that. So this is the complete side. Then I'm going to move inside of nullified and I'm at my dashboard. You have something that's called new side from get I'm choosing Get up because that's what I'm using. So it's authorized me here. So you have to log in, then I can search for my name is RM DB version three. So I select that repository. And we're going to build from the master. That's correct. The command is going to be MPM run build. And we the Publish director is the build folder. So that is correct. But we have one more thing to do, because we have an environmental variable for our site. So we have to set that one up also Show Advanced. and here we can create a variable new variable. So you can set the name here and the name is going to be react underscore app underscore API underscore key, just as the one that we had in our application in the dot env. file. Alright, there, we need to give it some value. And here, we can give it the API key to the Movie Database API. So I'm obviously not going to show that for you. So I'm going to paste that one in. And then I'm going to click Deploy site. So make sure that you also paste in your key here, and then click Deploy site. And now we just wait for it, it's going to build the site. So it will take a little bit longer now. And hopefully this will work. And if we want to see the build log, we can also do that by clicking here deploying your site, and it will show us the log. And there you have it, the site is live, it says here, so we're going to try that out. Go back to our dashboard. And here's the side. Click the link, we make sure that it works. And it does. And that is great. Just going to make sure also, that these unique links work if we paste that one in. Yeah, and it works. Sweet, sweet, sweet. This is how you publish on netlify. And this also concludes the main part of this course, I hope you enjoyed it, there are some bonus parts. In the next part, I'm going to show you how to use class components instead of hooks. And then I'm going to show you how to convert this application into TypeScript. And lastly, I'm going to show you how to use the login and vote system for the Movie Database API. We're going to reflect our application into using class components instead of react hooks. I actually don't use class components anymore. And I think a lot of people don't do it. But the chances are that if you get a job as a react developer, you will work with a code base that at least has some class components. So there's a lot of applications out there that still has class components in it. And it's actually not even deprecated from the React libraries. So it's a legit way of creating components in react. So in some sense, it's a matter of preference. I don't think I ever will use them again, actually, because I love hooks. And I always use functional components with hooks. But I want to show you how to do it with class components also. And there's three components that we have to refactor because we have three components with stadium. And that's the search bar to home and the movie. And we're going to start with the search bar. So make sure that you're inside index.js file in the search bar folder. And there will be a lot of errors and warnings here when we remove stuff here now, but we'll fix that as we go along in this video. So first of all, this one is a functional component, we want it to be a class component. And then up here, instead of importing use state use the fact that you use ref, we can import something that's called component like this. And instead of the const here, we delete all of this here. And we create a class that we call search bar just as before the same name, and it extends component. So if we did an important one up here, we had to specify extend react dot component, this is a little shortcut you can do here. So we can remove these ones here. In a class component, you have one class property, that's called state. And that is the only state holder you have. So that's one. So that's one downside with classes. If you use you state and react hooks, you can have as many states as you want to separate them out. Here we only have one. So we have the class property. That's called state. And now you can see that I'm not using the constructor like this. Because we don't need to do that Babel and Webpack will make sure that it will be transpiled down correctly. So we have this class property here. That's called state and it equals an object. We're going to have a property that's called value, and it's an empty string. So that's the value for our input field in the search bar. And then we also got to have a class property that's called timeout. And we set that one to know right, the use effect we can use That one anymore. But we can reuse this logic here for the timer. So I'll remove these ones for now. And in a class component in react, you have something that's called lifecycle methods. And there's three of them that you should know, that's probably the most used once you have one that's called component did mount. And that's the one that's going to trigger initially in the component. And then you have another one that's called component did update, and that's the one that we're going to use now. And then you have the last one that's called component will unmount. And that one is triggered just before the component will unmount. And in that one, you can do some cleanups and stuff like that. But we're going to use to underscore component did update. And you could do this in several ways, you don't actually have to use this lifecycle method to get this to work. But I want to use it here to show you how this lifecycle method works. So component did update like this, this one is going to give us the previous props and the previous state. So I make an underscore prep props, we're not going to use the props, because we don't need to check against the previous props. So market with an underscore just to tell that we won't use that one. And then we have the prep state, the prep state we will use. Alright, so that's the component did update lifecycle method. And this one will trigger on each update on the component. So what do we want to do here, now the state here with value is going to be the text that the user typed in, in the input field, because this is a control component to keep it in the state. So we want to check if this dot State DOT value, it's the value here. And as this is a class, we have to use this. So this dot State DOT value, if that one isn't equal to the prep State DOT value, we want to do something otherwise, we will go into an infinity loop here, and that's no good, we check here, if the value in the state isn't the same as the previous one, then we know that we should do something. All right. And then we have one prop that sent in to this component, and we can destructure that one out. So const, it's called set search term equals this dot props. So we destructure this one out from the props. Because we send in this function here, that's going to trigger when we do a search, then we have a timeout. It's the one here to copy this one, move it inside of there. Instead of const timer, we're going to set this one to this timeout that we created up here. So this doc timeout, is going to equal this one here. And the first thing we also have to do is to clear this timer, so clear timeout, this stop timeout, and this is why I have this appears so that we can access it here and clear it before we do something else. Alright. And inside of this timeout here, we're going to grab our state value. And we can also destructure that one out. So cost value equals this dot state. So we grabbed that property from our state. And instead of the state here, we give it the value like this. So every time we type something in, we're going to set the state and that will update the component, and it will trigger this one, we cleared the current timeout and then we set a new one. And at every 500 milliseconds, we will trigger this search function just as we did before. Then, in the class component, we have a render method. And inside the render method, we can return this logic here, we can grab this one, turn it out and paste it inside a render method like this. And this one, we have to change this one, this dot state value. And also when we set the stage this one is incorrect here, we should specify this dot set state. And our state will look like this we have an object like this URL, we have appropriately this called value. And the value here is going to be the same. And now you can see we don't have any errors in this component. And that's great. If you want you can also destructure this value out up here just before the return statement, cost value equals this dot state like this, and then we can use the value like this instead. Save the component, go back to our application, make sure that you're running the application, then we can try if it works, and it's working. So it works exactly as before, we're just using a class instead now. So this is how we refactor the search bar to a class component instead. In the next video, we're going to refactor the homepage. We refactor the search bar into a class component. And now we're going to refactor the home component. So make sure that you're inside the home.js file. And first, we can remove this hook here, like this, and up here, we're going to import the component and the home function, we create a class called home that extends component like this. And the use on fetch, we're not going to use that one, we're going to copy that logic and use it inside of this component instead. So we have our state equals an object. And I'm going to have a property for this one, that's called movies, that's going to hold the array with all the movies. And I'm going to give it the initial state. And this one, we have that one inside of our hooked, that's called use home fetch. So copy this one. And we can paste it in maybe here, he need she stayed, he need to stayed. Yeah, it shouldn't be a see my column, because this is no big. So we have a comma. And then we're going to have the search term, because now we have everything in the same state. We can't separate them out, then we have is loading more is going to be set to false initially. And we have loading is also going to be set to false. And we'll have the error false. So this is how the structure of a state is going to be. Yeah, I said I did this one is going to be an array, but it's going to be an object. And then we'll have the results, that's going to be an array that holds all the movies. So you can structure it however you want. This is the way I choose to structure it the movies is the data that we get back from the API, and the other ones are the ones that we create ourselves. All right. Then we're going to make some room here and go back to the use home fetch hooked. We have our fetch movies function here, to grab that function. Everything, copy it, go back to the home.js file and paste it in here. Below the state, we have to remove const. That's movies, it's the same here. Here, we have to do something else, because we don't have the state as separate states. Now, to remove these ones. And this doc set stayed, we have our object, we set the error to false. And we set loading to true like this. And here you can see we only changing the properties that we want to change, React will merge the other ones automatically. And this is actually different from how the state works in a functional component with use state. With the use state hook it won't merge the old Stadium, they also have to make sure that you also provided one if you want to keep it. But in this case, we changing the error and the loading here and other ones will stay the same. So this is how it works in class components. All right, we have our movies, this one is going to be the same. The set state is going to be quite different now. First, I'm going to spread out the previous state. And then I gotta have my movies properties. Because inside of this movies property that we created up here, we're going to place everything that's returned from the Movie Database API. And that's the stuff that we have here, I'm actually going to remove the sidebar also. So move this one up inside of the movies object here. So we spread out the previous movies and never have the results. And then we check if the page is greater than one just as before. But here we have to change this one because from the previous state, we also have to go inside the movies property, like this. So prep dot movies dot results. The movies dot results is going to be the same here because this is the new data that we grabbed from the API, so we merge that one. This one is also going to be the same. So this is our set state for the movies and then below we have a coma and then we set loading False. And then inside of the catch, we don't have a set error. So this set stayed. We set the error to true. And we also set the loading to false. Like this, we can remove this set loading here. This is our fetch movies method. That's called a method. Now because we're in a class, then we don't have the use effect here to trigger. So we're going to have a few functions here, we're going to have one that's called handle search. equals, we have the search term, or create an arrow function for this one. And when we search for something, we're going to call this set state parenthesis and we have our state object movies, we're going to set the movies to the initial state just to reset it just as before. And then we also give the state the search term. And as this is a sixth syntax, we don't have to specify it like this, it's enough to just specify search term when the name is the same. Okay, so we set this state and when we have set the search term, and also reset the movies to the initial state, we want to do something when that state has updated. And in a react class on the set state, we have a callback function that we can use that will trigger when the new state is set. So we have a coma, and I create an inline arrow function here and go on another row here. So then we want to fetch the movies, this dot, that's movies. And we give it the one because we're fetching from page one, this dot stayed. And we give it a search term, like that. And we can actually remove those curly brackets, I don't think we need them. If we don't want to have them, it's up to you to decide. All right, so that's the search, then we have the handle handle load more function. And it's only going to be an arrow function like this. And I'm going to type it in on another row, this dot fetch movies. And from this dot State DOT movies, we have the page. And we're going to add one to the page, because now we're grabbing the next page. And then we give it the start state the search term. So we also provide a search term if we're in a search, right? We can actually auto format it yet, because there's some arrows down below here. So we're going to create a random method. And then we're going to move this one this logic here, inside of the random method, like this. And then we have a few things to correct here. So first, I want to destructure out some stuff from the state. So up here, as the first line in the render method, I have a const. I destructuring. out the search term movies, loading and error equals this dot state. All right, so that will fix a few things. Here, we have to change stayed, because it's going to be from the movies dot results. And I do that on all three of these movies. And instead of set search term on the search bar here for that Prop, we're going to give it this dot handle search. And here instead of state, we're also going to map through the movies dot results. Down below here, we change state. The movies on this callback here is going to be this dot handle load more instead. And now we can auto format it. And hopefully we won't have an error. But there's one more thing that we have to do. Because it won't fetch anything yet. Yeah, of course, I have to have this dot set state. And I haven't imported API either. So go back to the US home fetch. Grab this one up here, copy and go to the home. We can paste it in here. And this will get rid of all the errors, but we're not actually fetching anything. Now, if we save this one, go back to the application. You You can see that it's, it's empty here, because we won't we don't trigger on the thing, we need to have a lifecycle method to trigger when this component mount. And we have a lifecycle method built in for that. It's called component did mount. So we call that one and inside, we're simply going to invoke this dot fetch movies. And we give it a one, because we want to grab the first page or format it and save it, go back to the application. And now you can see we have our data and our movies here. And hopefully, everything works as it should. Yeah, it works. So that's how you do it. And yet again, the app will look exactly the same here, we have the same functionality in the application itself. But we have refactored the homepage, to use the class component instead. And as you can see, I think there's a lot more code here. And I think it's actually not that easy to separate out things. So that's why I prefer to use functional component and the use state hook can use effect instead. I don't really like this way of doing it anymore, especially with the state because you have to nest a lot of stuff here. As you only have one state, it's much easier when you can separate them out into different states as you can with the use state hook. Alright, just one more thing to do in this section. And that is to refactor the move a component to use a class component instead. And that's exactly what we're going to do in the next video. We're almost finished with a refactoring into class components, we only have the movie page left to do. And we're going to do that right now. So go back inside of the code editor and the inside a movie.js file. And for this one, we're actually going to do a little special thing here. And that's because we are using this hook here, use params. That's from react router, version six. And there's actually no good way of grabbing the params in a class component with react router, they have completely removed that functionality. And they do not support that for class components. That's why I'm going to do a little trick down below here at the bottom, just above where we export this one here, we're going to create the functional component for this one const. movie with params, like this, and then it's gonna take in some props, we have an arrow function, actually going to remove the sidebar again. And then we have our movie component that we have up here. So this one is going to spread all the props that this component receives that way, we can have more props, if we want to do that. So we just pass them along to the movie component. Then I'm going to create a prop that's called params. And inside here, I invoke use params, like this. And then instead of exporting the movie itself, I'm going to export movie with params. So what I'm doing here is creating a wrapper component that will show the movie class component and also provide it with the params for us. So that's the best way I found of doing this actually, there may be some other solutions also. But I think this is actually kind of neat, because you can do it on one roll like this, before you have something that's called with router that you can wrap your component with. But that's actually not provided in the React router Dom or in the React router library anymore. So that's why I have to do it like this. Alright. So let's reflect to this one, we're going to remove this hook here. And we can also grab from the use movie fetch hooked, we can grab the API import. And I'm going to paste that in the movie up here somewhere, maybe there. And we're not going to use that hook anymore. And of course, we have to rename this one also. And up here, we're going to import component just as before, and we rename this one we create a class class movie extends component. This one, we can remove that one also. And we can actually create a render method right now and move this logic inside of that one. Something like this. All right, now we have some serious refactoring to do here. So first, we're going to create our state. Whoever class property state it's an object movie. I'm going to set that one to an empty object to start with. Then we'll set Loading to true and error to false, like this. All right, that is the modal formatting there also, then from the use movie fetch hook, I'm going to copy this fetch movie function like this. For this one, I'm not going to implement the session storage. So I'm just copying this one here. And I didn't do that in the home component either. Right pasted in here in the mover component, we remove the const from fetch movie. Let's just before we have to refactor this one, this one becomes this set stayed parenthesis and we have our object error is going to be false. And loading is going to be true like this. And then we can also destructure out or or Prop, because we're sending that in with that special little component that are created down here. So now we have access to a prop, that's called params. So destructor that one out, because we're going to need the movie Id like this equals this dot props, dot params. And that will grab that one for us. All right, these ones are going to be the same. This one also set state we have to change this one, this one also this dot set state, and the state is going to be movie, we have that property, it's an object. So we move these ones up inside of that object. And then we have a coma. And we set the loading property to false like that. That should be if we're not one, we're going to remove the set loading. And here, change the set error to this dot set state. parenthesis and object error. True and loading the false. All right. And I think that's it for that function. And then we're going to have a lifecycle method also, for this one, the component did mount we're going to do something when the component mount, and the only thing we're going to do is to invoke this dot fetch movie. And then down below in the render function. We can destructure out from our state const. We have our movie. We have the loading, we have the error. And that's it. Then we grab them from this stuff stayed. And hopefully, it will work here now. Yeah, I think that's fine. There's a more formatting. And let's see if it works. We save the file, go back to the application. is grabbing from the session storage? No, I think. Yeah, it works. So that's sweet. We have successfully refactored this application into something that what I think is a worse application because we use in classes. Now, I wouldn't do it like this, I would keep the functional components and the state with hooks, and the use effect and the use state stuff that we use in the application. But it's up to you to decide that. But hopefully this gave you an idea on how class components works in react, and to keep state in class components. And the lifecycle methods. There's more lifecycle methods, but I won't go into them here because I'm not using them in this application. So that's why all right, in the next bonus section, I'm going to talk about TypeScript. And we're going to refactor our application into TypeScript. Welcome to this bonus section, where we're going to reflect your application into using TypeScript. And TypeScript itself is quite a large topic. So we will only scratched the surface actually. But hopefully, that's going to be enough to give you a basic understanding of how TypeScript work and especially with react. So TypeScript is an extension of JavaScript. And it adds types to JavaScript. So that's great, because JavaScript is actually quite a loose language where you can do whatever you want, and it still works. So it can be a little bit messy if you're in a large application. So TypeScript will transpile down to JavaScript in there. And so that's why, as they say here, all valid JavaScript code is also TypeScript code. So you can decide how much you want to type stuff and how strict you want to be with TypeScript. And TypeScript is gaining a lot more ground. And it's almost a standard today, when you create something from scratch. A lot of applications, of course, don't use TypeScript, as they are And there's a lot of code base out there that hasn't been refactored. And you probably shouldn't do it for all of the applications either. But TypeScript is great if you have quite a large application, and you want to keep track on types. And it's really great also, because it's kind of like to have a second coder beside you, that tells you what you do wrong. Meanwhile, your code. So it's a great way to write a lot more error, less code. I think that's one of the great things with TypeScript because you have a really powerful IntelliSense with TypeScript, and it will tell you if you do something wrong. All right, that was a really short introduction to TypeScript. In the next video, we're going to set up a project and start refactoring our application into using TypeScript. Alright, let's start refactoring our application into using TypeScript. And I'm actually going to create a complete new application with create react app. And that's because you can also create an application with TypeScript support, and it gives you some defaults and setup that we can use. So we don't have to do that ourselves. If we look here, with create react app, we can flag it with template and TypeScript. And that will create our application with TypeScript support. So that's what we're going to do first. So make sure that you're inside a folder where you can create a new project, and then go inside a terminal. And that's going to show you this also. And then we type in MP x, create dash react dash app. And then we name our application, React dash or IMDb dash, Ts. And I think you also must have only lowercase letters in the naming. Then we flag it with template type scripts, like this. And we press enter, and we wait for it. Alright, that's the bootstrapping of the application itself. So let's navigate inside of that folder, CD, React dash or IMDb dash Ts. And you can see that we have some different files here. So that's great. Well, one more thing that we need to do before we can start coding, and that is to install our dependencies in this TypeScript application, also, to have the style components. And we also have the React router. So let's start with the style components, MPM, I style dash components. And as this is a TypeScript project, we also need the types for style components. And if a library won't provide you with types, by default, you can usually find the types in AD types forward slash, and then you can type in the name of the library that you're installing. So in this case, it's going to be ad types, forward slash styled dash components. And we'll press enter. Alright, so that installed correctly. And then we also need to install the React router, the next version, the version six and the types for that one. So MPM I, if you remember, we also install a library that's called history, that one is used for react router, history, space, and then we have the React dash router dash dome at next, just as before we grab in your next version, and that is the version six, then we have a space. And we're going to grab the types for this one also. So add types, or a slash, React dash router, dash dome, and we press enter. Alright, so that's the dependencies we need for this product. But there's one more thing we have to do, because now we have bootstrap this new TypeScript application. But we want our old files inside of that one. So if we look here, here's the file for this project. I'm also showing the hidden files here. So we have the Git and Git ignore. So now inside of this src folder, here, we have all the TypeScript files. But we want our files instead. And therefore, we can actually remove some of those files here, we don't need to set up tests, we don't need a service worker, we don't need a logo index CSS app, we can still keep the index actually, because that one is already set up for us. The other ones we can delete. So just keep the index TSX and the React app and the.ts. And remove the files. Like this. And then from our finished application, I'm using the hooked version now. So not the class based one, use the hook based one. And we're going to grab from the src folder, the API app components, config, global style helpers, hooks, images, everything except the index.js file, copy these ones, and go inside the src folder of the newly bootstrapped TypeScript project and paste them in. And the application won't work now because we have to do a lot of stuff here to get it to work, but that's fine. There's one more thing we have to do also analysis to copy your dot m file like this or if it says that you can't copy it because it's hidden, you can create a new dot m file and set up your environmental variable for the Movie Database API there again, so just copy. So just copy that code from your other m file and create a new one and paste it in. Because it's really important, because we need that one to be able to fetch data from the Movie Database API, we have copied all the files that we need for our TypeScript project. And that means that we can close the other project and we're going to be in the new project from here on. In the next video, we're going to convert this base files here, the API, app config, global style helpers, and stuff like that into TypeScript. And then we'll move on with the components and the home and the movie page. Okay, before we do anything, I have to correct the mistake I did in the last video. And that is the dot m file, it shouldn't be in the src folder, it should be in the root folder. So move this one out to the root folder of your project. And make sure that it's outside the src folder, otherwise it won't work, we can go inside of our terminal and try to start a project up, we will get an error or probably a lot of them. As you can see, because we haven't actually converted anything into TypeScript yet. So that's why. So first in the index dot TSX file, we have to do some cleanup, we're going to remove the index dot CSS, we're going to remove the ServiceWorker like this, and save the file. And then we have something that's called react dash app, dash m.ts. And this is the references for the types for react scripts. So we'll leave this alone. And also we have something here that you can see that's called Ts config dot JSON. And this is the the config you can set up for TypeScript. So this is why I wanted to bootstrap the application with create react app, because they already set this one up for us. So they have a lot of great defaults here, that set up for us. And if there's something special you want to configure for TypeScript, you can do it in this file. So you can add them here, it's actually a lot you can do to set it up just as you like it. But we're not going to do that we're going to use the defaults that create react app provides for us. So we cleaned up the index dot TSX file. And we're going to refactor all of the other files here in this video. So we can start with the api.js file, we have to rename it, we're actually going to rename all of these files. Because they they should be called.ts. So that it indicates that it's a TypeScript file, so we renamed them to.ts. Instead, all of these files is going to be.ts. The app is actually going to be dot TSX. And that's because we using JSX, inside of that one, otherwise, it won't work. So every time you use JSX, make sure that you have the file extension dot TSX. Otherwise, type TypeScript will fail. Alright. So that's the renaming of the files. And then we can start in the api.ts file. And for this one, we're actually going to create some types because we returning data from the API, and we need to type that data. But first, we can start to actually type the functions themself. So here, you can see that it complains, no parameter search term implicitly has an any type. And that's because we haven't set any type. This one, if we want to specify a type on this parameter, we use a colon. And then we specify it as a string. And you can see that it stops complaining now. And that's great. And the page, this one is actually going to be a number. So we specify it as a number. So that's how you specify parameters, you have a lot of types you can specify for them. And then if you want to specify the return type on the function, you can see that TypeScript actually won't complain out because the default setup don't force us to specify a return type. But I want to show you how we can do that. And in this case, it's a promise that we return because we're fetching from the API and we get back a promise. So if we want to type the return type to be a promise, we have a colon here. And then we specify it as a promise. But the promise needs something else you can see here represents the completion of another, blah, blah, blah, generic type promise requires one type argument. And when you send in a type argument type like this, you do it inside of angle brackets, and we're going to specify that this is going to be the type of a new type that we're going to create. That's called movies. We haven't created this one yet. So of course, it complains. So we're going to do that in a second. We're only going to specify this const here also, the endpoint that we create here. We have a colon and then I type it as a string. So that's how we typed this function. And now we're going to create a type. That's called movies. And the actual data that we get back from the API is, it has a lot of properties. So I'm only going to type the properties that I'm actually using inside of the application. So we can mark it with types here. And then I got to export this type, because I'm going to use it in another file. So that's great. You can also export the types, you don't have to specify them all over the place, you can specify them in one file, and you can export them and import them wherever you need them. So export type movies like this. And from the API, we get the page. And that one is going to be a number, you could also create something that's called an interface. And then you do it like this. They are almost the same today, in the new versions of TypeScript before there was some major differences. Actually, the recommendation is to use type in a react application. So we're going to do that. So export type movies and then equals and the object, then we have the results. And the results is actually going to be all the movies, we're going to specify another type, that's called a movie, that's a singular movie. And this one is going to be an array. So it's going to be an array of the movie type. So this is how we specified our array. So if you had an array, for example, with only numbers, you can specify it like this. But we are going to create another type object, that's called movie. And we're going to do that in a second. But first, we're also going to type the total pages, it's going to be number. And then we have the total results, that one is also going to be a number. Do some more formatting. And you can see in the type of bacteria that it uses see my colon and not coma as in a regular JavaScript object. I actually think it will work with coma also. But the formatting is set up, so that it uses see my column, but you can see that it, it seems to be working. But when I want to format it, yeah, it will return to the semi colons. Okay. All right. So we need to specify each specific movie here. So we create another type that I export, export type movie equals an object. And here we have a few more of the different properties. So we have the backdrop underscore path is going to be a string, the ID is going to be a number, the original underscore title is going to be a string, the over view is going to be a string, it's easy to have a typo here. So be careful. popularity is going to be a number, poster underscore path is going to be a string, the title is going to be a string, the vote underscore average is going to be a number. And the vote underscore count is going to be a number, the budget is also going to be a number. And then we have the run time, it's the number also and and the last one is the revenue. And it's also going to be a number. So that's the type of object for a singular movie. And now you can see that it won't complain here, because we using that one and telling the results is an array of the type movie. So each element in the array is going to be an object of this type. So that's how we specified it now. All right, and you can see that it won't complain here now, because we using this type here, the movies, so that's fine. Then we move on to the fetch movie, the singular fetch. For each movie, we have this parameter here. So we have to use parentheses. When we type this, the movie ID is going to be a number. And the return type is going to be a promise again. And this time, it's the movie, we already created this one because it's a single movie. So we have this object here. So that's great. And we can also specify the endpoint, you can see that it won't complain because the default setup won't force us to specify everything. But it's always a great ID to specify what type you return in the context. All right. So that's the fetch movie. And you can see also bonus material for login. We're not going to type this one. So I'm going to stop here for the basic fetch functions here. So fetch credits We have the movie ID, that one is going to be a number, like so. And it will also return a promise that we create a type that called credits. But before we do that, we can also specify the credits endpoint as a string. All right, then we go up here, again, just below the type movies, we're going to export the type that's called credits, it's always a great idea to export the types because you never know when you need them. That way, you make sure that you can access them from anywhere in your application, the ID is going to be a number, the cast, we're actually going to create a new cast object for that one. So it's going to be an array with an object that we specify as a cast. And we're going to do that in a second, we have the crew, and it's also going to be a new type object. So an array of crew like this. So up here, we export the type to cast equals, we have the character is going to be a string, the credit underscore ID is going to be a string, the name is going to be a string. And a profile underscore path is also going to be a string. If you want to type these in one row, instead of typing them out, when all of them going to be a string, you can do it like this. You have a square bracket, and then you have the property, the property is going to be a string. And then the type is going to be a string like this. And this will also work. But I think it's better to be more explicit and type all of them like this, then we have the crew. So export type, crew equals object job is going to be a string name is also going to be a string, and the credit underscore ID is going to be a number or to format it and save it. And hopefully this will work, you can see that it will, it will give us some arrows here now because I won't type this one here. Or is it only Yeah, I can actually just type this one. So we don't have an error, the request token is going to be a string. The username is also going to be a string. And the password is also going to be a string some more formatting, and then we have them on the wrong row. So that will get rid of the arrows. But we won't focus on these below the bonus material, all of these ones here. So that's what we're doing. Alright, save the file. So that's the api.ts, then we'll have our app dot TSX file. You can see here now that it complains, because we don't have the types for this one. And that's because we're using the next version. So in this case, I'm just gonna ignore it, because I know it will work. So when you ignore something with TypeScript, you can do that by command and n at Ts dash ignore. And that will get rid of that error. So we have to do this for now, before it is officially released, then they will provide the types for it. And then we don't have to do it like this. And the only thing we have to do more is to specify our react component. So this is a functional component. And if we do a colon, and react.fc, we have that built into react. So we have that type for a functional component. So this is everything we have to do to specify this as a react functional component. Alright, save the file. Then we have the config.ts file. And the only thing we have to do here, if we want is to specify those strings, because all of them is strings. This one can be undefined also. So yeah, well, we can do it, API URL colon string, this one colon string. And if it can have more than one value, we can have this pipe. And we specify it as undefined also, because you can see if I remove this one here, it complains because it tells us that type string, undefined is not assignable to type string, because we saying that it can only be a string, but it can actually also be undefined. So TypeScript tells us that Yeah, you're doing something wrong here. So this one could also be undefined, so you should do something about it. So that's what we're doing here. Pipe undefined, like this, and it will be happy and all of the other ones will be strings here. So I'm just going to do it quite fast. string, string string Spring lists one here, a string and this string and the last one a string. Right, save the file. That's the config. And then we have the global style, we don't need to do anything inside of here, this is a start component. So it's fine like it is now, the helpers.ts here, we're going to start this ones up also. So here we have this time puram. So we create parenthesis. And this one is going to be a number. But the return type of the function itself is going to be a string. So we type it like this, and ours is going to be a number. And the means is also going to be a number. So that's it for that function, then we have to convert money, parenthesis, it's going to be a number, and it's also going to return a string. And this one is a special one. So you can see that this format here. The type is actually this one here into into DOT number format, international number format. So copy this one. And we can actually specify this as a type also for it. Like so. Then the last one inside of this file, is the state name. This one is going to be a string. Jason, of course, has an Annie type as a return type, we can specify Annie, it shouldn't actually complain here. Yeah, and that's because this is named the wrong way. Here it should be session state. So that's why. So JSON dot parse, has an any type. So that's why we have to specify it as Annie, you should avoid specify anything as Annie, because you remove all the type checking here when you specify it as any, because you're saying that it can be of any type. So always make it a habit to not use any if you can do only use it in specific case like this one, because this one will return. And that's why we have to specify it as an ID. And that's it for these files. Here, we can start up our application to see that it works NPM start. And it seems to be working. So that's sweet. In the next video, we're going to refactor the homepage to use TypeScript and also the components that we use on the home page itself. Alright, let's continue to refactor the application into TypeScript and move inside of the component home dot j s, we're going to rename this file to Ts. And also I can tell you that if we look here in the terminal, I don't run my dev environment, because when you change the file names, it will break. So you'll have to restore it again. So that's why I'm going to start it up later. But if some stuff don't work, because I've changed some file name, or things like that, try to break it and start up your dev environment again. rights are renamed the home Ts like this. And then inside of that file, the only thing we have to do here is to specify this as a react dot functional component react.fc. And you can see there actually made a mistake here, this one shouldn't be Ts, then it won't work because we have gay sex here. So this one should be dot TSX. So change that one to home dot TSX. And then it will work hopefully, here we have some stuff that it complains about. And that is because we haven't typed anything yet in our hooks that fetches that data. So if we move inside of the hooks, and use home fetch, first we rename this file to.ts. Here, we're not using any Deus Ex, so we can name it to.ts. Okay, the first thing we have to do here is to import the type movie. And we do this inside of curly brackets, because this is not the default export. And then it complains here on the page, this one is going to be a number and a search term, it actually interprets this one as a string, because we set it as a default string here. So we don't have to specify anything more here. But it complains about the state. And that is because if we hover over this use state, you can see that results is set to never it doesn't know what type this will be. That's why we can specify it as movie and an array. So we're telling it that we're setting this to an empty array, but it should interpret it as a movie array. So that's why we imported it up here. And that's why we also get the types on the state correctly here. So in the home, you can see that the warnings has disappeared because now it knows all these types because it interpreted from this hook here as we telling it that this state is Gonna be of this type. And then it follows along inside of this file, that's super great. Say the home also, then we're going to refactor the components that we're using for the home component. So we have the bottom. So in the index.js file, that one is going to be renamed to index dot TSX. And the style file is going to be renamed to.ts. Because we're not using any JSX inside of that one. And for a style file, we don't need to do anything there. But in the index dot TSX file, we have to do some stuff, because now we have some props here. And we're also going to remove prop types. We don't need that one when we're in TypeScript. So remove everything that has to do with the prop types, then here are going to specify types. And I created a type that are called props. You can call it whatever you want, it doesn't need to be called props. So we have the text prop here, text, that's going to be a string. And then we have the callback, then I'm going to type this very loosely, it's going to be a function that returns nothing. So when we specify to void because void means that it won't return anything. So this is a click callback. All right, but it still complains, we have created a prop object. So we have to specify the button as a react dot functional component react.fc. And if we want to specify our props, we can do that inside of angle brackets. And then we use our props object. And then you can see that it works. It knows the types now of these props, you can see if we hover over them, you can see the types. Right, so that's it for the bottom. Now we have the grid, the grid styles, we're going to rename that one to grid styles.ts. And the index is going to be renamed to dot TSX. Yet again, for the stars, we don't have to do anything here because we're not sending in any props to the style components. In the index dot TSX file, we have to do some stuff, though. So we remove the prop types. And also make sure to remove them at the bottom here, like this. Then I specified types. And I create a type props an object and we have the header. We set up one as a string, the children, we don't need to type that one because that's built in to react. So we specify the grid to react.fc. We have angle brackets, and we give it the props object. This is it for a grid. Move on to the header header dots header styles is going to be.ts like this, and the index is going to be dot TSX. Nothing to do in the stars file. But in the index dot TSX. We can do some stuff. We only have to specify this as a react.fc. That's everything for the header. All right, then we have the hero image here we image dot Stiles is going to be renamed to.ts. And this index.js is going to be renamed to dot TSX. Instead, in this star component, we actually have to do something because we have this prop here and we haven't thought that one up here. I mark it as types. I create a type props equals, we have the image and this is going to be the URL so it's a string. And when you type a style component, you do it here just after the components you choose to create. We have the angle brackets again, and we send in the props like this. There you have it, that's the styles. Then we have the index dot TSX remove the prop types. Just as before we specify our types, type props equals an object image is going to be a string title is going to be a string and the text is also going to be a string we specify it as a react.fc. We have the angle brackets and send in the props. And this should be it for this component save it move on. Moving for moving football These are for the movie page we have the search for the index.js is going to be renamed to index dot TSX. The search for styles is going to be.ts we don't have to do anything In this style file, but in the index dot TSX, we remove the prop types. everything that has to do with prop types. Then we have the types. I create a type props equals an object. And then we have the set search term and this one is going to be a callback. And how do we type this one? Well, this has implicitly an Annie type. But if we go back to the home, and see where we have the search bar, you can see here, and here, we actually get that type. So when you hover over stuff, we get the type. And that's really good, because we can actually just copy this one, copy and move back to the index dot TSX file in the search bar. And then we paste it in here. So this is the React dot dispatch. And inside here where the React dot set state actions, so this is the type for the setter for the use state. And it's a string in this case, if it was a Boolean, it would have said Boolean here instead of something. First, we have a react dot dispatch. And we specify the type that is, is that it is a state action. And we specify that one that it's a string that we're going to set this state with. So the search bar is going to be a react.fc component, we have the angle brackets, and we give it the props. And that's it for the search bar, move on to the spinner, spinner Stiles is going to be renamed.ts. And the index is going to be renamed to dot TSX. The Spinner we don't have any props for that one. And this one is actually nothing to do because it just exports the star component. And the last one is going to be the thumb. So we renamed the index to dot TSX. And the thumb styles is going to be.ts. So nothing to do with the styles but in the index dot TSX remove the prop types like this. And then we specify types, type props, equals, the image is going to be a string because it's the URL to the image, then we have the movie ID, that one is going to be a number and the clickable is going to be a Boolean. And then specify this as react.fc. And we give it the props. And this should be it save the component. And I think we should be able to start up our application. So we run NPM start. Let's see if we have any errors. It actually seems to be working. Alright, that's great. I didn't have any typos or stuff like that. That always makes me happy when it works the first time. Okay, so that's the home component. In the next video, we're going to convert the movie page and all the components for that page into TypeScript. So we're going to refactor to move a component and also actually the not found component. So we're going to start with a not found this one is a small component, so we just specify this as a react of FC. And that will be that one. And we also have to rename it to dot TSX. And save the file. And now if we look in the console, you can see that it gives an error, that's because we renamed that one. And that's what I meant before break it, and you have to restore it, otherwise, it won't work usually. Okay, so let's move inside of the movie.js file, rename it to move it off TSX. And then we're going to refactor some stuff here. So we specify it as react.fc. We don't have any props for this one. And you can see that it complains now because it can't interpret the types here. So we're going to fix that in the hook. So go inside the hooks and use movie fetch, we renamed this one to.ts. And we also need to import some stuff here, we need the movie type object, we need a cast and crew. That's the one that we created all errors, we import a mural. So now I'm going to specify some types. Export type, movie state, and the movie state is going to be the movie. But as I'm also creating these properties, myself, the actors and the directors, I have to add these ones, so we can actually merge them together to one type. So we use the ampersand and then we have the object The actors is going to be an array of cast, this and the directors is going to be an array of crew. And that will create a type object with the movie. And then we merge in the actress and type domestic an array of cast. And then we have the directors and we type them as an array of crew. Right? The movie ID, it complains, here, we have to specify the types. It was specified as a number. And the use state here, it doesn't know what state is this actually. So we're going to specify the state, we have the angle brackets, and then we can give it the movie state. And then it will know that this state will have this type. But it complains now, and that is because we're setting it to an empty object. And it doesn't like that, because we say that it can only be a movie state. So we could do it like this, if we want to tell it that it can also be an empty object. Or we can do as we did before, we say as movie stayed, like so. And it won't complain anymore. So that's everything we have to do, I think the movie ID okay. Yeah, we also have to make this a string because this persistent state function is taking in a string. And this is actually a number enough. So you can see how great it is with TypeScript, because it's telling us when we're doing something wrong, so we convert this one to a string with a built in function like this. And then I bet it's the same here yeah.to string, like so. And this will hopefully be it. Back inside a movie dot TSX file. Yeah, and this is because we get a string back from the API. And now it wants a number. So we can convert this to a number. And there are smoother ways of doing this. So you don't have to convert it like this. But I think it's a great practice in TypeScript. So that's why I did it this way. So we can convert it because TypeScript will complain if we send in the wrong type. But of course, we could be more consistent and refactor some stuff in the use movie set and also in the API file, to specify the correct type from the beginning. With course in the API here, you can see that the movie ID is a number, we could specify this as a string, instead, we can actually do that. So we make this a string. Or we specify this as a number, this one should be a string. And we save it go back to the movie. And now it should work. Yeah. So that's probably the way to do it instead. So you don't have to do all this converting. And now we have to refactor the components that we use for the movie page also. So let's begin with actors, right, the dot styles is going to be active.stars.ts. And index is going to be dot TSX. We don't have any props in the styles. So we're only going to be in the index dot TSX. Remove the prop types just as before. And then we have the types. types, I created type props equals an object, we have the name is going to be a string, the character is going to be a string, the image URL is going to be a string also, we specify this so react.fc. And I give it to props. Just as before, save the file, then we're going to be in the breadcrumbs. So rename this one also.ts. And the index is going to be dot TSX. Same goes with the stars. We don't have to do anything but in the index dot TSX. Remove the prop types. A lot of repetitive stuff here, but that's great when you learn things. As I told you before, I specified a types type of props equals an object. We have the movie, that's the URL, so it's a string. And then this one is going to be a rec.fc and where the angle brackets and give it to props. Yeah, I actually named it movie title. That's what it should say. Right, that's the breadcrumb. Then we have the movie info renamed the index.js to index dot TSX and the movie info tiles is going to be renamed to.ts. And the story in the stars because this one was sending in some props to up here, a market with types created type props, equals, we have the backdrop, and is going to be a string. Just as before, we have the angle brackets here on the component that we crave, and we send in the props. Don't know why it's still red. Yeah, that's because this one should be named animated movie info like this. So yet again, you see TypeScript is great, because it will warn us, if we don't do stuff the right way, it will warn us save it. Because I didn't see this actually, when I created it before in the course, I forgot to name this one. And I didn't see a warning. But now TypeScript warns me about this, save the file, and go inside the index dot TSX file like this, we remove the prop types. And we're going to have some types for this one. For this one, I'm going to import the movie state from dot dot forward slash dot dot forward slash hooks, and use movie fetch. Like so. And then I also going to specify a type props equal an object, and we have the movie, and the movie is going to be the movie state type. So you can see here I import the types, I don't have to specify them again. I mean, if you really love structure, you can create specific files for your types and have them inside of those files. All right, movie info, it's going to be a react.fc are going to give it to props, like so. Alright, then it complains here, this one shouldn't be here. And compliance. Again, I did a mistake here. And you see TypeScript is great. It tells me that this mistake Yeah. And that's because I'm not providing a movie ID for this one, because we shouldn't be able to click it. So go back inside of the thumb. And this one, movie ID should be set to optional, you can set an optional prop with a question mark like this, save the file, go back. And you can see that the warning disappeared from the movie info. Alright, save that file. And we'll have one more component to go. That's the movie info bar, rename this to dot TSX. And the styles.ts, we don't have to do anything with the styles. And inside the index, we remove the prop types like this. And then we specify the types. So I have a type props. An obit time is going to be a number, the budget is also going to be a number and the revenue is going to be a number. And then we specify this as the rec FC, we have the angle brackets and give it to props, we auto format it. And it should hopefully work, save the file. And this my friend should be it actually we have successfully, hopefully, refactor this one into TypeScript. So let's make sure that it works. Go inside the terminal and run NPM start. And it works. super great. There you have it, you have a TypeScript application now. And everything works as it should. No arrows anywhere. Sweet. There is the TypeScript part. And in the next part, I'm going to show you some extra stuff that the Movie Database can do. And that is a neat little login system. And then you can vote on the movies. We've reached the last section of this course. So first, congrats to you because we've come a long way in this course. And I hope you've learned something about react. In this part of the course, I'm going to show you how to create a login for the Movie Database API from our application, and you will be able to vote on the different movies. So first, I just want to show you on developers dot the movie db.org what we're going to use to make the login work. So down here where it says movies, I clicked on this one, you can see the complete API for the movies. And they have one here, that's a post that's called rate movies. So this is the one that I clicked on here. And by posting to this URL here, we can rate the movies and we have to provide our API key and we Also to provide a session ID. So that's where we do the login. And the login is, I think, somewhere. People search, where do they have a authentication, they have a lot of stuff here. And first you have to create a request token. And then we create a session. So we get a session IDs. So there's two steps you have to do to be able to log in. And they also recommend you to actually reroute to the Movie Database for making the login. But it also provided with a solution here that we don't actually recommend where you can log in from your own site without leaving that application or the site. So that's the one I'm going to use here. And the reason for this bonus chapter in the course is actually that I want to show you how to create a global context and store the user the logged in user in that global context. That's the main part that I want to show you. And also, I got a lot of requests to show how to make a login form and be able to vote on the movies. There is one thing though, that's not going to work with this solution. Because it's not a fully solution. Really, in this case, you have to use your login from the movie database to be able to log in. So we won't be able to create a new users and stuff like that. And the best thing would probably be to build your own API, your own back end somehow to have your users log in there and save data so that you can save all the stuff about the user. So there's a lot of different approaches. And this is absolutely not a fully login system and voting system. I just want to show you some small tips and tricks here to get you started if you want to create your own fully functional logging system, and stuff like that, Okay, so let's get to it. I'm just going to show you the code shortly here, before we move on in the api.js file. I have created these functions for us here down below this comment to your bonus material below for login, I have a function that called GET request token so that that will obviously get the request token from the API. And then I have this one that's called authenticate. And I did some comments here also. So first, we have to authenticate the request token that we get from this one. And then we have to get the session ID with a request token. So there's actually three steps and not to order them because we have to get the request token first. And then we authenticate that request token. And then we get the session ID and then we are logged in. And then I have this function down below here. That's called rate movie. And this one will send a rating score to the Movie Database API, and hopefully return an object that says that we were successful. So that's what we're going to be using in this part of the tutorial. So let's get started. In the next video, we're going to create a global context and a global state that we can use to store the user in. Alright, let's start by creating a context for our application. And we are touching on China have advanced stuff now in react. So don't feel bad if you don't understand all of this stuff the first time. All right inside the src folder, we're going to create a new file that we call context, dot j s. all lowercase letters seem to be in the root of the SRC, not in the components or anything like that, in the root of this are See, I can close this one here. So we have the context.js file, and inside of that one, we're going to import react, comma and the use state that we imported from react, then I'm going to create something that's called a context in react. And when we create a context, we are creating something that will make it possible for us to provide our application with something in this context that we want to use down in the component tree in the application. In this case, it's going to be estate value and a setter that we're going to use. So the context can be any value that you want to provide down to your application. But it's really, really handy if we want to have a state and a setter that we want to be able to access from anywhere in the application. So I'm going to export this one because we have to import the context in the component where we want to use it. So export const, I call it context. With capital C, you can call it whatever you want. It doesn't need to be named context. And from react.we have something that's called create context. And I call this one. You could also of course, imported up here, like this. We can do that instead. If you feel that that is better. I don't know really. All right. Then I'm going to create something that's called a provider. The provider is going to wrap our application and make sure that we provide this value to our application so we can decide where we want to wrap this provider in our application. In our case, we're going to wrap it in the app component later so that we can The value to our complete application. So we wrap it high up in the hierarchy, so that the complete application and all the components will have access to this value. So I created a const, I call this component use a provider, I destructure out the children's, because we're going to use this component to wrap our application. So that means that the children is going to be the app. In this case, I have a fat arrow. And then I'm going to create a state const. State Set state just as we did before, I call the use state hook. And I can give it the value of undefined as initial value. Right, that's our state's we creating this one in the use of provider, then we want to provide this one to our application. So I'm going to return from the context we created up here. context, that's a component, we have something that's called a provider. So context dot provider, capital C, capital P, and then we have a prop is called value and inside the value prop, we can provide this value that we want our application to have access to. So a curly brackets, and I want to provide an array with the state and the set state, that will make sure that we get the exact same structure as we do here with the state, we have the state itself, and then we have the setter in an array. So that's what I'm doing here, I'm giving it the exact same structured array. Alright, so inside this one, we're going to return the children. And this makes sure that we can use this provider to wrap any component in our react application, and it will provide it with these values. Now we have to export default use of provider like this, save this file, we finished here. This is how you set up a global context and a state that you want your application to be able to access globally. Now, we're going to move inside of the app.js file, and inside this file up here somewhere, we can mark it with context. And we import, use the provider. That's the one we created from dot forward slash context. All right, so that's our provider component. And we want to place it high up in the hierarchy. So we can just place it here inside of the router. Use a provider like this. And we're gonna take this one here and move it down and do some auto formatting. So we're wrapping or complete application inside of the use of provider. And this makes sure that our complete application will have access to the state that we created. So we're going to use this one later. But first, we're going to create a login page. So that's what we're going to start doing in the next video. We're going to start creating our login component. And I didn't say that I'm using the version of the application without TypeScript. So you shouldn't use the one with TypeScript use the original one that we finished before we did anything with TypeScript. And also before we refactor it to classes, because I'm using the functional component version, just to be super clear, so that you know what product you're using for this one. Alright, let's move on inside of the components folder, we're going to create a new component component that called login dot j, s, capital L. And we import react. And we're also going to need you stayed and use context, that's the new hook that we're going to use to grab our context. I'm going to show you that in a second. And we import this one's from react. Then we're going to import something that's called use navigate from react dash, router dash DOM. And this one is used if you want to navigate programmatically in your application, then we're going to need a functions that I showed you in the API file, so import API from dot dot forward slash API. For this one, we're going to reduce the button component. So I marked it with components import button from dot forward slash bottom. Right. And then we're also going to create some styles for this one. So we can actually do that now and scaffold them out first. So we create a new file in the components folder that's called login dot styles dot j s. We're going to create the actual styles in the next video. But for now, we import styled from styled components. And we export const wrapper and it equals A styled dot div and double backticks save the file Go back to the long end note as we marked it with styles and import refer from dot forward slash login styles, login login dot stars like this, and then we need our context. So I marked it with context. And we import context from dot dot forward slash context. And that's, of course, the one that we created before. All right, then we can create our component cost login equals, we don't have any props for this one, to make an explicit return, and we have a return statement. And we can create the JSX. First, I'm just going to export default first also. So don't forget that one export default login. In the return statement, we're first going to return a wrapper. And inside a rapper, I'm going to create the label. I'm going to type in username colon, number load at one, I created an input field input, the type is going to be text, the value we're going to grab the value later from the state. So I'm gonna just mark it with state value for now. And the name is going to be username. The onchange is going to be handled input. And that's the function that we're going to create, we can scaffold this one out here, first const handle input equals on our function, we're going to take in the event, I can skip the parentheses as it's the only one parameter. And we just create an empty function from now like this. Then we're also going to have a function that's called handle Submit. And we'll leave it empty for now also. Right, so let's continue here with the input. So we can close this one here, then we create another input field. type for this one is going to be password. We don't want to show the characters that the user type in this one, because it's the password input box value is also going to be a state value that we're going to add. The name for this one is password. And onchange is also going to be handled input. So we have the same function to both of these input fields, and we close it here, then we're going to have a submit button and we use a component, the bottom component, the text is going to be login. And also we don't have to provide us with a prop that's called text and we send in the text, we could also wrap the text with this component if we want to do that instead. And then we grab the text with the children prop. We have a callback. And that's going to be the handle Smith for this one. Do some auto formatting, save it. So that's the basic structure of our component, we want to be able to use this component so we have to create a new route for it. And we can do that in the app.js file. First up here with where we have the components, we're going to import login from dot forward slash components forward slash login, they will have the component and then we can create it somewhere here we create a new route with a path. This one is going to be shown when we go to the path login, the forward slash login and the element is going to be our component. Login. And then we close the route component and some more formatting, save it, go back to our application, make sure that it's running. I'm actually not running mine. So I'm going to type in NPM start. Whoa, I heard it really sumed in here. And I'm going to bring up the console for later. So if we go up here in the route, and type in forward slash login, you can see that we show our component here. So that is working. Great. Go back to the application and the login component. We're going to create a few states for this one. So at the top of the login component, we create a state that we call user name and set the username, equals use state are going to create an empty string as initial state for this one, we create another state, that's called password. And the setter is called Set password equals use state with an empty string as initial value also for this one, something like that. And then I also want to notice state, that's called error and set error. And we have a use state call. And we set it to false initially. So these are the three states that we have, you could also have won combined states for input fields, if you want to have that is used to create them separately like this, then we're going to grab our context, we're importing it up here. And we can grab the context with a hook that's called use context. And our context is going to be the state that we created. So we create a new cost. And we can just structure it out just as before, we have the state, the state is actually going to be the user. So we can be more specific, we call it the user and the set user. And it equals, we call the use context hook. And this works as simple as we just give it the context. And this one is going to bring in the context for us. And the user, we're not going to use this one, we're only going to use the set user, we can mark it with an underscore. If we want to do that. This is also very subjective on how you like to do stuff like this, then we have a hook that we will see imported for our navigation. So we create a course that we call navigate. And we call that hook use navigate. And this will make it possible for us to use this navigate const to navigate programmatically in our application. Alright, so first, we're going to make these input fields controlled by this component. So we have to hook them up with state just as we did with the search bar. And we have this handle input here, where we get the event from the input field, so the input fields, the value for this one, we can change this one now. It's going to be the state that's called username. No, not a capital N, all lowercase letters, and this one is going to have the value from the password state. All right. So this will make sure that it is connected to the state. So now when these input fields change, we can make that change in the handle input because we have an on change handler on them. And we can set the different states in the handle input. And you can see here that I give them a name. So first, we want to grab the name. So I create a const name equals e dot current target dot name, and this one is going to grab the name that are set here on the name prop. Then we have another cost with the value. And we get that one from e dot current target dot value. So we need the name and the value. And actually, you could do this in a one liner. If we use just one state for our input fields, we could set the name of the properties in an object dynamically with the name that we get from the input field. And then we set the value so that will create new values in the object. Depending on how many input fields we add to our application. But in this case, I have a separate state for each input field. So I do it like this instead, in a small application like this, I think this is more readable, actually. But this means that we have to check now what input box that we type in. So we have an if statement. If named equals username, then we're going to set the username stayed with the set username, stay setter, and we have the value. So we set the name of the input box, and then we get the value. If the name is username, we know that we should set the state for the username. So that's what we do in here. And if the name equals password, we're going to set the password state. And we give this one the value also. This one maybe should have a lowercase m instead not an uppercase, so we change this one just to be consistent. Or format it save it and we can see if it works, go back to the application. And we can type something in here. And yeah, it works. So we know that we have our control components. So that's great. So our input fields are working, then we'll have to submit something and actually grab something from the API to make the login. And we do that in the handle submit function. The first thing we're going to do is to set the error to false just when we did when we finished our movies, and then I have a try block and then a catch block and we have the error. For this catch. We can set that or True. That's the only thing we're going to do inside of the catch block. So we're going to be in the try block now. And first, we need to get the request token. So I create a new const. I actually noticed now also that I forgot to bump up the font size. So I'm going to do that now, from now on is going to be bigger. Okay, so I have a cost with a request token. We're going to wait from the API, I have this function GET request token. And of course, this one has to be an async function, because we are waiting here. So Mark this one with a sync. So that will hopefully get us the request token, if something goes wrong here, the catch block will set the error to true and we're going to handle that just in a second down in the JSX. The cost, we're going to grab the session ID We await again, from the API, I have a function that's called authenticate. And for this one, we're going to give it the request token first. And then we give it the username, and then the password. All right, that will hopefully get us our session ID. And then we can set the user. And this one, the set user is actually the context that we created, because we're grabbing the context here and the setter for the user. So we're setting this one in the context, I'm going to set it with an object First, I want to set the session ID. So I gave it from the session ID that's the one that we'll get back from the API. We have a property that's called session underscore ID, all lowercase letters, and then I'm going to set the username. And as this is also e6 syntax, I don't have to type out this twice, because it will interpret this automatically. Alright, and then we just have one more thing to do. And that is we have to navigate somewhere when we successfully logged in. So we can navigate programmatically with react router, we use the navigate that we got here from that hook us navigate, we placed that one, we placed what we get back here in the navigate cost. So navigate parenthesis and we just specify the URL. And in this case, we want to go to the homepage. So we specify it like this. And I want to do some console, log in here, console log, the session ID just to see that we get something here, save the file, go back to our application. And now we haven't styled this one. We're going to do that in the next video. But we can use the input fields here anyways. So my login is vevo and then I have my password that I'm not going to tell you something like this, and I tried to log in. And you can see that we get this object back from API, we get the session ID and the success is telling us true. So that's really, really neat. We know that our login system is working, and it redirected us to the homepage. To go back to the login page. I want to do one more thing here before we finished with the logic for this component. Down below here just above the first label, I have a curly bracket and I'm going to create a short circuit, I'm going to check if the error is true. Double ampersand If the error is true, we're going to have a div with a class name of error. And then I'm just going to say there was an error, something like this. And then I want to format it. And then I'm going to say this file. So you can of course type in whatever you want to save the file, go back to the application. So just try to type something in here and click Login. And you can see that we show this one here. Instead, there was an error. And we also get an error in our console. So we know that the try and catch block is working. So this is our login component and the logic and in the next video, we're going to create the styles for this component. We have our login component and the functionality for that one. And now we're going to create the stars for it. So go back inside of the code editor and the login dot styles dot j s file. We have our wrapper that's the only style component that we use him for this one. First, we're going to display it as a flex. we align dash items to center and we justify the content Center also just the center stuff. Then we set the flex direction on this one is going to be column and we can save it to see what we've got so far. You can see that we're centering it here in the middle of the screen. So that's great. Go back to the code, I'm going to set a max width to 320 pixels, the padding is going to be 20 pixels. And the color is going to be from the variables, we have a color that's named dark gray. So double dash dark grey. Save it go back just to see what we've got, right? When I set the max width to 320 pixels, it's showing it to the left. But if we set the margin to zero and auto, and save it, that will place it in the center again, so that's great. All right. So that's everything for the wrapper. Now we have the input, we nest, this one inside of the wrapper component, we set the width to 100%. On the input fields, the height is going to be 30 pixels. border is going to be one pixel solid. We have a variable for color. And we also use dark gray for that one. Then we set the border dash radius to 20 pixels, the margin is going to be 10 pixels and zero. And the padding is going to be 10 pixels, save the file, go back to the application. And you can see that we created this nice little input fields here sweet with rounded corners, and it matched the overall the overall look of the application. Then we just want to style our error class also dot error. And for that one, I'm just going to set the color to red. You can style this a little bit better if you want to do that. So if we type something in here and click login, you can see that this is the error. All right. And that's actually it for this login component, I'm not going to do any heavy styling, as this is the bonus section of this course. So if you want to do it nicer, you can do that yourself. In the next video, we're going to be in the header and showed a logged in user and also have a log in bottom. Okay, let's create the login system from the header, we're going to show a bottom to log in. And I'm just going to place it in the middle actually here. It may be should be to the right. But yeah, as I told you, I'm not doing any heavy styling for this section. So you can style it to your own liking later. So let's go back inside of the application and inside the header component, so the header folder and the index.js file. The one thing we need to add to the imports here is to actually import the context. So we import context. From dot dot forward slash and dot dot forward slash, again, we have the context file like this. And this one is making an implicit return. Now we need to have some functionality inside of it, we have to change this one into an explicit return. Like this, we add the return statement here or reformat it just to make it a little bit nicer. Some people also have the formatting to activate when you save the file, I'll actually I actually don't like that, because sometimes when I save it, and I'm not finished, it starts to format stuff. And I don't like that. That's why I do it manually, instead. Alright, const user, we're going to grab the user from the context, we don't need to set anything here, we just need the user. And recall the use context hooked, we actually need to import that one also appear. So import react comma, curly brackets use context. So we give this use context, hook the context. And this will bring us the user. So we don't need to destructure out the setter for the state, we just need to use so so that's why we're not destructuring out that one. And we can do a console log user like this. Save the file, go back to our application, I'm going to try to login again. I click Login. And you can see that we get this console log here. So we have the session ID and the username of vaman. And that's of course for vaman fault. All right, so we know that our context is working great. And that's sweet. So go back to the index.js file in the header folder. And now we can use this one here. So just between the two logos here. I'm going to create curly brackets. And the first thing I'm going to do is to check if we have a user and then I create a ternary operator. So I have a question mark, parenthesis and the first thing I'm going to do if we have User are going to show a span with a class name of logged in, like this. And I'm going to type out logged in as colon. And then I have new quarter brackets, and I grabbed the use of dot username. And that's from the object that we get back from the context, of course. So when we are logged in, we're going to show the text logged in as and we also show in the username. Otherwise, if we're not logged in, we have a colon, here, we have a new pair of parenthesis, are going to use the link component. And it's going to link to if you remember this one, the link component is the one that we use from react router to navigate inside of our application. This one is going to link to the login page like this. And inside the link, I'm going to have a spam that has a class name of login. And it says login and then do some nice auto formatting. I'm going to move this one off and save the file and see if it works. Go back to the application, we can't hardly see it here. We're going to style this in a second. But we have a login button. So it takes us to the login page. So here again, I'm going to log in. And this is something that you also can do if you want you can store the user information in the session storage or in the local stories, there's a lot of discussion going on, on what is the best practices to use. In this case, we have a session ID, so we have to request a new session ID on each session from the Movie Database API. So I'm just storing it in the application itself. So that means that it will get wiped out every time you reload application, I had to log in. Again, if this was in the real world, we probably would have a login system that will also save this token somewhere. So you don't have to log in every time. And I actually have a YouTube video, where I show how to create a back end and set up JSON Web tokens and how to create a login system in a react application. So this is a very simple use case on how you can create a login system here. All right, that was a side note, I'm going to click the Login button. And hopefully up here Yeah, you can see that we showing logged in as beiben. So it's working, we have to give it some styling also. And this is just going to be a couple of rows. So I'll do it in this video. So inside the header.styles.js inside here, we actually don't need the class names that are set, we can just set the color to a variable of white, like this, and then we have the a tag, I set the color to the same variable there, double dash white. And the text dashed declaration is going to be set to none. Auto format. Let's save it. And also if we want, we can remove these classes, we don't need them, we can just have a span on this one's awesome thing like this, save the file, go back to the application, you can see that now we see it. And yeah, this is probably not the most beautiful way, it doesn't look that good, because I'm just placing it in the middle. Now, we would have some dedicated space for a login button and stuff like that. But this is just to show the functionality. So I'm not going to style it any better than this. So I clicked the login. And I log in again. click the Login button, whoops, something, I guess I typed the password wrong here. I log in again. And that works. And now we can see that we have this white text instead. And it tells us that I'm logged in. So that's great. In the next video, we're going to create the rate component that we're going to show somewhere here, I think we're almost finished with the voting system. But we need a rating component that we can place here in the movie info component. So we're going to create that will now move back inside of the code editor and inside of components create a new folder that we call Wraith, capital R. And inside of that folder, we create a new file that's called index dot j s and I actually not going to have any styling for this one. I'm going to use the components as they are. So first I'm going to import react. And I'm also going to need the use state for this one. Because it is going to be a control component I imported from react. Then I create my component rate equals, and I'm going to destructure out the callback for this one. Because when we vote, we need to have a callback function that will do something. And in this case, it's going to send a request to the API. That's a component I'm also going to export default rate like this. And the first thing we do in this component is to create a state with a value and set value equals use state And we're going to start with the value five, the rating is going to be between one and 10. And then we have the return statement and we return our JSX. So I'm going to make it simple here, I create a wrapping div, and then I create an input. And the type is going to be range. So we create a range slider, the min value is going to be one, the max is going to be turn, and the value is going to be our state value. And then on change, we have to change this state value. So I want to show you also that you can create an inline function instead of creating a function up here to where the event E, I create an inline arrow function. And then we set the value e dot turn target dot value, and this is enough. And we will close this component. Alright, so that's a range slider after the range slider, we want to show of our value like this. And then I create a p tag just to get it on a new row. And I create a button. I have an onClick handler on this button. And in this case, we have an inline arrow function because we are going to call our callback with a value. And we give it the value if we don't have this inline arrow function here, and we just type it out like this, then it's going to instantly run this and it won't work. So we have to have an inline function here as we providing an argument to this callback function. Right, close it and inside of the button with type out rate, do some more formatting, save it, we're gonna move inside of movie info component in the index.js file. And up here where we import the thumb, we also got to import our rate component, dot dot forward slash rate. And then we're going to show the rate component somewhere below. theme, we're going to place it Yeah, maybe here, just above the M tag for the text. So I create a new div and inside that div, I have a p tag rate movie. And below that one, we use a rate component. And for now, we don't have a function that we're going to send into this one the callback function. So just showing the component just to see that it works and shows up, save the file. Go back to the application. And you can see that we have the rate slider here. And we have a rate bottom, it doesn't work. Now, as you can see, because we're not sending in the callback function to it. But this one will work in the next video, because we're going to tie all this together and make it work so that when we press this red button, we will send along this rating number to the API, and we will rate this movie. Alright, we're almost finished. And this is actually the last video in this course. So hope you enjoy the course, we're going to tie this together. So let's move inside of the code and inside the movie info component in the index.js file, the first thing we have to do is to grab the context, the context or import context, from dot dot forward slash and dot dot forward slash again, and context. So we're going to use the context. And that means that we also need to import from up here, the use context hooked. Right. And now you hopefully can see how handy it is to have this global state because we can access it from any component in the application. And in this case, we're going to grab the user and the session ID. So you can send along the session ID to the API when the user rate the movie. And now we're making this implicit return, we're going to change this one to an explicit return, so return and I created curly bracket, and then we need to have one below also. There is some auto formatting, and go back up if it's in space. And first, we're going to grab the user from our context, just as we did before the cost user use context. And we've given you the context. So this will give us the user here. And then we are going to send in a callback function to our rate component here. So we're creating this function here in this component and send it along to the rate component. We're going to call this function calls handle rating. This is going to be an async function because we're making a an API call. We have the value And then we can do some stuff inside of here. So this value is going to be the value from the range slider. So create a new cost rate equals, then I wait. And from the api.id and I imported up here. No, I also need to import the API. We do that up here, import API from dot dot forward slash dot dot forward slash API, like this, then I go back down here and change this one. API dot, I'm going to grab the function that's called rate movie. And if you want to know more about these functions, you can always check them out in the api.js file. Because I told you probably too many times now that I pre made these functions for you. So you don't have to do that in this course. Alright, move back to the movie and for an index.js file. So the rate movie function is going to take in three arguments. So we have the user dot session ID. And we have the movie ID, because we need to know the movie ID of the movie that we want to rate. And we also want to give it the value, that's the rating value. Right. And that's actually everything we need to do. In this case, I just want to console log out to rate to see that we get something back and that the rating was working. So we can use this handle rating. Now down below here, we can give it to the rate component, we have a prop. That's called callback. And we give it to hand reading and save the file. And hopefully this should be it. Go back to the application. Yeah, we have one more thing to do, because I don't want to show this rate slider when we're not logged in. So we can do that also. So just here, when we have the rating, outside of the wrapping dem are going to create a ternary operator, I'm going to check if you sir. Then I'll double ampersand, and I move my M curly bracket down here or to format it. And it will also auto generate this parenthesis. So if the user exists, if we're logged in, we're going to show the rating. Otherwise, we don't show anything. Save the file go back to our application, you can see that we're not showing the rate slider now we have to log in. So we click the Login button, and I log in. And now we're logged in, we're going to go to movie here. Now you can see that we see the rating slider. So I don't actually know if this movie is any good, but I'm going to give it a rating or eight. And I click the red button. And here you can see in the console that we got a success of true and status code one, a status message success. And if we click rate again, you can see that we get another message because it says that the item record was updated successfully. So you can update your rating score. If you want to do that. There's also a resource in the endpoint if you want to remove the score also. So there are some neat stuff that you can do with the Movie Database API. And I hope this inspired you to actually build more stuff into this application, because now you have a good foundation. And for example, the next step you can do is to create a logout button for the user. And the way I would do it in this case is that I can just wipe out the global context the state here and remove the user from the global state. And that will log out the user we don't have to do anything else with the Movie Database API or something like that. Alright, that's it for this course. I hope you enjoy this. I sure enjoy this. This is the third iteration of the course. So this is the third time that I actually update it and re recorded from scratch. And if you want free tutorials, you can always visit my YouTube channel, search for vaman Fox, or you can go to vevo in fact.com if you want more courses from me
Info
Channel: freeCodeCamp.org
Views: 350,129
Rating: 4.9553208 out of 5
Keywords:
Id: nTeuhbP7wdE
Channel Id: undefined
Length: 430min 28sec (25828 seconds)
Published: Thu Jul 08 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.