{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-9/",
    "result": {"data":{"markdownRemark":{"html":"<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#must-know-redux-terms\">Must-know Redux Terms</a></p>\n<ul>\n<li><a href=\"#action\">Action</a></li>\n<li><a href=\"#action-creator\">Action Creator</a></li>\n<li><a href=\"#reducer\">Reducer</a></li>\n<li><a href=\"#store\">Store</a></li>\n<li><a href=\"#dispatch\">Dispatch</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#installation\">Installation</a></p>\n</li>\n<li>\n<p><a href=\"#create-a-redux-store\">Create a Redux Store</a></p>\n</li>\n<li>\n<p><a href=\"#create-a-redux-state-slice\">Create a Redux state slice</a></p>\n</li>\n<li>\n<p><a href=\"#what-the-hell-are-slices\">What the hell are slices?</a></p>\n</li>\n<li>\n<p><a href=\"#what-is-createasyncthunk\">What is createAsyncThunk?</a></p>\n</li>\n<li>\n<p><a href=\"#add-slice-reducers-to-the-store\">Add slice reducers to the store</a></p>\n</li>\n<li>\n<p><a href=\"#using-redux-state--action-in-components\">Using Redux state &#x26; action in components</a></p>\n</li>\n</ul>\n</div>\n<h6 id=\"this-blog-post-is-part-of-a-series-you-must-finish-part-1-part-2-part-3-part-4-part-5-part-6-part-7--part-8-before-continuing-here\" style=\"position:relative;\"><a href=\"#this-blog-post-is-part-of-a-series-you-must-finish-part-1-part-2-part-3-part-4-part-5-part-6-part-7--part-8-before-continuing-here\" aria-label=\"this blog post is part of a series you must finish part 1 part 2 part 3 part 4 part 5 part 6 part 7  part 8 before continuing here permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>This blog post is part of a series. You must finish <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-1/\">part-1</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-2/\">part-2</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-3/\">part-3</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-4/\">part-4</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-5/\">part-5</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-6/\">part-6</a>, <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-7/\">part-7</a> &#x26; <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-8/\">part-8</a> before continuing here.</h6>\n<p>Using Redux as a state management library is a pain in the ass. I am sure you would agree with some of the major concerns of Redux users as mentioned below:</p>\n<ul>\n<li>Redux requires too much boilerplate code.</li>\n<li>Configuring a Redux store is too complicated.</li>\n<li>You have to add too many packages to do anything useful with Redux.</li>\n<li>You must do all the state updates immutably and writing immutable logic is hard. Accidentally mutating the state in reducers is the single most common mistake made by Redux users.</li>\n</ul>\n<p>Redux Toolkit includes utilities that address all the above-mentioned concerns. It simplifies your Redux code and lets you focus on the core logic of your application, so you can do more work with less code. Redux Toolkit is the recommended approach for writing Redux logic.</p>\n<p>I am a huge fan of Redux Toolkit. Ever since I started using Redux Toolkit, I find developing applications with large amounts of application state that require complex update logic an absolute breeze. At the end of the series, if I would have convinced you to use Redux Toolkit, I would have done my job.</p>\n<h2 id=\"must-know-redux-terms\" style=\"position:relative;\"><a href=\"#must-know-redux-terms\" aria-label=\"must know redux terms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Must-know Redux Terms</h2>\n<p>Before I explain how Redux Toolkit works, you must have a basic understanding of the following terms:</p>\n<h3 id=\"action\" style=\"position:relative;\"><a href=\"#action\" aria-label=\"action permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Action</h3>\n<p>You can think of an action as an event that describes something that happened in the application. For example, clicking on an “Add to Cart” button would be considered as an event.</p>\n<p>An action is a plain JavaScript object that has a type field and a payload field. The type field, which should be a string, refers to the name of the action. And the payload field contains the information about the action.</p>\n<h3 id=\"action-creator\" style=\"position:relative;\"><a href=\"#action-creator\" aria-label=\"action creator permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Action Creator</h3>\n<p>An action creator is a function that creates and returns an action object. We typically use these so we don’t have to write the action object by hand every time.</p>\n<h3 id=\"reducer\" style=\"position:relative;\"><a href=\"#reducer\" aria-label=\"reducer permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reducer</h3>\n<p>A reducer is a function that receives the current state and an action object, decides how to update the state if necessary, and returns the new state: (state, action) => newState. You can think of a reducer as an event listener which handles events based on the received action (event) type.</p>\n<h3 id=\"store\" style=\"position:relative;\"><a href=\"#store\" aria-label=\"store permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Store</h3>\n<p>The current Redux application state lives in an object called the store.</p>\n<h3 id=\"dispatch\" style=\"position:relative;\"><a href=\"#dispatch\" aria-label=\"dispatch permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dispatch</h3>\n<p>The only way to update the state is by passing an action object to the dispatch function. You can think of dispatching actions as “triggering an event” in the application. Reducers act like event listeners, and when they hear an action they are interested in, they update the state in response.</p>\n<h2 id=\"installation\" style=\"position:relative;\"><a href=\"#installation\" aria-label=\"installation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Installation</h2>\n<p>Redux Toolkit is available as a package on npm.</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">npm i @reduxjs/toolkit</span></span></span></code></pre>\n<p>In addition, we need to install <del>react-redux</del>, which lets React components read data from a Redux store and dispatch actions to the store to update state.</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">PS C:</span><span class=\"mtk6\">\\U</span><span class=\"mtk1\">sers</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">elhivery</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">esktop</span><span class=\"mtk6\">\\m</span><span class=\"mtk1\">ern-auth</span><span class=\"mtk6\">\\c</span><span class=\"mtk1\">lient</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\"> npm i react-redux</span></span></span></code></pre>\n<blockquote>\n<p><strong>Note:</strong> Redux Toolkit only covers the Redux logic. We still use React-Redux to let our React components talk to the Redux store.</p>\n</blockquote>\n<h2 id=\"create-a-redux-store\" style=\"position:relative;\"><a href=\"#create-a-redux-store\" aria-label=\"create a redux store permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Create a Redux Store</h2>\n<p>Create a file called <del>store.js</del> inside the <del>src</del> folder. We will start by creating and exporting an empty Redux store. We can create a Redux store by using the <del>configureStore</del> API from Redux Toolkit.</p>\n<div class=\"gatsby-code-title\">client/src/store.js</div>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"js\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">configureStore</span><span class=\"mtk1\"> } </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;@reduxjs/toolkit&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">export</span><span class=\"mtk1\"> </span><span class=\"mtk10\">default</span><span class=\"mtk1\"> </span><span class=\"mtk6\">configureStore</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">reducer</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {},</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">})</span></span></span></code></pre>\n<p>The <del>configureStore</del> API automatically configures Redux DevTools Extension so that we can inspect the store while developing.</p>\n<blockquote>\n<p><strong>Redux DevTools Extension:</strong> Redux DevTools provides a debugging platform for Redux apps. It shows a history of changes to the state in your Redux store over time. This allows you to debug your applications effectively. You can install Redux DevTools as a browser extension.</p>\n</blockquote>\n<p>Then, we need to import the Redux store into our application’s entry point - <del>src/index.js</del> and wrap the root component - <del>App.js</del> - with the <del>Provider</del> component from <del>react-redux</del>.</p>\n<div class=\"gatsby-code-title\">client/src/index.js</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"jsx\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk3\">React</span><span class=\"mtk1\"> </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;react&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk3\">ReactDOM</span><span class=\"mtk1\"> </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;react-dom&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;./index.css&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk3\">App</span><span class=\"mtk1\"> </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;./App&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;bootstrap/dist/css/bootstrap.css&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">BrowserRouter</span><span class=\"mtk1\"> </span><span class=\"mtk10\">as</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Router</span><span class=\"mtk1\"> } </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;react-router-dom&quot;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">Provider</span><span class=\"mtk1\"> } </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;react-redux&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk3\">store</span><span class=\"mtk1\"> </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;./store&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk3\">ReactDOM</span><span class=\"mtk1\">.</span><span class=\"mtk6\">render</span><span class=\"mtk1\">(</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk6\">&lt;</span><span class=\"mtk9\">Provider</span><span class=\"mtk1\"> </span><span class=\"mtk10\">store</span><span class=\"mtk12\">=</span><span class=\"mtk10\">{</span><span class=\"mtk3\">store</span><span class=\"mtk10\">}</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk6\">&lt;</span><span class=\"mtk9\">Router</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">&lt;</span><span class=\"mtk9\">App</span><span class=\"mtk1\"> </span><span class=\"mtk6\">/&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk9\">Router</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk9\">Provider</span><span class=\"mtk6\">&gt;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">document</span><span class=\"mtk1\">.</span><span class=\"mtk6\">getElementById</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;root&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">)</span></span></span></code></pre>\n<p>The <del>Provider</del> component makes the Redux store available to any nested components. And since we have rendered the <del>Provider</del> component at the top level, all of our React components can now access the global Redux store.</p>\n<h2 id=\"create-a-redux-state-slice\" style=\"position:relative;\"><a href=\"#create-a-redux-state-slice\" aria-label=\"create a redux state slice permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Create a Redux state slice</h2>\n<p>Inside the <del>components</del> folder, create a folder named <del>stateSlices</del> and inside the <del>stateSlices</del> folder, create a file named <del>registerSlice.js</del>.</p>\n<div class=\"gatsby-code-title\">client/src/components/stateSlices/registerSlice.js</div>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"js\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">createSlice</span><span class=\"mtk1\">, </span><span class=\"mtk3\">createAsyncThunk</span><span class=\"mtk1\"> } </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;@reduxjs/toolkit&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk3\">axios</span><span class=\"mtk1\"> </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;axios&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">initialState</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">status</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;idle&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">userRegistered</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">null</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">error</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">null</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">export</span><span class=\"mtk1\"> </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">registerUser</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">createAsyncThunk</span><span class=\"mtk1\">(</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk16\">&quot;register/registerUser&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">async</span><span class=\"mtk1\"> (</span><span class=\"mtk3 mtki\">registrationFormData</span><span class=\"mtk1\">, { </span><span class=\"mtk3 mtki\">rejectWithValue</span><span class=\"mtk1\"> }) </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk10\">try</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">data</span><span class=\"mtk1\"> } </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk10\">await</span><span class=\"mtk1\"> </span><span class=\"mtk3\">axios</span><span class=\"mtk1\">.</span><span class=\"mtk6\">post</span><span class=\"mtk1\">(</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk16\">&quot;/api/users/register&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk3\">registrationFormData</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      )</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk10\">return</span><span class=\"mtk1\"> </span><span class=\"mtk3\">data</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    } </span><span class=\"mtk10\">catch</span><span class=\"mtk1\"> (</span><span class=\"mtk3\">err</span><span class=\"mtk1\">) {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"20\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk10\">return</span><span class=\"mtk1\"> </span><span class=\"mtk6\">rejectWithValue</span><span class=\"mtk1\">(</span><span class=\"mtk3\">err</span><span class=\"mtk1\">.</span><span class=\"mtk3\">response</span><span class=\"mtk1\">.</span><span class=\"mtk7\">data</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"21\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    }</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"22\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  }</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"23\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"24\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"25\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">export</span><span class=\"mtk1\"> </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">registerSlice</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">createSlice</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"26\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">name</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;register&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"27\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">initialState</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"28\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">reducers</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {},</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"29\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">extraReducers</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"30\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">[registerUser.</span><span class=\"mtk7\">pending</span><span class=\"mtk3\">]</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> (</span><span class=\"mtk3 mtki\">state</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">action</span><span class=\"mtk1\">) </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"31\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">state</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;loading&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"32\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"33\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">[registerUser.</span><span class=\"mtk7\">fulfilled</span><span class=\"mtk3\">]</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> (</span><span class=\"mtk3 mtki\">state</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">action</span><span class=\"mtk1\">) </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"34\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">state</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;succeeded&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"35\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">state</span><span class=\"mtk1\">.</span><span class=\"mtk7\">userRegistered</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk5\">true</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"36\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"37\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">[registerUser.</span><span class=\"mtk7\">rejected</span><span class=\"mtk3\">]</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> (</span><span class=\"mtk3 mtki\">state</span><span class=\"mtk1\">, </span><span class=\"mtk3 mtki\">action</span><span class=\"mtk1\">) </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"38\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">state</span><span class=\"mtk1\">.</span><span class=\"mtk7\">status</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;failed&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"39\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">state</span><span class=\"mtk1\">.</span><span class=\"mtk7\">error</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk3\">action</span><span class=\"mtk1\">.</span><span class=\"mtk3\">payload</span><span class=\"mtk1\">.</span><span class=\"mtk7\">message</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"40\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"41\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"42\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">})</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"43\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"44\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">export</span><span class=\"mtk1\"> </span><span class=\"mtk10\">default</span><span class=\"mtk1\"> </span><span class=\"mtk3\">registerSlice</span><span class=\"mtk1\">.</span><span class=\"mtk7\">reducer</span></span></span></code></pre>\n<p>We need to install <del>axios</del>, which is an HTTP client used to send HTTP requests and retrieve their responses from a server.</p>\n<pre class=\"grvsc-container synthwave-84\" data-language=\"sh\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-source\"><span class=\"mtk1\">PS C:</span><span class=\"mtk6\">\\U</span><span class=\"mtk1\">sers</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">elhivery</span><span class=\"mtk6\">\\D</span><span class=\"mtk1\">esktop</span><span class=\"mtk6\">\\m</span><span class=\"mtk1\">ern-auth</span><span class=\"mtk6\">\\c</span><span class=\"mtk1\">lient</span><span class=\"mtk10\">&gt;</span><span class=\"mtk1\"> npm i axios</span></span></span></code></pre>\n<p>It is very likely that you don’t understand a single line of code that we have written inside the <del>registerSlice.js</del> file. You probably have a zillion questions swirling inside your head. Don’t worry though. We will unpack everything step-by-step. First, we must understand some important concepts.</p>\n<h2 id=\"what-the-hell-are-slices\" style=\"position:relative;\"><a href=\"#what-the-hell-are-slices\" aria-label=\"what the hell are slices permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What the hell are slices?</h2>\n<p>A Redux store is typically organized into slices. You can think of a <strong>slice</strong> as a single feature of your application. User registration is a feature of our application and <del>registerSlice.js</del> is the file responsible for dealing with that feature.</p>\n<p>We create a slice using the <del>createSlice</del> function from Redux Toolkit. The <del>createSlice</del> function needs a string name to identify the slice, an <del>initialState</del> and one or more reducer functions that define how the state can be updated. We use the status field of the <del>initialState</del> object to decide what to show in our UI.</p>\n<p>One of the cool features of Redux Toolkit is that we can write mutating logic inside a reducer function because <del>createSlice</del> converts those mutations into safe immutable updates internally using the Immer library. We don’t have this luxury in Redux where we must write all state updates immutably, by making copies of data and then updating those copies. However, you must take precaution to not mutate any data outside createSlice.</p>\n<p>In the <del>registerSlice.js</del> file, we have named our slice <del>register</del>. You will also notice that we haven’t defined any functions(reducers) inside the reducers field. You will soon understand why. We will discuss the <del>extraReducers</del> field, which is meant to reference external actions, once we understand the concept of updating the Redux store with asynchronous logic.</p>\n<h2 id=\"what-is-createasyncthunk\" style=\"position:relative;\"><a href=\"#what-is-createasyncthunk\" aria-label=\"what is createasyncthunk permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is createAsyncThunk?</h2>\n<p>By itself a Redux store does not know anything about asynchronous logic. It only knows how to synchronously dispatch actions, update the state and notify the UI that something has changed.</p>\n<p>In our case, when a user clicks on the <del>Register</del> button, we make a <del>POST</del> request to the <del>/api/users/register</del> endpoint. This network request is an asynchronous operation.</p>\n<blockquote>\n<p><strong>Asynchronous operation:</strong> An asynchronous operation is an operation that we can wait on while moving on to other tasks. Making a network request, querying a database, etc. are examples of asynchronous operations, which return Promise objects that represent the eventual outcome of the operation.</p>\n</blockquote>\n<p>How can we then write asynchronous code and let it interact with the store? We can write asynchronous code by using a middleware provided by Redux Toolkit called <strong>redux-thunk</strong>. Fortunately, Redux Toolkit’s <del>configureStore</del> function sets up this middleware by default.</p>\n<p>We write any asynchronous logic inside a function known as a <strong>thunk</strong>. In <del>registerSlice.js</del> file, the <del>registerUser</del> function (the thunk) is where we make API calls to the server.</p>\n<blockquote>\n<p><strong>What is a thunk?</strong><br>\nThunk is a functional programming technique used to delay computation. Instead of performing some work now, you produce a function or an unevaluated expression (<em>the <strong>thunk</strong></em>), which can be used to perform the work later.</p>\n</blockquote>\n<p>Also, note that <del>createSlice</del> does not have any special support for defining thunks. We write thunks as separate functions in the same slice file.</p>\n<p><del>createAsyncThunk</del> accepts two arguments. The first argument is a string used as the prefix for generated action types. The second argument is a callback function that returns a <del>Promise</del> containing some data, or a rejected <del>Promise</del> with an error.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 527px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/983230b704728430dbfdc5b6c79dadbd/c6c03/thunk.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 77%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAB3klEQVQoz3VTi3LbIBDUd6Ti7ngjBEIWevkRO3Y6nf7/F3XQ2GlSpzsMAwd7B8tSwVfUdWnPYAw0h9eAa4PngKNFxqD6vCw4O+xflumFqEy36H2xZmAF/Er0u6drpKAQoJARAGuGQASE/QD9AECIBFT6DZwASx5EeO+wZvBjS1r1NlzTbkpp3KXT27i/HtbLsu5D78WYw5zj2PtlDMERslois6IcCrfzVM7w19PussT3y/zzbb5d5ttlvN4O09KHIOds9qs/HtrD2uTedcHEVkl1v07FJYXU2ybLNpLz3LXcaNVE7VoyzjY2RmusNFZLqZBLTlyZuyKVkKQNCRNjY7vUhZSSE4vvUtNSyLZtu6AR6rpmjDFgDIEp/ahcyJZzqab9MedxmJZpPaync+g6YDWwh+wPIMIXsnXkndPGo21JWyCOQiFx+A7/ko3XvR2Gpnfz2cS+uIQ9VfwPGU2jd03O7ZDncVlzHuM4xpyDCV2Tss+rTTnmQUkqj/SZLCW51tRbHQRGmzeIUIhinuISfvcJEd4rmwfZO+E9l5opU6JSb00B52AcWM+4YEIwIe8btIW/T8UJnz4BCFV27FaYz8AFuLZEPkT4GFTPurAaXIDpCGmCfoZhhTSCkN8o+Adcg4BdRz95DgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Thunk\"\n        title=\"Thunk\"\n        src=\"/static/983230b704728430dbfdc5b6c79dadbd/c6c03/thunk.png\"\n        srcset=\"/static/983230b704728430dbfdc5b6c79dadbd/56d15/thunk.png 200w,\n/static/983230b704728430dbfdc5b6c79dadbd/d9f49/thunk.png 400w,\n/static/983230b704728430dbfdc5b6c79dadbd/c6c03/thunk.png 527w\"\n        sizes=\"(max-width: 527px) 100vw, 527px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>Thunks automatically dispatch <del>pending/fulfilled/rejected</del> action types for us. We respond to these actions by using the <del>extraReducers</del> field in the <del>createSlice</del> function.</p>\n<p>In order to understand <del>pending/fulfilled/rejected</del> action types, we must understand the four possible states that an API call can be in.</p>\n<p>When we make an API call, we can view its progress as follows:</p>\n<p><strong>The request has not started yet.</strong> This is represented by the value <del>idle</del> of the <del>status</del> field inside the <del>initialState</del> object.</p>\n<p><strong>The request is in progress.</strong> We change the <del>status</del> field inside the <del>initialState</del> object as <del>loading</del> and show a spinner in the UI.</p>\n<p><strong>The request succeeds.</strong> We change the value of the <del>status</del> field inside the <del>initialState</del> object as <del>fulfilled</del>. The thunk dispatches a success action containing the data in the <del>payload</del> field of the <del>action</del> object.</p>\n<p><strong>The request fails.</strong> We change the value of the <del>status</del> field inside the <del>initialState</del> object as <del>rejected</del>.The thunk dispatches a failure action containing the error details. We will catch the error using the <del>rejectWithValue</del> utility from Redux Toolkit. The error will be available as <del>action.payload.message</del>.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 578px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/39c82da64323489fc5365b8d90132118/8c7b4/extraReducers.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 68%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAB9klEQVQoz3WSi27cIBBF/Rs1MLw9Axhj8CPZpNnNdqOq//9FlTdRpTbp6Gp0QTqaK5hu9MkaLx0pTCbNOlWFyTqbpzCOlBMaJQV8XV3dXmJZ56msbcGUlSdpvFLKe+sHh4PT8v9wfnxu59vy9D2XokQvgSngxzDBADgAl1IoBUp9BS+nul1f2+U8PW4hE0WPpAcEig5RUTCI0nsIxI0R4u8MXQgm7Of08iucbmF9zu1h35a1BCyrtt6H0XmnlPZOGAOfYISB0FKyFB1Fa20kjOiU1kprKaXSGkA5B84dqJQfOuAYJLXNt2fXnnxuaV5yXbZ5KLX4mB1GSlFbGwgkQN8DY9Az4PcInTWc5q1dfpbTpZ3f8vJY21pSCqkAiD9lrPjx+q3NfFv4vjEizgV0g4eBYpxXyrMP0cWqh8gEgNQHy9nROBgjxsS3hb2e++u5L9MxuxujormqtOhxsSGHXMdpDGRDnjyFIRVK0ViNwxF039nt1l+vrDWOKDrvBNW9vLyNp0tsey71YduWOtF0BMGxOEQA6RwYLTBC3aGskLJYKutwkB7RhdFRUsZajJayj2UYq48TTosdkPXcGLBWMHY8GOuB88N0taJ33FnmLPNOHMYwZ/q77sYy5wWheF+Sj3+6944GKyVofeh9DZX6OP5z+Xk9fwOuunq3vF9t9AAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Thunk\"\n        title=\"Thunk\"\n        src=\"/static/39c82da64323489fc5365b8d90132118/8c7b4/extraReducers.png\"\n        srcset=\"/static/39c82da64323489fc5365b8d90132118/56d15/extraReducers.png 200w,\n/static/39c82da64323489fc5365b8d90132118/d9f49/extraReducers.png 400w,\n/static/39c82da64323489fc5365b8d90132118/8c7b4/extraReducers.png 578w\"\n        sizes=\"(max-width: 578px) 100vw, 578px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>On line 44 in the <del>registerSlice.js</del> file, we export <del>registerSlice.reducer</del>, which is created automatically by <del>createSlice</del>.</p>\n<p>Now, you should have a pretty good understanding of the code inside <del>registerSlice.js</del> file.</p>\n<h2 id=\"add-slice-reducers-to-the-store\" style=\"position:relative;\"><a href=\"#add-slice-reducers-to-the-store\" aria-label=\"add slice reducers to the store permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Add slice reducers to the store</h2>\n<div class=\"gatsby-code-title\">client/src/store.js</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"js\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">configureStore</span><span class=\"mtk1\"> } </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;@reduxjs/toolkit&quot;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk3\">registerReducer</span><span class=\"mtk1\"> </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;./components/stateSlices/registerSlice&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">export</span><span class=\"mtk1\"> </span><span class=\"mtk10\">default</span><span class=\"mtk1\"> </span><span class=\"mtk6\">configureStore</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk3\">reducer</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">register</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">registerReducer</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">})</span></span></span></code></pre>\n<p>We import the reducer function exported from <del>registerSlice.js</del> file as <del>registerReducer</del> and add it to the store. The object <del>{register: registerReducer}</del> says that we want to have a <del>state.register</del> slice of the global Redux state object and we want the <del>registerReducer</del> function to be in charge of deciding if and how to update the <del>state.register</del> slice whenever an action is dispatched.</p>\n<h2 id=\"using-redux-state--action-in-components\" style=\"position:relative;\"><a href=\"#using-redux-state--action-in-components\" aria-label=\"using redux state  action in components permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Using Redux state &#x26; action in components</h2>\n<p>Update the <del>RegisterForm.js</del> file with the following highlighted code snippets.</p>\n<div class=\"gatsby-code-title\">client/src/components/RegisterForm.js</div>\n<pre class=\"grvsc-container grvsc-has-line-highlighting synthwave-84\" data-language=\"jsx\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"1\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk3\">React</span><span class=\"mtk1\"> </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;react&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"2\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">useFormik</span><span class=\"mtk1\"> } </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;formik&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"3\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> </span><span class=\"mtk5\">*</span><span class=\"mtk1\"> </span><span class=\"mtk10\">as</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Yup</span><span class=\"mtk1\"> </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;yup&quot;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"4\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">useDispatch</span><span class=\"mtk1\">, </span><span class=\"mtk3\">useSelector</span><span class=\"mtk1\"> } </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;react-redux&quot;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"5\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">registerUser</span><span class=\"mtk1\"> } </span><span class=\"mtk10\">from</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;./stateSlices/registerSlice&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"6\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"7\"></span><span class=\"grvsc-source\"><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk6\">RegisterForm</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> ({ </span><span class=\"mtk3 mtki\">history</span><span class=\"mtk1\"> }) </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"8\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">dispatch</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">useDispatch</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"9\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"10\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> { </span><span class=\"mtk3\">status</span><span class=\"mtk1\">, </span><span class=\"mtk3\">userRegistered</span><span class=\"mtk1\">, </span><span class=\"mtk3\">error</span><span class=\"mtk1\"> } </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">useSelector</span><span class=\"mtk1\">(</span><span class=\"mtk3 mtki\">state</span><span class=\"mtk1\"> </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk3\">state</span><span class=\"mtk1\">.</span><span class=\"mtk7\">register</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"11\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"12\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">const</span><span class=\"mtk1\"> </span><span class=\"mtk3\">formik</span><span class=\"mtk1\"> </span><span class=\"mtk12\">=</span><span class=\"mtk1\"> </span><span class=\"mtk6\">useFormik</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"13\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">initialValues</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"14\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">firstName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"15\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">lastName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"16\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">email</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"17\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">password</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;&quot;</span><span class=\"mtk1\">,</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"18\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"19\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">validationSchema</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Yup</span><span class=\"mtk1\">.</span><span class=\"mtk6\">object</span><span class=\"mtk1\">({</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"20\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">firstName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Yup</span><span class=\"mtk1\">.</span><span class=\"mtk6\">string</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"21\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        .</span><span class=\"mtk6\">max</span><span class=\"mtk1\">(</span><span class=\"mtk7\">20</span><span class=\"mtk1\">, </span><span class=\"mtk16\">&quot;Must be 20 characters or less&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"22\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        .</span><span class=\"mtk6\">required</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;Please enter your first name&quot;</span><span class=\"mtk1\">),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"23\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">lastName</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Yup</span><span class=\"mtk1\">.</span><span class=\"mtk6\">string</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"24\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        .</span><span class=\"mtk6\">max</span><span class=\"mtk1\">(</span><span class=\"mtk7\">20</span><span class=\"mtk1\">, </span><span class=\"mtk16\">&quot;Must be 20 characters or less&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"25\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        .</span><span class=\"mtk6\">required</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;Please enter your last name&quot;</span><span class=\"mtk1\">),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"26\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">email</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Yup</span><span class=\"mtk1\">.</span><span class=\"mtk6\">string</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"27\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        .</span><span class=\"mtk6\">email</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;Invalid email address&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"28\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        .</span><span class=\"mtk6\">required</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;Please enter your email address&quot;</span><span class=\"mtk1\">),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"29\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk3\">password</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3\">Yup</span><span class=\"mtk1\">.</span><span class=\"mtk6\">string</span><span class=\"mtk1\">()</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"30\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        .</span><span class=\"mtk6\">min</span><span class=\"mtk1\">(</span><span class=\"mtk7\">5</span><span class=\"mtk1\">, </span><span class=\"mtk16\">&quot;Must be 5 characters or more&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"31\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        .</span><span class=\"mtk6\">required</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;Please enter your password&quot;</span><span class=\"mtk1\">),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"32\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    }),</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"33\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"34\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk6\">onSubmit</span><span class=\"mtk14\">:</span><span class=\"mtk1\"> </span><span class=\"mtk3 mtki\">values</span><span class=\"mtk1\"> </span><span class=\"mtk10\">=&gt;</span><span class=\"mtk1\"> {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"35\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">dispatch</span><span class=\"mtk1\">(</span><span class=\"mtk6\">registerUser</span><span class=\"mtk1\">(</span><span class=\"mtk3\">values</span><span class=\"mtk1\">))</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"36\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    },</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"37\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  })</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"38\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"39\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk3\">userRegistered</span><span class=\"mtk1\">) {</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"40\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk3\">history</span><span class=\"mtk1\">.</span><span class=\"mtk6\">push</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;/login&quot;</span><span class=\"mtk1\">)</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"41\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  }</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"42\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"43\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  </span><span class=\"mtk10\">return</span><span class=\"mtk1\"> (</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"44\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;register-form-container&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"45\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;col-10 col-sm-8 col-md-5 mx-auto&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"46\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">h1</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;font-weight-bold&quot;</span><span class=\"mtk6\">&gt;</span><span class=\"mtk1\">Register</span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">h1</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"47\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"48\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"49\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">form</span><span class=\"mtk1\"> </span><span class=\"mtk10\">onSubmit</span><span class=\"mtk12\">=</span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk7\">handleSubmit</span><span class=\"mtk10\">}</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"50\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-group col-10 col-sm-8 col-md-5 mx-auto mt-5&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"51\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk10\">{</span><span class=\"mtk3\">error</span><span class=\"mtk1\"> </span><span class=\"mtk10\">&amp;&amp;</span><span class=\"mtk1\"> (</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"52\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;alert alert-danger&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk10\">role</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;alert&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"53\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">              </span><span class=\"mtk10\">{</span><span class=\"mtk3\">error</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"54\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"55\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          )</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"56\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">label</span><span class=\"mtk1\"> </span><span class=\"mtk10\">htmlFor</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;firstName&quot;</span><span class=\"mtk6\">&gt;</span><span class=\"mtk1\">First Name</span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">label</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"57\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">input</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"58\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-control form-control-lg&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"59\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">id</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;firstName&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"60\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">name</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;firstName&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"61\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">type</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;text&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"62\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">{...</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk6\">getFieldProps</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;firstName&quot;</span><span class=\"mtk1\">)</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"63\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">/&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"64\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">touched</span><span class=\"mtk1\">.</span><span class=\"mtk7\">firstName</span><span class=\"mtk1\"> </span><span class=\"mtk10\">&amp;&amp;</span><span class=\"mtk1\"> </span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">errors</span><span class=\"mtk1\">.</span><span class=\"mtk7\">firstName</span><span class=\"mtk1\"> </span><span class=\"mtk10\">?</span><span class=\"mtk1\"> (</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"65\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">small</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-text text-danger&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"66\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">              </span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">errors</span><span class=\"mtk1\">.</span><span class=\"mtk7\">firstName</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"67\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">small</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"68\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          ) </span><span class=\"mtk10\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">null</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"69\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"70\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-group col-10 col-sm-8 col-md-5 mx-auto&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"71\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">label</span><span class=\"mtk1\"> </span><span class=\"mtk10\">htmlFor</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;lastName&quot;</span><span class=\"mtk6\">&gt;</span><span class=\"mtk1\">Last Name</span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">label</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"72\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">input</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"73\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-control form-control-lg&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"74\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">id</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;lastName&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"75\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">name</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;lastName&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"76\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">type</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;text&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"77\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">{...</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk6\">getFieldProps</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;lastName&quot;</span><span class=\"mtk1\">)</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"78\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">/&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"79\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">touched</span><span class=\"mtk1\">.</span><span class=\"mtk7\">lastName</span><span class=\"mtk1\"> </span><span class=\"mtk10\">&amp;&amp;</span><span class=\"mtk1\"> </span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">errors</span><span class=\"mtk1\">.</span><span class=\"mtk7\">lastName</span><span class=\"mtk1\"> </span><span class=\"mtk10\">?</span><span class=\"mtk1\"> (</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"80\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">small</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-text text-danger&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"81\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">              </span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">errors</span><span class=\"mtk1\">.</span><span class=\"mtk7\">lastName</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"82\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">small</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"83\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          ) </span><span class=\"mtk10\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">null</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"84\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"85\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-group col-10 col-sm-8 col-md-5 mx-auto&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"86\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">label</span><span class=\"mtk1\"> </span><span class=\"mtk10\">htmlFor</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;email&quot;</span><span class=\"mtk6\">&gt;</span><span class=\"mtk1\">Email</span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">label</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"87\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">input</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"88\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-control form-control-lg&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"89\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">id</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;email&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"90\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">name</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;email&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"91\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">type</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;email&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"92\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">{...</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk6\">getFieldProps</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;email&quot;</span><span class=\"mtk1\">)</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"93\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">/&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"94\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">touched</span><span class=\"mtk1\">.</span><span class=\"mtk7\">email</span><span class=\"mtk1\"> </span><span class=\"mtk10\">&amp;&amp;</span><span class=\"mtk1\"> </span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">errors</span><span class=\"mtk1\">.</span><span class=\"mtk7\">email</span><span class=\"mtk1\"> </span><span class=\"mtk10\">?</span><span class=\"mtk1\"> (</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"95\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">small</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-text text-danger&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"96\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">              </span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">errors</span><span class=\"mtk1\">.</span><span class=\"mtk7\">email</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"97\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">small</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"98\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          ) </span><span class=\"mtk10\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">null</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"99\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"100\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-group col-10 col-sm-8 col-md-5 mx-auto&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"101\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">label</span><span class=\"mtk1\"> </span><span class=\"mtk10\">htmlFor</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;password&quot;</span><span class=\"mtk6\">&gt;</span><span class=\"mtk1\">Password</span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">label</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"102\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">input</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"103\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-control form-control-lg&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"104\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">id</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;password&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"105\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">name</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;password&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"106\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">type</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;password&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"107\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">{...</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk6\">getFieldProps</span><span class=\"mtk1\">(</span><span class=\"mtk16\">&quot;password&quot;</span><span class=\"mtk1\">)</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"108\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">/&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"109\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">touched</span><span class=\"mtk1\">.</span><span class=\"mtk7\">password</span><span class=\"mtk1\"> </span><span class=\"mtk10\">&amp;&amp;</span><span class=\"mtk1\"> </span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">errors</span><span class=\"mtk1\">.</span><span class=\"mtk7\">password</span><span class=\"mtk1\"> </span><span class=\"mtk10\">?</span><span class=\"mtk1\"> (</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"110\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">small</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;form-text text-danger&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"111\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">              </span><span class=\"mtk10\">{</span><span class=\"mtk3\">formik</span><span class=\"mtk1\">.</span><span class=\"mtk3\">errors</span><span class=\"mtk1\">.</span><span class=\"mtk7\">password</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"112\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">small</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"113\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          ) </span><span class=\"mtk10\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">null</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"114\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"115\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;col-10 col-sm-8 col-md-5 mx-auto&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"116\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">button</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"117\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">type</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;submit&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"118\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;btn btn-lg btn-primary btn-block register-button&quot;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"119\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"120\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            </span><span class=\"mtk10\">{</span><span class=\"mtk3\">status</span><span class=\"mtk1\"> </span><span class=\"mtk10\">===</span><span class=\"mtk1\"> </span><span class=\"mtk16\">&quot;loading&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk10\">?</span><span class=\"mtk1\"> (</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"121\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">              </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">div</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;spinner-border text-light&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk10\">role</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;status&quot;</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"122\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">                </span><span class=\"mtk6\">&lt;</span><span class=\"mtk8\">span</span><span class=\"mtk1\"> </span><span class=\"mtk10\">className</span><span class=\"mtk12\">=</span><span class=\"mtk16\">&quot;sr-only&quot;</span><span class=\"mtk6\">&gt;</span><span class=\"mtk1\">Loading...</span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">span</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"123\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">              </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line grvsc-line-highlighted\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"124\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            ) </span><span class=\"mtk10\">:</span><span class=\"mtk1\"> </span><span class=\"mtk5\">null</span><span class=\"mtk10\">}{</span><span class=\"mtk16\">&quot; &quot;</span><span class=\"mtk10\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"125\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">            Register</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"126\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">          </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">button</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"127\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">        </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"128\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">      </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">form</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"129\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">    </span><span class=\"mtk6\">&lt;/</span><span class=\"mtk8\">div</span><span class=\"mtk6\">&gt;</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"130\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">  )</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"131\"></span><span class=\"grvsc-source\"><span class=\"mtk1\">}</span></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"132\"></span><span class=\"grvsc-source\"></span></span>\n<span class=\"grvsc-line\"><span class=\"grvsc-gutter-pad\"></span><span class=\"grvsc-gutter grvsc-line-number\" aria-hidden=\"true\" data-content=\"133\"></span><span class=\"grvsc-source\"><span class=\"mtk8\">export</span><span class=\"mtk1\"> </span><span class=\"mtk10\">default</span><span class=\"mtk1\"> </span><span class=\"mtk3\">RegisterForm</span></span></span></code></pre>\n<p>Let’s understand what’s going on in the file.</p>\n<p><strong>Line 4:</strong> We import <del>useDispatch</del> and <del>useSelector</del> hooks from <del>react-redux</del>. We can read data from the store using <del>useSelector</del> and dispatch actions to the store using <del>useDispatch</del>.</p>\n<p><strong>Line 5:</strong> We import the <del>registerUser</del> thunk from the <del>registerSlice.js</del> file.</p>\n<p><strong>Line 7:</strong> The <del>RegisterForm</del> component is wrapped by the <del>Route</del> component from <del>react-router-dom</del>. Therefore, we have access to the <del>history</del> prop.</p>\n<p><strong>Line 8:</strong> We get access to the <del>dispatch</del> function of the Redux store using the <del>useDispatch</del> hook from <del>react-redux</del>.</p>\n<p><strong>Line 10:</strong> We use the <del>useSelector</del> hook to access the <del>register</del> slice of the global Redux store. Note that the state passed as the first argument to the <del>useSelector</del> function refers to the global Redux store. We then extract the <del>status</del>, <del>userRegistered</del> and the <del>error</del> fields of the <del>register</del> object.</p>\n<p><strong>Line 35:</strong> When a user fills in the registration form and clicks on the <del>Register</del> button, we send the <del>registerUser</del> thunk to the store. We pass in the <del>values</del> variable as an argument of the <del>dispatch</del> function. We know that the <del>values</del> variable refers to our form data.</p>\n<blockquote>\n<p><strong>Note:</strong> We can only pass one argument to the thunk when we dispatch it. For multiple values, we need to pass them in a single object.</p>\n</blockquote>\n<p><strong>Line [39-41]:</strong> We check for the <del>userRegistered</del> value. Only when our API call succeeds (<em>meaning when a user is successfully registered</em>), we change the value of <del>userRegistered</del> from <del>null</del> to <del>true</del>. And when the value of <del>userRegistered</del> is <del>true</del>, we use the <del>history</del> prop to direct the user to the login form.</p>\n<p><strong>Line [51:55]:</strong> If the user registration process is unsuccessful, we show an error message at the top of the form. We use a Bootstrap alert component to show the error message.</p>\n<p><strong>Line [120:124]:</strong> We check the value of <del>status</del> and only when the value of <del>status</del> is <del>loading</del>, we show a spinner (<em>using the Bootstrap Spinner component</em>) next to the <del>Register</del> text.</p>\n<p><strong>What happens when a user clicks on the Register button?</strong></p>\n<p>When a user clicks on the <del>Register</del> button, we send the <del>registerUser</del> thunk to the store. A thunk can be dispatched like a regular action. We dispatch the thunk as the first argument of the <del>dispatch</del> function. The <del>dispatch</del> function is able to accept a function as its argument thanks to the <del>react-redux</del> middleware.</p>\n<p>Any value we dispatch to the Redux store passes through the <del>react-redux</del> middleware. If the action we send is a plain object, the middleware passes that action to the store. If the action is a function (<em>which is true in our case</em>), the middleware intercepts and invokes (executes) the function (the thunk).</p>\n<p>When we call <del>dispatch(registerUser())</del>, the <del>registerUser</del> thunk will first dispatch an action type of <del>register/registerUser/pending</del>. We listen to the pending action inside the <del>extraReducers</del> field and mark the value of the status field as <del>loading</del>. We then use this value to show a spinner inside the Register button.</p>\n<p>When the <del>registerUser</del> thunk is executed, We make a HTTP <del>POST</del> request to the <del>/api/users/register</del> endpoint. The Promise resolves and the server responds with a json object - <del>{“message” : “New user created”}</del>. This data is available as <del>action.payload</del>. We mark the <del>status</del> as <del>fulfilled</del>. We don’t do anything with <del>action.payload</del>. Instead, we change the value of the <del>userRegistered</del> field inside the <del>initialState</del> object from <del>null</del> to <del>true</del>. We then use this value in <del>RegisterForm</del> to direct the user to the login page.</p>\n<p>Go to <a href=\"https://hemanta.io/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-10/\">part-10</a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    position: relative;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n    line-height: 1.4;\n  }\n  \n  .grvsc-code {\n    display: table;\n  }\n  \n  .grvsc-line {\n    display: table-row;\n    box-sizing: border-box;\n    width: 100%;\n    position: relative;\n  }\n  \n  .grvsc-line > * {\n    position: relative;\n  }\n  \n  .grvsc-gutter-pad {\n    display: table-cell;\n    padding-left: 0.75rem;\n    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);\n  }\n  \n  .grvsc-gutter {\n    display: table-cell;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    user-select: none;\n  }\n  \n  .grvsc-gutter::before {\n    content: attr(data-content);\n  }\n  \n  .grvsc-source {\n    display: table-cell;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-source:empty::after {\n    content: ' ';\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    user-select: none;\n  }\n  \n  .grvsc-gutter + .grvsc-source {\n    padding-left: 0.75rem;\n    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);\n  }\n  \n  /* Line transformer styles */\n  \n  .grvsc-has-line-highlighting > .grvsc-code > .grvsc-line::before {\n    content: ' ';\n    position: absolute;\n    width: 100%;\n  }\n  \n  .grvsc-line-diff-add::before {\n    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));\n  }\n  \n  .grvsc-line-diff-del::before {\n    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));\n  }\n  \n  .grvsc-line-number {\n    padding: 0 2px;\n    text-align: right;\n    opacity: 0.7;\n  }\n  \n  .synthwave-84 { background-color: #262335; }\n  .synthwave-84 .mtki { font-style: italic; }\n  .synthwave-84 .mtk1 { color: #FFFFFF; }\n  .synthwave-84 .mtk6 { color: #36F9F6; }\n  .synthwave-84 .mtk10 { color: #FEDE5D; }\n  .synthwave-84 .mtk8 { color: #72F1B8; }\n  .synthwave-84 .mtk3 { color: #FF7EDB; }\n  .synthwave-84 .mtk16 { color: #FF8B39; }\n  .synthwave-84 .mtk14 { color: #B6B1B1; }\n  .synthwave-84 .mtk9 { color: #FE4450; }\n  .synthwave-84 .mtk12 { color: #FFFFFFEE; }\n  .synthwave-84 .mtk5 { color: #F97E72; }\n  .synthwave-84 .mtk7 { color: #2EE2FA; }\n  .synthwave-84 .grvsc-line-highlighted::before {\n    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));\n  }\n</style>","frontmatter":{"title":"Implement JWT Based User Authentication in a MERN Stack App - Part 9","date":"2021-05-23"}}},"pageContext":{"slug":"/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-9/","prev":{"fields":{"slug":"/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-8/"},"frontmatter":{"modules":null}},"next":{"fields":{"slug":"/implement-jwt-based-user-authentication-in-a-mern-stack-app-part-1/"},"frontmatter":{"modules":null}}}},
    "staticQueryHashes": ["3159585216"]}