ReactJs Redux login and signup form validation and call rest full api using Axios
ReactJs
Redux
login
signup
validation
Axios
API
- By Code solution
- Jan 20th, 2021
- 0 comments
- 1
Reactjs is a popular frontend view library from facebook for creating single page apps.In today’s we are going to create basic login and sign up forms using npx create-react-app module of reactjs.
- Create a project run this command:
npm install -g create-react-app
- Then move into the newly created directory:
cd <project name>
- Install required libary :
npm install --save bootstrap react-dom react-redux react-router-dom reactstrap axios
- Rename then App.js => App.jsx src/App.js
- After create components folder in src/components
- After that create componets folder then create header compontent src/components/header/Header.jsx and add code
Header.jsx
import React, { Component } from 'react'
import { Collapse,
Navbar,
NavbarToggler,
Nav,
NavItem } from 'reactstrap';
import { Link } from 'react-router-dom';
import './Header.css'
export default class Header extends Component {
constructor(props) {
super(props);
this.toggle = this.toggle.bind(this);
this.state = {
isOpen: false
};
}
toggle() {
this.setState({
isOpen: !this.state.isOpen
});
}
render() {
return (
<div className="mb-50">
<Navbar color="faded" light fixed='top' expand="md">
<Link href="/" to="/"><img width="100%" src="http://www.codesolution.co.in/assets/images/logoicon.png" alt="Codesolution"/></Link>
<NavbarToggler onClick={this.toggle} />
<Collapse isOpen={this.state.isOpen} navbar>
<Nav className="ml-auto" navbar>
<NavItem>
<Link to="/">Home</Link>
</NavItem>
<NavItem>
<Link href="/login" to="/login">Login/Signup</Link>
</NavItem>
</Nav>
</Collapse>
</Navbar>
</div>
)
}
}
header.css
nav.navbar, .navbar-default { background-color: #7263bc !important; border-bottom:5px solid #323f45; padding-top:10px; } .navbar-default { background-image: none; border: none; border-radius: 0; } .mb-50{ margin-bottom: 60px; } .navbar-default .navbar-nav > li > a { color: white; } .navbar-default .navbar-brand { color: white; } .navbar-default .navbar-toggle { border-color: white; } .navbar-default .navbar-toggle .icon-bar { background-color: white; } .navbar-default .navbar-toggle:focus, .navbar-default .navbar-toggle:hover { background-color: transparent; } .navbar-default .navbar-brand:focus, .navbar-default .navbar-brand:hover { color: white; background-color: transparent; } a, a:hover{ color: #FFF !important; text-decoration: none; padding: 10px; } .navbar-default .navbar-nav>li>a:focus, .navbar-default .navbar-nav>li>a:hover { color: white; background-color: transparent; }
- After then create footer folder in components and create Footer.jsx and css like that
Footer.jsx
import React, { Component } from 'react'
import './Footer.css'
export default class Footer extends Component {
render() {
return (
<div>
<footer className="footer">
<div className="container background_color">
<p className="text-center">Copyright @2019 | Designed With by <a href="http://wapptechlogics.in/" target="blank">Wapptechlogics</a></p>
</div>
</footer>
</div>
)
}
}
Footer.css
/*footer*/
footer { width:100%; background-color:#263238; min-height:auto; padding:5px 0px 5px 0px ;}
footer p { font-size:13px; color:#CCC; padding-bottom:0px; margin-bottom:8px;}
.background_color{
background: #7263bc;
border-radius: 0;
}
- After then create home folder then create Login.jsx and css like that
Login.jsx
import React, { Component } from 'react';
import {Redirect, Link, router } from 'react-router-dom';
import {Button, Form, FormGroup, Label, Input} from 'reactstrap';
import './Login.css';
import axios from 'axios';
export default class Login extends Component {
componentDidMount() {
window.scrollTo(0, 0)
}
constructor(props) {
super(props);
this.state={
email: '',
password:'',
errors: {}
}
this.handleChangeEmail = this.handleChangeEmail.bind(this);
this.handleChangePassword = this.handleChangePassword.bind(this);
this.submituserRegistrationForm = this.submituserRegistrationForm.bind(this);
}
handleChangeEmail(e) {
this.setState({email:e.target.value});
}
handleChangePassword(e) {
this.setState({password:e.target.value});
}
submituserRegistrationForm(e) {
e.preventDefault();
if (this.validateForm()) {
console.log(this.state);
var apiBaseUrl = "http://localhost:1288/api/";
var data={
"user_email":this.state.email,
"password":this.state.password
}
var headers = {
'Content-Type': 'application/json',
}
console.log(data);
axios.post(apiBaseUrl+'login', data, {headers: headers}).then(function (response) {
console.log(response);
if(response.data.success){
localStorage.setItem("u_code", encodeURIComponent(JSON.stringify(response.data.data)));
localStorage.setItem('is_done', true);
window.location.href = "/";
console.log("Login successfull");
}else{
alert(response.data.message);
}
}).catch(function (error) {
console.log(error);
});
}
}
validateForm() {
let errors = {};
let formIsValid = true;
if (!this.state.email) {
formIsValid = false;
errors["email"] = "*Please enter your email-ID.";
}
if (typeof this.state.email !== "undefined") {
//regular expression for email validation
var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
if (!pattern.test(this.state.email)) {
formIsValid = false;
errors["email"] = "*Please enter valid email-ID.";
}
}
if (!this.state.password) {
formIsValid = false;
errors["password"] = "*Please enter your password.";
}
if (typeof this.state.password !== "undefined") {
if (!this.state.password.match(/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&]).*$/)) {
formIsValid = false;
errors["password"] = "*Please enter secure and strong password.";
}
}
this.setState({
errors: errors
});
return formIsValid;
}
render() {
return (
<div>
<div className="container">
<div className="row">
<div className="col-md-4 login-sec">
<h2 className="text-center">Login Codesolution</h2>
<Form method="post" name="userRegistrationForm" onSubmit= {this.submituserRegistrationForm} >
<FormGroup>
<Label for="exampleEmail">Email</Label>
<Input type="email" name="email" id="exampleEmail" value={this.state.email} onChange={this.handleChangeEmail} placeholder="Email Id" />
<div className="errorMsg">{this.state.errors.email}</div>
</FormGroup>
<FormGroup>
<Label for="examplePassword">Password</Label>
<Input type="password" name="password" id="examplePassword" value={this.state.password} onChange={this.handleChangePassword} placeholder="Password" />
<div className="errorMsg">{this.state.errors.password}</div>
</FormGroup>
<FormGroup check>
<Label check>
<Input type="checkbox" />{' '}
Remember Me
</Label>
</FormGroup>
<div className="d-flex justify-content-center mt-3 login_container">
<Button type="submit" className="btn btn-login">Submit</Button>
</div>
<div className="mt-4">
<div className="d-flex justify-content-center links">
Don't have an account? <Link href="/signup" to="/signup" className="linka">Sign Up</Link>
</div>
<div className="d-flex justify-content-center links">
<a className="linka">Forgot your password?</a>
</div>
</div>
</Form>
</div>
<div className="col-md-8 banner-sec"></div>
</div>
</div>
</div>
)
}
}
Login.css
@import url("//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css");
.login-block{
background: #7261be; /* fallback for old browsers */
background: -webkit-linear-gradient(to bottom, #FFB88C, #7261be); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to bottom, #FFB88C, #7261be); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
float:left;
width:100%;
padding : 50px 0;
}
.banner-sec{background:url(https://static.pexels.com/photos/33972/pexels-photo.jpg) no-repeat left bottom; background-size:cover; min-height:500px; border-radius: 0 10px 10px 0; padding:0;}
.container{background:#fff; border-radius: 0px; box-shadow:15px 20px 0px rgba(0,0,0,0.1);}
.carousel-inner{border-radius:0 10px 10px 0;}
.carousel-caption{text-align:left; left:5%;}
.login-sec{padding: 50px 30px; position:relative;}
.login-sec .copy-text{position:absolute; width:80%; bottom:20px; font-size:13px; text-align:center;}
.login-sec .copy-text i{color:#9286c7;}
.login-sec .copy-text a{color:#7261be;}
.login-sec h2{margin-bottom: 20px;
font-weight: bold;
font-size: 20px;
color: #7261be;}
.login-sec h2:after{content:" "; width:200px; height:5px;background: #25cf53;
display: block;
margin-top: 8px; border-radius:3px; margin-left:auto;margin-right:auto}
.btn-login{background: #7261be; color:#fff; font-weight:600;width: 100%;}
.banner-text{width:70%; position:absolute; bottom:40px; padding-left:20px;}
.banner-text h2{color:#fff; font-weight:600;}
.banner-text h2:after{content:" "; width:100px; height:5px; background:#FFF; display:block; margin-top:20px; border-radius:3px;}
.banner-text p{color:#fff;}
.login_container {
padding: 0 2rem;
}
.linka{
color:#7261be !important;
padding:0px !important;
}
.linka:hover{
color:#7261be !important;
padding:0px !important;
}
.errorMsg {
color: #cc0000;
margin-bottom: 12px;
}
.sucessMsg {
color: #6B8E23;
margin-bottom: 10px;
}
- Create signup components
Signup.jsx
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Button, Form, FormGroup, Label, Jumbotron, Input} from 'reactstrap';
import './Signup.css';
import axios from 'axios';
export default class Signup extends Component {
componentDidMount() {
window.scrollTo(0, 0)
}
constructor(props) {
super(props);
this.state={
email: '',
name:'',
mobile:'',
password:'',
errors: {}
}
this.handleChangeName = this.handleChangeName.bind(this);
this.handleChangeMobile = this.handleChangeMobile.bind(this);
this.handleChangeEmail = this.handleChangeEmail.bind(this);
this.handleChangePassword = this.handleChangePassword.bind(this);
this.submituserRegistrationForm = this.submituserRegistrationForm.bind(this);
}
handleChangeName(e) {
this.setState({name:e.target.value});
}
handleChangeEmail(e) {
this.setState({email:e.target.value});
}
handleChangeMobile(e) {
this.setState({mobile:e.target.value});
}
handleChangePassword(e) {
this.setState({password:e.target.value});
}
submituserRegistrationForm(e) {
e.preventDefault();
if (this.validateForm()) {
console.log(this.state);
var apiBaseUrl = "http://localhost:1288/api/";
var data={
"name":this.state.name,
"user_email":this.state.email,
"mobile_number":this.state.mobile,
"password":this.state.password
}
var headers = {
'Content-Type': 'application/json',
}
console.log(data);
axios.post(apiBaseUrl+'createUsers', data, {headers: headers}).then(function (response) {
console.log(response);
if(response.data.success){
localStorage.setItem("u_code", encodeURIComponent(JSON.stringify(response.data.data)));
localStorage.setItem('is_done', true);
window.location.href = "/";
console.log("Login successfull");
}else{
alert(response.data.message);
}
}).catch(function (error) {
console.log(error);
});
}
}
validateForm() {
let errors = {};
let formIsValid = true;
if (!this.state.name) {
formIsValid = false;
errors["username"] = "*Please enter your username.";
}
if (typeof this.state.name !== "undefined") {
if (!this.state.name.match(/^[a-zA-Z ]*$/)) {
formIsValid = false;
errors["username"] = "*Please enter alphabet characters only.";
}
}
if (!this.state.email) {
formIsValid = false;
errors["email"] = "*Please enter your email-ID.";
}
if (typeof this.state.email !== "undefined") {
//regular expression for email validation
var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
if (!pattern.test(this.state.email)) {
formIsValid = false;
errors["email"] = "*Please enter valid email-ID.";
}
}
if(!this.state.mobile) {
formIsValid = false;
errors["mobileno"] = "*Please enter your mobile no.";
}
if (typeof this.state.mobile !== "undefined") {
if (!this.state.mobile.match(/^[0-9]{10}$/)) {
formIsValid = false;
errors["mobileno"] = "*Please enter valid mobile no.";
}
}
if (!this.state.password) {
formIsValid = false;
errors["password"] = "*Please enter your password.";
}
if (typeof this.state.password !== "undefined") {
if (!this.state.password.match(/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&]).*$/)) {
formIsValid = false;
errors["password"] = "*Please enter secure and strong password.";
}
}
this.setState({
errors: errors
});
return formIsValid;
}
render() {
return (
<div>
<div className="container">
<div className="row">
<div className="col-md-4 login-sec">
<h2 className="text-center">Signup Codesolution</h2>
<Form method="post" name="userRegistrationForm" onSubmit= {this.submituserRegistrationForm}>
<FormGroup>
<Label for="exampleName">Name</Label>
<Input type="text" name="name" id="name" value={this.state.name} onChange={this.handleChangeName} placeholder="Enter a name" />
<div className="errorMsg">{this.state.errors.name}</div>
</FormGroup>
<FormGroup>
<Label for="exampleMobile">Mobile No.</Label>
<Input type="text" name="mobile" id="exampleMobile" value={this.state.mobile} onChange={this.handleChangeEmail} placeholder="Enter a Mobile No." />
<div className="errorMsg">{this.state.errors.mobileno}</div>
</FormGroup>
<FormGroup>
<Label for="exampleEmail">Email</Label>
<Input type="email" name="email" id="exampleEmail" value={this.state.email} onChange={this.handleChangeMobile} placeholder="Enter a email" />
<div className="errorMsg">{this.state.errors.emailid}</div>
</FormGroup>
<FormGroup>
<Label for="examplePassword">Password</Label>
<Input type="password" name="password" id="examplePassword" value={this.state.password} onChange={this.handleChangePassword} placeholder="Enter a password" />
<div className="errorMsg">{this.state.errors.password}</div>
</FormGroup>
<div className="d-flex justify-content-center mt-3 login_container">
<Button type="submit" className="btn btn-login">Submit</Button>
</div>
<div className="mt-4">
<div className="d-flex justify-content-center links">
<Link href="/login" to="/login" className="linka">Already Account Login </Link>
</div>
</div>
</Form>
</div>
<div className="col-md-8 banner-sec"></div>
</div>
</div>
</div>
)
}
}
Singup.css
@import url("//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css");
.login-block{
background: #7261be; /* fallback for old browsers */
background: -webkit-linear-gradient(to bottom, #FFB88C, #7261be); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to bottom, #FFB88C, #7261be); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
float:left;
width:100%;
padding : 50px 0;
}
.banner-sec{background:url(https://static.pexels.com/photos/33972/pexels-photo.jpg) no-repeat left bottom; background-size:cover; min-height:500px; border-radius: 0 10px 10px 0; padding:0;}
.container{background:#fff; border-radius: 0px;box-shadow:15px 20px 0px rgba(0,0,0,0.1);}
.carousel-inner{border-radius:0 10px 10px 0;}
.carousel-caption{text-align:left; left:5%;}
.login-sec{padding: 50px 30px; position:relative;}
.login-sec .copy-text{position:absolute; width:80%; bottom:20px; font-size:13px; text-align:center;}
.login-sec .copy-text i{color:#9286c7;}
.login-sec .copy-text a{color:#7261be;}
.login-sec h2{margin-bottom: 20px;
font-weight: bold;
font-size: 20px;
color: #7261be;}
.login-sec h2:after{content:" "; width:200px; height:5px;background: #25cf53;
display: block;
margin-top: 8px; border-radius:3px; margin-left:auto;margin-right:auto}
.btn-login{background: #7261be; color:#fff; font-weight:600;width: 100%;}
.banner-text{width:70%; position:absolute; bottom:40px; padding-left:20px;}
.banner-text h2{color:#fff; font-weight:600;}
.banner-text h2:after{content:" "; width:100px; height:5px; background:#FFF; display:block; margin-top:20px; border-radius:3px;}
.banner-text p{color:#fff;}
.login_container {
padding: 0 2rem;
}
.linka{
color:#7261be !important;
padding:0px !important;
}
.linka:hover{
color:#7261be !important;
padding:0px !important;
}
.errorMsg {
color: #cc0000;
margin-bottom: 12px;
}
.sucessMsg {
color: #6B8E23;
margin-bottom: 10px;
}
- Open App.jsx and add this code
import React, { Component } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import Home from './components/home/Home';
import Login from './components/login/Login';
import Signup from './components/signup/Signup';
import Navbar from './components/header/Header';
import Footer from './components/footer/Footer';
class App extends React.Component {
render() {
return (
<Router>
<div>
<Navbar />
<Route exact path="/" component={Home} />
<Route path="/login" component={Login} />
<Route path="/signup" component={Signup} />
<Footer />
</div>
</Router>
);
}
}
export default App;
After that run project you can create restfull api and then check login/Signup.