This tutorial is part of the « Cooking a Deliveroo clone with Next.js (React), GraphQL, S[trapi and Stripe » tutorial series.)
Table of contents
Note: the source code is available on GitHub: https://github.com/strapi/strapi-examples/tree/master/nextjs-react-strapi-deliveroo-clone-tutorial
All of these dishes look so tasty! What if we could add some of them in a shopping cart?
Next, we create a new component named Cart.js
:
1cd ..
2cd components
3mkdir Cart
4cd Cart
5touch Cart.js
Path: /frontend/components/Cart/Cart.js
To keep track of our items added to our cart across pages we will use the React Context API. Context will allow us to manage the state of items in a provider component that will be re-used on the checkout page. The only thing React Context will not take care of for us is saving items on a page refresh, for that you would want to save the items to a cookie and restore the items from the cookie. I will work to implement this soon if requested.
The items are currently saved to a cookie called items, but the items are not restored on refresh.
Create a new directory inside our components folder:
Note: you can name your AppProvider anything related to the context you are storing (i.e. ItemsContextProvder). This would allow you to use and keep track of multiple providers/consumers throughout the app if your needs grow.
1cd ..
2mkdir Context
3cd Context
4touch AppProvider.js
Path: /frontend/components/Context/AppProvider.js
Now we will need to make some changes to use our Context throughout the application and on the dishes page.
Update the _app.js
and /pages/restaurants.js
files to use the AppProvider/Consumer components:
Path: /frontend/pages/_app.js
Path: /frontend/pages/restaurants.js
Now if you refresh the page you should see the Cart component to the right of the dishes.
Your Layout header should also update with the username of the logged-in user and show a logout button if you are logged in.
To actually place an order the isAuthenticated
prop must pass to true, in a real world app you would want to secure these routes on the server side rather than on the client side. Any props/state on the client can be altered and therefore should not expose real-world data without server validation.
For the sake of the tutorial we are not currently implementing this.
Good job!
💵 In the next section, you will learn how to setup Stripe for checkout and create orders: https://blog.strapi.io/strapi-next-order-checkout.
Ryan is an active member of the Strapi community and he's been contributing at a very early stage by writing awesome tutorial series to help fellow Strapier grow and learn.