{
    "componentChunkName": "component---src-pages-blog-markdown-remark-fields-slug-js",
    "path": "/blog/building-a-login-screen-with-react-and-bootstrap",
    "result": {"data":{"markdownRemark":{"html":"<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents 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>Table of Contents</h2>\n<ul>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#prerequisites\">Prerequisites</a></li>\n<li><a href=\"#step-1-setting-up-the-project\">Step 1: Setting Up the Project</a></li>\n<li><a href=\"#step-2-creating-the-login-component\">Step 2: Creating the Login Component</a></li>\n<li><a href=\"#step-3-styling-the-login-page\">Step 3: Styling the Login Page</a></li>\n<li><a href=\"#step-4-handling-user-input\">Step 4: Handling User Input</a></li>\n<li><a href=\"#step-5-adding-form-validation\">Step 5: Adding Form Validation</a></li>\n<li><a href=\"#step-6-connecting-to-a-backend\">Step 6: Connecting to a Backend</a></li>\n<li><a href=\"#step-7-implementing-authentication\">Step 7: Implementing Authentication</a></li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n</ul>\n<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction 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>Introduction</h2>\n<p>In this comprehensive guide, we’ll walk you through the process of building a login page using React and Bootstrap. Whether you’re a seasoned developer or just starting out, this tutorial will help you create a professional-looking login component that’s both responsive and user-friendly.</p>\n<h2 id=\"prerequisites\" style=\"position:relative;\"><a href=\"#prerequisites\" aria-label=\"prerequisites 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>Prerequisites</h2>\n<p>Before we dive in, make sure you have the following:</p>\n<ul>\n<li><strong>Basic Understanding of React</strong>: You should be familiar with React’s component-based architecture, JSX syntax, and how to manage state and props. Understanding React hooks, particularly useState and useEffect, will be beneficial as we’ll be using them extensively in our login component.</li>\n<li><strong>Familiarity with Bootstrap</strong>: A general understanding of Bootstrap’s grid system, utility classes, and component library will help you follow along more easily. We’ll be leveraging Bootstrap’s pre-built components to create a responsive and visually appealing login page.</li>\n<li><strong>Development Environment</strong>: Ensure you have Node.js and npm (Node Package Manager) installed on your machine. These tools are essential for creating and managing React projects. Additionally, having a code editor like Visual Studio Code will make the development process smoother.</li>\n<li><strong>Command Line Basics</strong>: You should be comfortable using the command line interface to run npm commands and navigate your project directory.</li>\n<li><strong>HTML/CSS Knowledge</strong>: While we’ll be using React and Bootstrap, a good grasp of HTML structure and CSS styling principles will help you understand and customize the login page design.</li>\n</ul>\n<h2 id=\"step-1-setting-up-the-project\" style=\"position:relative;\"><a href=\"#step-1-setting-up-the-project\" aria-label=\"step 1 setting up the project 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>Step 1: Setting Up the Project</h2>\n<p>Let’s start by creating a new React project and setting up Bootstrap.</p>\n<p><strong>1. Open your terminal and run the following command to create a new React project:</strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"98765338769260280000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`npx create-react-app react-login-page\ncd react-login-page`, `98765338769260280000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">npx create-react-app react-login-page\n<span class=\"token builtin class-name\">cd</span> react-login-page</code></pre></div>\n<p><strong>2. Install Bootstrap and its dependencies:</strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"99567778537206660000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`npm install bootstrap react-bootstrap`, `99567778537206660000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> bootstrap react-bootstrap</code></pre></div>\n<p><strong>3. Open src/index.js and import Bootstrap CSS:</strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"60093922721945160000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import 'bootstrap/dist/css/bootstrap.min.css';`, `60093922721945160000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">import</span> <span class=\"token string\">'bootstrap/dist/css/bootstrap.min.css'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>4. Create a new file src/components/Login.js for our login component.</strong></p>\n<h2 id=\"step-2-creating-the-login-component\" style=\"position:relative;\"><a href=\"#step-2-creating-the-login-component\" aria-label=\"step 2 creating the login component 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>Step 2: Creating the Login Component</h2>\n<p>Now we’ll dive into the heart of our login page – the Login component. This React component will contain all the necessary elements for user authentication. We’ll use React’s <code class=\"language-text\">useState</code> hook to manage the form’s state, allowing us to capture and control user input efficiently. The component will include input fields for email and password, along with a submit button, all styled using Bootstrap classes for a clean, professional look.</p>\n<p>In <code class=\"language-text\">src/components/Login.js</code>, add the following code:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"98972053566463790000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`// Login.js:\nimport React, { useState } from 'react';\nimport { Form, Button, Container, Row, Col } from 'react-bootstrap';\n\nfunction Login() {\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n\n  const handleSubmit = (event) => {\n    event.preventDefault();\n    console.log('Login attempted with:', { email, password });\n    // Here you would typically send a request to your server\n  };\n\n  return (\n    <Container>\n      <Row className=&quot;justify-content-md-center mt-5&quot;>\n        <Col xs={12} md={6}>\n          <h2 className=&quot;text-center mb-4&quot;>Login</h2>\n          <Form onSubmit={handleSubmit}>\n            <Form.Group className=&quot;mb-3&quot; controlId=&quot;formBasicEmail&quot;>\n              <Form.Label>Email address</Form.Label>\n              <Form.Control\n                type=&quot;email&quot;\n                placeholder=&quot;Enter email&quot;\n                value={email}\n                onChange={(e) => setEmail(e.target.value)}\n              />\n            </Form.Group>\n\n            <Form.Group className=&quot;mb-3&quot; controlId=&quot;formBasicPassword&quot;>\n              <Form.Label>Password</Form.Label>\n              <Form.Control\n                type=&quot;password&quot;\n                placeholder=&quot;Password&quot;\n                value={password}\n                onChange={(e) => setPassword(e.target.value)}\n              />\n            </Form.Group>\n\n            <Button variant=&quot;primary&quot; type=&quot;submit&quot; className=&quot;w-100&quot;>\n              Login\n            </Button>\n          </Form>\n        </Col>\n      </Row>\n    </Container>\n  );\n}\n\nexport default Login;`, `98972053566463790000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Login.js:</span>\n<span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Form<span class=\"token punctuation\">,</span> Button<span class=\"token punctuation\">,</span> Container<span class=\"token punctuation\">,</span> Row<span class=\"token punctuation\">,</span> Col <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Login</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>email<span class=\"token punctuation\">,</span> setEmail<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>password<span class=\"token punctuation\">,</span> setPassword<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Login attempted with:'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> email<span class=\"token punctuation\">,</span> password <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Here you would typically send a request to your server</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Row className<span class=\"token operator\">=</span><span class=\"token string\">\"justify-content-md-center mt-5\"</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Col xs<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">12</span><span class=\"token punctuation\">}</span> md<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">6</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>h2 className<span class=\"token operator\">=</span><span class=\"token string\">\"text-center mb-4\"</span><span class=\"token operator\">></span>Login<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Form onSubmit<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Group className<span class=\"token operator\">=</span><span class=\"token string\">\"mb-3\"</span> controlId<span class=\"token operator\">=</span><span class=\"token string\">\"formBasicEmail\"</span><span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Label<span class=\"token operator\">></span>Email address<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Label<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Control\n                type<span class=\"token operator\">=</span><span class=\"token string\">\"email\"</span>\n                placeholder<span class=\"token operator\">=</span><span class=\"token string\">\"Enter email\"</span>\n                value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>email<span class=\"token punctuation\">}</span>\n                onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setEmail</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n              <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Group<span class=\"token operator\">></span>\n\n            <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Group className<span class=\"token operator\">=</span><span class=\"token string\">\"mb-3\"</span> controlId<span class=\"token operator\">=</span><span class=\"token string\">\"formBasicPassword\"</span><span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Label<span class=\"token operator\">></span>Password<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Label<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Control\n                type<span class=\"token operator\">=</span><span class=\"token string\">\"password\"</span>\n                placeholder<span class=\"token operator\">=</span><span class=\"token string\">\"Password\"</span>\n                value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>password<span class=\"token punctuation\">}</span>\n                onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setPassword</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n              <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Group<span class=\"token operator\">></span>\n\n            <span class=\"token operator\">&lt;</span>Button variant<span class=\"token operator\">=</span><span class=\"token string\">\"primary\"</span> type<span class=\"token operator\">=</span><span class=\"token string\">\"submit\"</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"w-100\"</span><span class=\"token operator\">></span>\n              Login\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Col<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Row<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Login<span class=\"token punctuation\">;</span></code></pre></div>\n<p>This creates a basic login form with email and password fields using React Bootstrap components.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e95c5aa218ce18901929be2d4e8308b8/21482/login-form.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: 63.291139240506325%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA6UlEQVQ4y82RSw6CMBCGOa+vlUcScOFBxMQD+FrLSiASKk5nflMKWBJ8xoWTfCEzTL+2U09KQpdrzb0GYkCz858e4uGN2B0O2O73bS5Pej0RgcEEESHPcxRFgbYugvJSQilVmZr6I6oTtkKtkSQJ0jQDM8PdrOnrw3V0hFcipNkZl5LMyEBaXtIrNNeqUtEQdQKgnGm9xrocIbNNNrFg4DMmocZkzhXjkDFdWEYht3XDMGBsY7u2cVhhfdxjJpgtBcFKEEQWPxIs1hY/utcNpjfOamHnys4Mvgl3bedRzFfzZ/Q/yg/j/4U3kXb1oX/ayysAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"login form\"\n        title=\"login form\"\n        src=\"/static/e95c5aa218ce18901929be2d4e8308b8/f058b/login-form.png\"\n        srcset=\"/static/e95c5aa218ce18901929be2d4e8308b8/c26ae/login-form.png 158w,\n/static/e95c5aa218ce18901929be2d4e8308b8/6bdcf/login-form.png 315w,\n/static/e95c5aa218ce18901929be2d4e8308b8/f058b/login-form.png 630w,\n/static/e95c5aa218ce18901929be2d4e8308b8/40601/login-form.png 945w,\n/static/e95c5aa218ce18901929be2d4e8308b8/78612/login-form.png 1260w,\n/static/e95c5aa218ce18901929be2d4e8308b8/21482/login-form.png 1350w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\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<h2 id=\"step-3-styling-the-login-page\" style=\"position:relative;\"><a href=\"#step-3-styling-the-login-page\" aria-label=\"step 3 styling the login page 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>Step 3: Styling the Login Page</h2>\n<p>Bootstrap provides pre-styled components, but let’s add some custom CSS to make our login page stand out. Create a new file <code class=\"language-text\">src/components/Login.css</code> and add the following styles:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"72661839357703960000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`.login-wrapper {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  min-height: 100vh;\n  padding: 20px;\n}\n\n.login-form-container {\n  width: 100%;\n  max-width: 400px;\n  padding: 20px;\n  border-radius: 5px;\n  box-shadow: 0 0 10px rgba(0,0,0,0.1);\n  background-color: #fff;\n}\n\n.login-title {\n  text-align: center;\n  margin-bottom: 20px;\n}\n\n.login-form {\n  margin-bottom: 15px;\n}\n\n.login-button {\n  width: 100%;\n}`, `72661839357703960000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.login-wrapper</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">min-height</span><span class=\"token punctuation\">:</span> 100vh<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 20px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.login-form-container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 400px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 20px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">border-radius</span><span class=\"token punctuation\">:</span> 5px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 0 0 10px <span class=\"token function\">rgba</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span>0<span class=\"token punctuation\">,</span>0<span class=\"token punctuation\">,</span>0.1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> #fff<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.login-title</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin-bottom</span><span class=\"token punctuation\">:</span> 20px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.login-form</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin-bottom</span><span class=\"token punctuation\">:</span> 15px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.login-button</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now, update your <code class=\"language-text\">Login.js</code> to import and use these styles:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"94712039324010090000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import React, { useState } from 'react';\nimport { Form, Button, Container } from 'react-bootstrap';\nimport './Login.css';\n\nfunction Login() {\n  // ... (previous state and handleSubmit code)\n\n  return (\n    <div className=&quot;login-wrapper&quot;>\n      <div className=&quot;login-form-container&quot;>\n        <h2 className=&quot;login-title&quot;>Login</h2>\n        <Form onSubmit={handleSubmit}>\n          {/* ... */}\n\n          <Button variant=&quot;primary&quot; type=&quot;submit&quot; className=&quot;login-button&quot;>\n            Login\n          </Button>\n        </Form>\n      </div>\n    </div>\n  );\n}\n\nexport default Login;`, `94712039324010090000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Form<span class=\"token punctuation\">,</span> Button<span class=\"token punctuation\">,</span> Container <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">'./Login.css'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Login</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ... (previous state and handleSubmit code)</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"login-wrapper\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"login-form-container\"</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>h2 className<span class=\"token operator\">=</span><span class=\"token string\">\"login-title\"</span><span class=\"token operator\">></span>Login<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Form onSubmit<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token comment\">/* ... */</span><span class=\"token punctuation\">}</span>\n\n          <span class=\"token operator\">&lt;</span>Button variant<span class=\"token operator\">=</span><span class=\"token string\">\"primary\"</span> type<span class=\"token operator\">=</span><span class=\"token string\">\"submit\"</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"login-button\"</span><span class=\"token operator\">></span>\n            Login\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Login<span class=\"token punctuation\">;</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/60ab9e5db34db3bc14379273a18a3bae/712f7/focused-login-form.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: 81.64556962025317%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAABLElEQVQ4y61Uy0rEQBDcvxRvHryI36PgC3ygZ7/AF6In8ap7khyUNaxuslny6FSXzExGYmSziW6g6U5XqqamycyAS34GvlDV79wn6twfgk2g2W/Dejus0bs7rIMAiIogIoyimO9hyEKkwn2gm6Cr3TvKkkEQ8Hk4tOLeqcUWCXogms44Cj8YjicsSqX/XEBKqTZMv4OgW30yE76FMcPPGZOcTDLlNFObk9zlOFWWfRy+jsZMUmEuZFYoM1GXC2VaOIeqsO5bZuhdCikRyaw2s9+x0GEJRz5/BFf3levH4NohuHEKbp652vRWdsGdayMCy5kriGqGDy/g9hV4cAvu3YBHd+DJvatNb+sSvHiCFTSc1t8GqnO32Ax0PXpmVbOVtoD+4+j9+XJYxvX1BZvm5uWmmOqyAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"focused login form\"\n        title=\"focused login form\"\n        src=\"/static/60ab9e5db34db3bc14379273a18a3bae/f058b/focused-login-form.png\"\n        srcset=\"/static/60ab9e5db34db3bc14379273a18a3bae/c26ae/focused-login-form.png 158w,\n/static/60ab9e5db34db3bc14379273a18a3bae/6bdcf/focused-login-form.png 315w,\n/static/60ab9e5db34db3bc14379273a18a3bae/f058b/focused-login-form.png 630w,\n/static/60ab9e5db34db3bc14379273a18a3bae/40601/focused-login-form.png 945w,\n/static/60ab9e5db34db3bc14379273a18a3bae/712f7/focused-login-form.png 1181w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\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<h2 id=\"step-4-handling-user-input\" style=\"position:relative;\"><a href=\"#step-4-handling-user-input\" aria-label=\"step 4 handling user input 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>Step 4: Handling User Input</h2>\n<p>We’ve already set up state variables for email and password, and we’re updating them on input change. Let’s add some basic validation to improve user experience.\nUpdate your <code class=\"language-text\">Login.js</code> with the following changes:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"38204195057999260000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import React, { useState } from 'react';\nimport { Form, Button, Container, Alert } from 'react-bootstrap';\nimport './Login.css';\n\n\nfunction Login() {\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n  const [error, setError] = useState('');\n\n\n  const handleSubmit = (event) => {\n    event.preventDefault();\n    setError('');\n    if (!email || !password) {\n      setError('Please enter both email and password.');\n      return;\n    }\n    console.log('Login attempted with:', { email, password });\n    // Here you would typically send a request to your server\n  };\n\n\n  return (\n<div className=&quot;login-wrapper&quot;>\n    <div className=&quot;login-form-container&quot;>\n      <h2 className=&quot;login-title&quot;>Login</h2>\n  {error && <Alert variant=&quot;danger&quot;>{error}</Alert>}\n          <Form onSubmit={handleSubmit} className=&quot;login-form”>\n          {...}\n\n\n            <Button variant=&quot;primary&quot; type=&quot;submit&quot; className=&quot;login-button&quot;>\n          Login\n        </Button>\n      </Form>\n      </div>\n      </div>\n\n\n  );\n}\n\n\nexport default Login;\n`, `38204195057999260000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Form<span class=\"token punctuation\">,</span> Button<span class=\"token punctuation\">,</span> Container<span class=\"token punctuation\">,</span> Alert <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">'./Login.css'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Login</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>email<span class=\"token punctuation\">,</span> setEmail<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>password<span class=\"token punctuation\">,</span> setPassword<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>error<span class=\"token punctuation\">,</span> setError<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setError</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>email <span class=\"token operator\">||</span> <span class=\"token operator\">!</span>password<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setError</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Please enter both email and password.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Login attempted with:'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> email<span class=\"token punctuation\">,</span> password <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Here you would typically send a request to your server</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n<span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"login-wrapper\"</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"login-form-container\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h2 className<span class=\"token operator\">=</span><span class=\"token string\">\"login-title\"</span><span class=\"token operator\">></span>Login<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">{</span>error <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">&lt;</span>Alert variant<span class=\"token operator\">=</span><span class=\"token string\">\"danger\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>error<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Alert<span class=\"token operator\">></span><span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span>Form onSubmit<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span> className<span class=\"token operator\">=</span>\"login<span class=\"token operator\">-</span>form”<span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token punctuation\">}</span>\n\n\n            <span class=\"token operator\">&lt;</span>Button variant<span class=\"token operator\">=</span><span class=\"token string\">\"primary\"</span> type<span class=\"token operator\">=</span><span class=\"token string\">\"submit\"</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"login-button\"</span><span class=\"token operator\">></span>\n          Login\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n\n\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Login<span class=\"token punctuation\">;</span>\n</code></pre></div>\n<p>This adds basic validation for empty fields and a simple email format check.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/8fc926ba83d0760dc24bb1ce9a4165c9/ecf19/error-login-form.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: 67.08860759493672%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABSUlEQVQ4y5WRSU4DMRBFuRcSRFyAaxGSbBE3AbIiZAAhNiCxY8GSHkOm7rS7qx6yuwMhkxJLX+Vfcj2Xy0eqCqooUBiD8QMyb4f8ABOE5EFIMZ+7OlevbsfRMlCSlGjwjNfp43cf8R4G+N1Bte/zdd8j6D2RvL6Tvr2Tj8a7ga7DaEgWxWTRkOJ75CRVXJUYg6t0iCXgwmRZhh9GeEFIGMfukm2yS5Zq/3dYJUSENE2ZzWYks4TFZdtkz28ELowxhtF4wmQ6JS/Kw7IJtA/QygKjOCaKh+R5YUeLyB9kTduAvwkVyBNMOgbNqkntmqQ48BpQyr/nwxNqLaXWglpTOWlYL5xfCWctcf60Weq4Lrx8iqsTWXtyCfRGwuWdUr9dRKXRVq47SrNdepu3urhRPsMKqNuejBystScvGxvzYn+twjZ0ePha/eUf7jjo0xqCmC8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"error login form\"\n        title=\"error login form\"\n        src=\"/static/8fc926ba83d0760dc24bb1ce9a4165c9/f058b/error-login-form.png\"\n        srcset=\"/static/8fc926ba83d0760dc24bb1ce9a4165c9/c26ae/error-login-form.png 158w,\n/static/8fc926ba83d0760dc24bb1ce9a4165c9/6bdcf/error-login-form.png 315w,\n/static/8fc926ba83d0760dc24bb1ce9a4165c9/f058b/error-login-form.png 630w,\n/static/8fc926ba83d0760dc24bb1ce9a4165c9/40601/error-login-form.png 945w,\n/static/8fc926ba83d0760dc24bb1ce9a4165c9/ecf19/error-login-form.png 948w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\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<h2 id=\"step-5-adding-form-validation\" style=\"position:relative;\"><a href=\"#step-5-adding-form-validation\" aria-label=\"step 5 adding form validation 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>Step 5: Adding Form Validation</h2>\n<p>Proper input handling is crucial for any form, especially a login form. We’ll implement onChange handlers to update our component’s state as the user types. This step lays the groundwork for form validation and submission, ensuring we have access to the most up-to-date user input at all times.</p>\n<p>Update <code class=\"language-text\">src/components/Login.js</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"3778703235704328000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import React, { useState } from 'react';\nimport { Form, Button, Alert } from 'react-bootstrap';\nimport './Login.css';\n\n\nfunction Login() {\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n  const [errors, setErrors] = useState({});\n\n\n  const validateForm = () => {\n    const newErrors = {};\n    if (!email) newErrors.email = 'Email is required';\n    else if (!/\\S+@\\S+\\.\\S+/.test(email)) newErrors.email = 'Email is invalid';\n    if (!password) newErrors.password = 'Password is required';\n    else if (password.length < 6) newErrors.password = 'Password must be at least 6 characters';\n    return newErrors;\n  };\n\n\n  const handleSubmit = (event) => {\n    event.preventDefault();\n    const formErrors = validateForm();\n    if (Object.keys(formErrors).length > 0) {\n      setErrors(formErrors);\n    } else {\n      setErrors({});\n      console.log('Login attempted with:', { email, password });\n      // Here you would typically send a request to your server\n    }\n  };\n\n\n  return (\n    <div className=&quot;login-wrapper&quot;>\n      <div className=&quot;login-form-container&quot;>\n        <h2 className=&quot;login-title&quot;>Login</h2>\n        <Form onSubmit={handleSubmit} className=&quot;login-form&quot;>\n          <Form.Group className=&quot;mb-3&quot; controlId=&quot;formBasicEmail&quot;>\n            <Form.Label>Email address</Form.Label>\n            <Form.Control\n              type=&quot;email&quot;\n              placeholder=&quot;Enter email&quot;\n              value={email}\n              onChange={(e) => setEmail(e.target.value)}\n              isInvalid={!!errors.email}\n            />\n            <Form.Control.Feedback type=&quot;invalid&quot;>\n              {errors.email}\n            </Form.Control.Feedback>\n          </Form.Group>\n\n\n          <Form.Group className=&quot;mb-3&quot; controlId=&quot;formBasicPassword&quot;>\n            <Form.Label>Password</Form.Label>\n            <Form.Control\n              type=&quot;password&quot;\n              placeholder=&quot;Password&quot;\n              value={password}\n              onChange={(e) => setPassword(e.target.value)}\n              isInvalid={!!errors.password}\n            />\n            <Form.Control.Feedback type=&quot;invalid&quot;>\n              {errors.password}\n            </Form.Control.Feedback>\n          </Form.Group>\n\n\n          <Button variant=&quot;primary&quot; type=&quot;submit&quot; className=&quot;login-button&quot;>\n            Login\n          </Button>\n        </Form>\n      </div>\n    </div>\n  );\n}\n\n\nexport default Login;`, `3778703235704328000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Form<span class=\"token punctuation\">,</span> Button<span class=\"token punctuation\">,</span> Alert <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">'./Login.css'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Login</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>email<span class=\"token punctuation\">,</span> setEmail<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>password<span class=\"token punctuation\">,</span> setPassword<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>errors<span class=\"token punctuation\">,</span> setErrors<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">validateForm</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> newErrors <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>email<span class=\"token punctuation\">)</span> newErrors<span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> <span class=\"token string\">'Email is required'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">\\S+@\\S+\\.\\S+</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> newErrors<span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> <span class=\"token string\">'Email is invalid'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>password<span class=\"token punctuation\">)</span> newErrors<span class=\"token punctuation\">.</span>password <span class=\"token operator\">=</span> <span class=\"token string\">'Password is required'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>password<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&lt;</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span> newErrors<span class=\"token punctuation\">.</span>password <span class=\"token operator\">=</span> <span class=\"token string\">'Password must be at least 6 characters'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> newErrors<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> formErrors <span class=\"token operator\">=</span> <span class=\"token function\">validateForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Object<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span>formErrors<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setErrors</span><span class=\"token punctuation\">(</span>formErrors<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setErrors</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Login attempted with:'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> email<span class=\"token punctuation\">,</span> password <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// Here you would typically send a request to your server</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"login-wrapper\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"login-form-container\"</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>h2 className<span class=\"token operator\">=</span><span class=\"token string\">\"login-title\"</span><span class=\"token operator\">></span>Login<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Form onSubmit<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"login-form\"</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Group className<span class=\"token operator\">=</span><span class=\"token string\">\"mb-3\"</span> controlId<span class=\"token operator\">=</span><span class=\"token string\">\"formBasicEmail\"</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Label<span class=\"token operator\">></span>Email address<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Label<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Control\n              type<span class=\"token operator\">=</span><span class=\"token string\">\"email\"</span>\n              placeholder<span class=\"token operator\">=</span><span class=\"token string\">\"Enter email\"</span>\n              value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>email<span class=\"token punctuation\">}</span>\n              onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setEmail</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n              isInvalid<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span>errors<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span>\n            <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Control<span class=\"token punctuation\">.</span>Feedback type<span class=\"token operator\">=</span><span class=\"token string\">\"invalid\"</span><span class=\"token operator\">></span>\n              <span class=\"token punctuation\">{</span>errors<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Control<span class=\"token punctuation\">.</span>Feedback<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Group<span class=\"token operator\">></span>\n\n\n          <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Group className<span class=\"token operator\">=</span><span class=\"token string\">\"mb-3\"</span> controlId<span class=\"token operator\">=</span><span class=\"token string\">\"formBasicPassword\"</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Label<span class=\"token operator\">></span>Password<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Label<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Control\n              type<span class=\"token operator\">=</span><span class=\"token string\">\"password\"</span>\n              placeholder<span class=\"token operator\">=</span><span class=\"token string\">\"Password\"</span>\n              value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>password<span class=\"token punctuation\">}</span>\n              onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setPassword</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n              isInvalid<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span>errors<span class=\"token punctuation\">.</span>password<span class=\"token punctuation\">}</span>\n            <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Form<span class=\"token punctuation\">.</span>Control<span class=\"token punctuation\">.</span>Feedback type<span class=\"token operator\">=</span><span class=\"token string\">\"invalid\"</span><span class=\"token operator\">></span>\n              <span class=\"token punctuation\">{</span>errors<span class=\"token punctuation\">.</span>password<span class=\"token punctuation\">}</span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Control<span class=\"token punctuation\">.</span>Feedback<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token punctuation\">.</span>Group<span class=\"token operator\">></span>\n\n\n          <span class=\"token operator\">&lt;</span>Button variant<span class=\"token operator\">=</span><span class=\"token string\">\"primary\"</span> type<span class=\"token operator\">=</span><span class=\"token string\">\"submit\"</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"login-button\"</span><span class=\"token operator\">></span>\n            Login\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Form<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Login<span class=\"token punctuation\">;</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e8e1190be7fd070f9f0539baf9b0f047/02cd5/email-error-login-form.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: 78.48101265822784%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+klEQVQ4y6WUyY7TQBCGfYc7jOARuPAqPMDcUODMAWkkJBYhxIFH4MJlJBYBFx4AISTggMQhxBLrZBy77W4vWRwndveH2o4TJSQDgpZ+Vblc/bv6d1U7AMYY/ne1HE7rWLsLWmsqrWu7K6flcFpHLzZsYnOdlPcb4bavet6Abvcz795/QKmYbRLtJNy20jTFdV16PZc8z1vF1rBGuNKpIpIxkUroewEyTtGLLctKDJSVodQLVAbdnm5ZoS3faGalRsQ5x4HCEwlCDUnHc0bTinGhGU81k8Iwma0wLgxZbqiqaimT0x601KCGs5rwe18wCJOa2BIWFUznkM+hKGFaNs+TOQyLdU0d/ekh2be3dUVKKVSSkWaj+shSJYQyxvMFIpRIldL3fAIh67iKU8JIIqUkSRKyLMPJf7wh8VxEFOP7AT+PjjmuN0UEYVQTDfyAQIS17w18Br6o31vNhc0Roi4mjmOcaiG21QFmUGZQDm30r6ekLK2GTT869oc0GhgevU658Tji7nPJ7achtxa4/zLi3ouIm09WsTvPQg4OBa8+jprWWcjoNC3TEF56cMTp/S7nrrjsdXrsdVzOdlwuXv/KhWtfOHO5iVmcv+pyar/LwWHQVFmZP09Ki7Kys3zyrK81djs+VodGgsZuwmzxjdbbL4fG/gM2rq9fs83F7l3X6KsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"email error login form\"\n        title=\"email error login form\"\n        src=\"/static/e8e1190be7fd070f9f0539baf9b0f047/f058b/email-error-login-form.png\"\n        srcset=\"/static/e8e1190be7fd070f9f0539baf9b0f047/c26ae/email-error-login-form.png 158w,\n/static/e8e1190be7fd070f9f0539baf9b0f047/6bdcf/email-error-login-form.png 315w,\n/static/e8e1190be7fd070f9f0539baf9b0f047/f058b/email-error-login-form.png 630w,\n/static/e8e1190be7fd070f9f0539baf9b0f047/02cd5/email-error-login-form.png 821w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\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<h2 id=\"step-6-connecting-to-a-backend\" style=\"position:relative;\"><a href=\"#step-6-connecting-to-a-backend\" aria-label=\"step 6 connecting to a backend 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>Step 6: Connecting to a Backend</h2>\n<p>For this tutorial, we’ll simulate a backend response.In a real-world application, your login form would communicate with a backend server to authenticate users. We’ll simulate this process using a mock API. This step introduces you to the concept of asynchronous API calls in React and how to handle responses, setting the stage for integration with a real authentication system in the future.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"31214000635683512000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import axios from 'axios';\n\n\nconst API_URL = 'https://jsonplaceholder.typicode.com'; // Mock API\n\n\nexport const login = async (email, password) => {\n  try {\n    const response = await axios.post(\\`\\${API_URL}/users\\`, { email, password });\n    return response.data;\n  } catch (error) {\n    throw error;\n  }\n};\nUpdate src/components/Login.js:\n\n\nimport React, { useState } from 'react';\nimport { Form, Button, Container, Alert } from 'react-bootstrap';\nimport { login } from '../services/api';\nimport './Login.css';\n\n\nfunction Login() {\n  // ... (previous state and validation code)\n\n\n  const handleSubmit = async (event) => {\n    event.preventDefault();\n    const formErrors = validateForm();\n    if (Object.keys(formErrors).length > 0) {\n      setErrors(formErrors);\n    } else {\n      setErrors({});\n      try {\n        const userData = await login(email, password);\n        console.log('Login successful:', userData);\n        // Here you would typically store the user data and redirect\n      } catch (error) {\n        setErrors({ form: 'Login failed. Please try again.' });\n      }\n    }\n  };\n\n\n  // ... (rest of the component)\n}\n\n\nexport default Login;`, `31214000635683512000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> axios <span class=\"token keyword\">from</span> <span class=\"token string\">'axios'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">const</span> <span class=\"token constant\">API_URL</span> <span class=\"token operator\">=</span> <span class=\"token string\">'https://jsonplaceholder.typicode.com'</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Mock API</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">login</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">email<span class=\"token punctuation\">,</span> password</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> axios<span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token constant\">API_URL</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">/users</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> email<span class=\"token punctuation\">,</span> password <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> response<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">throw</span> error<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\nUpdate src<span class=\"token operator\">/</span>components<span class=\"token operator\">/</span>Login<span class=\"token punctuation\">.</span>js<span class=\"token operator\">:</span>\n\n\n<span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Form<span class=\"token punctuation\">,</span> Button<span class=\"token punctuation\">,</span> Container<span class=\"token punctuation\">,</span> Alert <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> login <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../services/api'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">'./Login.css'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Login</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ... (previous state and validation code)</span>\n\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> formErrors <span class=\"token operator\">=</span> <span class=\"token function\">validateForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Object<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span>formErrors<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setErrors</span><span class=\"token punctuation\">(</span>formErrors<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setErrors</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> userData <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">login</span><span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">,</span> password<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Login successful:'</span><span class=\"token punctuation\">,</span> userData<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// Here you would typically store the user data and redirect</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setErrors</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">form</span><span class=\"token operator\">:</span> <span class=\"token string\">'Login failed. Please try again.'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token comment\">// ... (rest of the component)</span>\n<span class=\"token punctuation\">}</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Login<span class=\"token punctuation\">;</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/6d2f9913e9a68fae3866f156ea1d7c12/29007/successfull-login.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: 50.632911392405056%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABL0lEQVQoz32PzU7CQBSF51kotMBM7+1voBUS3469PoMbH4Ao4MJ2psWF8UmMkf4AOu0YwBiDrSdnc8853+ISVdeqRflRba2SFWmEy6LcbrebLNtk2Smp/87a4CLP8yJT6lTVR7YJrqSsziSr17fsvdgXuyorZbGT5V7Ks1ldVR+fpPGdm2c1W6irSF1HarZUty/NX5OnJF0nacpFGouECy5SwcXigc+X/G7F71divjycgnMex4k4bOLHKI7iNRfk8mI6GQeB5QUUfcv1/NB3fBfBA3ABPETfQg/RAbRMcABtE5EyoOZ0FJIx2B4Dn5ohYDBkTn9gGwejPjC7xrk13dR06BrYZyH6xDEo03SPmRPXHTOAXv9nyjS9zVTTR8witjGknd53+i/w28NOb0TxC8/Be4m90C0TAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"successful login\"\n        title=\"successful login\"\n        src=\"/static/6d2f9913e9a68fae3866f156ea1d7c12/f058b/successfull-login.png\"\n        srcset=\"/static/6d2f9913e9a68fae3866f156ea1d7c12/c26ae/successfull-login.png 158w,\n/static/6d2f9913e9a68fae3866f156ea1d7c12/6bdcf/successfull-login.png 315w,\n/static/6d2f9913e9a68fae3866f156ea1d7c12/f058b/successfull-login.png 630w,\n/static/6d2f9913e9a68fae3866f156ea1d7c12/40601/successfull-login.png 945w,\n/static/6d2f9913e9a68fae3866f156ea1d7c12/78612/successfull-login.png 1260w,\n/static/6d2f9913e9a68fae3866f156ea1d7c12/29007/successfull-login.png 1600w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\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<h3 id=\"step-7-implementing-authentication\" style=\"position:relative;\"><a href=\"#step-7-implementing-authentication\" aria-label=\"step 7 implementing authentication 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>Step 7: Implementing Authentication</h3>\n<p>In a real application, you’d want to manage authentication state across your app. Here’s a simple example using React Context:</p>\n<p>Create a new file <code class=\"language-text\">src/context/AuthContext.js</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"82848090786763900000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import React, { createContext, useState, useContext } from 'react';\n\n\nconst AuthContext = createContext(null);\n\n\nexport const AuthProvider = ({ children }) => {\n  const [user, setUser] = useState(null);\n\n\n  const login = (userData) => {\n    setUser(userData);\n    localStorage.setItem('user', JSON.stringify(userData));\n  };\n\n\n  const logout = () => {\n    setUser(null);\n    localStorage.removeItem('user');\n  };\n\n\n  return (\n    <AuthContext.Provider value={{ user, login, logout }}>\n      {children}\n    </AuthContext.Provider>\n  );\n};\n\n\nexport const useAuth = () => useContext(AuthContext);`, `82848090786763900000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> createContext<span class=\"token punctuation\">,</span> useState<span class=\"token punctuation\">,</span> useContext <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">const</span> AuthContext <span class=\"token operator\">=</span> <span class=\"token function\">createContext</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">AuthProvider</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>user<span class=\"token punctuation\">,</span> setUser<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">login</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">userData</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setUser</span><span class=\"token punctuation\">(</span>userData<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    localStorage<span class=\"token punctuation\">.</span><span class=\"token function\">setItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">'user'</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>userData<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">logout</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setUser</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    localStorage<span class=\"token punctuation\">.</span><span class=\"token function\">removeItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">'user'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>AuthContext<span class=\"token punctuation\">.</span>Provider value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> user<span class=\"token punctuation\">,</span> login<span class=\"token punctuation\">,</span> logout <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n      <span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>AuthContext<span class=\"token punctuation\">.</span>Provider<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">useAuth</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useContext</span><span class=\"token punctuation\">(</span>AuthContext<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>Update <code class=\"language-text\">src/App.js</code> to use the AuthProvider:</strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"88301759676328350000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`Update src/App.js to use the AuthProvider:\n\n\nimport React from 'react';\nimport { AuthProvider } from './context/AuthContext';\nimport Login from './components/Login';\n\n\nfunction App() {\n  return (\n    <AuthProvider>\n      <div className=&quot;App&quot;>\n        <Login />\n      </div>\n    </AuthProvider>\n  );\n}\n\n\nexport default App;\nStep 8: Adding Navigation\nInstall React Router:\nnpm install react-router-dom\nCreate a new file src/components/Navigation.js:\nimport React from 'react';\nimport { Navbar, Nav, Container } from 'react-bootstrap';\nimport { Link } from 'react-router-dom';\nimport { useAuth } from '../context/AuthContext';\n\n\nfunction Navigation() {\n  const { user, logout } = useAuth();\n\n\n  return (\n    <Navbar bg=&quot;light&quot; expand=&quot;lg&quot;>\n      <Container>\n        <Navbar.Brand as={Link} to=&quot;/&quot;>My App</Navbar.Brand>\n        <Navbar.Toggle aria-controls=&quot;basic-navbar-nav&quot; />\n        <Navbar.Collapse id=&quot;basic-navbar-nav&quot;>\n          <Nav className=&quot;me-auto&quot;>\n            <Nav.Link as={Link} to=&quot;/&quot;>Home</Nav.Link>\n            {user && <Nav.Link as={Link} to=&quot;/profile&quot;>Profile</Nav.Link>}\n          </Nav>\n          <Nav>\n            {user ? (\n              <Nav.Link onClick={logout}>Logout</Nav.Link>\n            ) : (\n              <Nav.Link as={Link} to=&quot;/login&quot;>Login</Nav.Link>\n            )}\n          </Nav>\n        </Navbar.Collapse>\n      </Container>\n    </Navbar>\n  );\n}\n\n\nexport default Navigation;`, `88301759676328350000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">Update src<span class=\"token operator\">/</span>App<span class=\"token punctuation\">.</span>js to use the AuthProvider<span class=\"token operator\">:</span>\n\n\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AuthProvider <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./context/AuthContext'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Login <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/Login'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>AuthProvider<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"App\"</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Login <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>AuthProvider<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span>\nStep <span class=\"token number\">8</span><span class=\"token operator\">:</span> Adding Navigation\nInstall React Router<span class=\"token operator\">:</span>\nnpm install react<span class=\"token operator\">-</span>router<span class=\"token operator\">-</span>dom\nCreate a <span class=\"token keyword\">new</span> <span class=\"token class-name\">file</span> src<span class=\"token operator\">/</span>components<span class=\"token operator\">/</span>Navigation<span class=\"token punctuation\">.</span>js<span class=\"token operator\">:</span>\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Navbar<span class=\"token punctuation\">,</span> Nav<span class=\"token punctuation\">,</span> Container <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Link <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useAuth <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../context/AuthContext'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Navigation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> user<span class=\"token punctuation\">,</span> logout <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">useAuth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Navbar bg<span class=\"token operator\">=</span><span class=\"token string\">\"light\"</span> expand<span class=\"token operator\">=</span><span class=\"token string\">\"lg\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Navbar<span class=\"token punctuation\">.</span>Brand <span class=\"token keyword\">as</span><span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>My App<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Navbar<span class=\"token punctuation\">.</span>Brand<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Navbar<span class=\"token punctuation\">.</span>Toggle aria<span class=\"token operator\">-</span>controls<span class=\"token operator\">=</span><span class=\"token string\">\"basic-navbar-nav\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Navbar<span class=\"token punctuation\">.</span>Collapse id<span class=\"token operator\">=</span><span class=\"token string\">\"basic-navbar-nav\"</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Nav className<span class=\"token operator\">=</span><span class=\"token string\">\"me-auto\"</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Nav<span class=\"token punctuation\">.</span>Link <span class=\"token keyword\">as</span><span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>Home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Nav<span class=\"token punctuation\">.</span>Link<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">{</span>user <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">&lt;</span>Nav<span class=\"token punctuation\">.</span>Link <span class=\"token keyword\">as</span><span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/profile\"</span><span class=\"token operator\">></span>Profile<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Nav<span class=\"token punctuation\">.</span>Link<span class=\"token operator\">></span><span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Nav<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Nav<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">{</span>user <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span>\n              <span class=\"token operator\">&lt;</span>Nav<span class=\"token punctuation\">.</span>Link onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>logout<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>Logout<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Nav<span class=\"token punctuation\">.</span>Link<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>\n              <span class=\"token operator\">&lt;</span>Nav<span class=\"token punctuation\">.</span>Link <span class=\"token keyword\">as</span><span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/login\"</span><span class=\"token operator\">></span>Login<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Nav<span class=\"token punctuation\">.</span>Link<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Nav<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Navbar<span class=\"token punctuation\">.</span>Collapse<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Navbar<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Navigation<span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>Create placeholder components for Home and Profile:</strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"55367812312011870000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`src/components/Home.js:\n\n\nimport React from 'react';\nimport { Container } from 'react-bootstrap';\n\n\nfunction Home() {\n  return (\n    <Container>\n      <h1>Welcome to My App</h1>\n    </Container>\n  );\n}\n\n\nexport default Home;\n\n\n\n\nsrc/components/Profile.js:\n\n\nimport React from 'react';\nimport { Container } from 'react-bootstrap';\nimport { useAuth } from '../context/AuthContext';\n\n\nfunction Profile() {\n  const { user } = useAuth();\n\n\n  return (\n    <Container>\n      <h1>Profile</h1>\n      <p>Welcome, {user.email}!</p>\n    </Container>\n  );\n}\n\n\nexport default Profile;`, `55367812312011870000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">src<span class=\"token operator\">/</span>components<span class=\"token operator\">/</span>Home<span class=\"token punctuation\">.</span>js<span class=\"token operator\">:</span>\n\n\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Container <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Home</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>Welcome to My App<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Home<span class=\"token punctuation\">;</span>\n\n\n\n\nsrc<span class=\"token operator\">/</span>components<span class=\"token operator\">/</span>Profile<span class=\"token punctuation\">.</span>js<span class=\"token operator\">:</span>\n\n\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Container <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useAuth <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../context/AuthContext'</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Profile</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> user <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">useAuth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>Profile<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Welcome<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>user<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span><span class=\"token operator\">!</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Profile<span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>Now user shall navigate to /profile on successful login.</strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"83520301920227540000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`function Login() {\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n  const [errors, setErrors] = useState({});\n  const { login } = useAuth();\n  const navigate = useNavigate();\n\n\n  const validateForm = () => {\n    const newErrors = {};\n    if (!email) newErrors.email = 'Email is required';\n    else if (!/\\S+@\\S+\\.\\S+/.test(email)) newErrors.email = 'Email is invalid';\n    if (!password) newErrors.password = 'Password is required';\n    else if (password.length < 6) newErrors.password = 'Password must be at least 6 characters';\n    return newErrors;\n  };\n\n\n  const handleSubmit = async (event) => {\n    event.preventDefault();\n    const formErrors = validateForm();\n    if (Object.keys(formErrors).length > 0) {\n      setErrors(formErrors);\n    } else {\n      setErrors({});\n      try {\n        const userData = await login(email, password);\n\n\n        navigate('/profile');\n        console.log('Login successful:', userData);\n        // Here you would typically store the user data and redirect\n      } catch (error) {\n        setErrors({ form: 'Login failed. Please try again.' });\n      }\n    }\n  };`, `83520301920227540000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">Login</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>email<span class=\"token punctuation\">,</span> setEmail<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>password<span class=\"token punctuation\">,</span> setPassword<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>errors<span class=\"token punctuation\">,</span> setErrors<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> login <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">useAuth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> navigate <span class=\"token operator\">=</span> <span class=\"token function\">useNavigate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">validateForm</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> newErrors <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>email<span class=\"token punctuation\">)</span> newErrors<span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> <span class=\"token string\">'Email is required'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">\\S+@\\S+\\.\\S+</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> newErrors<span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> <span class=\"token string\">'Email is invalid'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>password<span class=\"token punctuation\">)</span> newErrors<span class=\"token punctuation\">.</span>password <span class=\"token operator\">=</span> <span class=\"token string\">'Password is required'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>password<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&lt;</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span> newErrors<span class=\"token punctuation\">.</span>password <span class=\"token operator\">=</span> <span class=\"token string\">'Password must be at least 6 characters'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> newErrors<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> formErrors <span class=\"token operator\">=</span> <span class=\"token function\">validateForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Object<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span>formErrors<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setErrors</span><span class=\"token punctuation\">(</span>formErrors<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setErrors</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> userData <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">login</span><span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">,</span> password<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n        <span class=\"token function\">navigate</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/profile'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Login successful:'</span><span class=\"token punctuation\">,</span> userData<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// Here you would typically store the user data and redirect</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setErrors</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">form</span><span class=\"token operator\">:</span> <span class=\"token string\">'Login failed. Please try again.'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion 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>Conclusion</h2>\n<p>You’ve successfully built a login page using React and Bootstrap. This login component includes:</p>\n<ul>\n<li>\n<p>A responsive design using Bootstrap</p>\n</li>\n<li>\n<p>Form validation</p>\n</li>\n<li>\n<p>Simulated API interaction</p>\n</li>\n<li>\n<p>Basic authentication state management</p>\n</li>\n</ul>\n<p>Remember, this is just the beginning. In a production application, you’d want to add more features like:</p>\n<ul>\n<li>Proper error handling and user feedback</li>\n<li>Password strength requirements</li>\n<li>Remember me functionality</li>\n<li>Password reset option</li>\n<li>Multi-factor authentication</li>\n</ul>\n<p>Building secure login pages is crucial for protecting user data and ensuring a smooth user experience. With React and Bootstrap, you have powerful tools at your disposal to create professional, responsive, and secure login interfaces.</p>","frontmatter":{"date":"July 15, 2024","title":"Building a login screen with React and Bootstrap","cover":"building-a-login-screen-with-react-and-bootstrap.png","author":"Mostafa Ibrahim","description":"Build an elegant login screen super fast using React and Bootstrap"},"fields":{"slug":"/building-a-login-screen-with-react-and-bootstrap/"}},"site":{"siteMetadata":{"title":"SuperTokens Blog"}}},"pageContext":{"id":"d9d951ea-4635-5f58-bfb4-fbdacd869a27","fields__slug":"/building-a-login-screen-with-react-and-bootstrap/","__params":{"fields__slug":"building-a-login-screen-with-react-and-bootstrap"}}},
    "staticQueryHashes": []}