Skip to content
Open

x #1

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23,856 changes: 12,270 additions & 11,586 deletions client/package-lock.json

Large diffs are not rendered by default.

8 changes: 7 additions & 1 deletion client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,21 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@reduxjs/toolkit": "^2.1.0",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"axios": "^1.6.7",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
"react-redux": "^9.1.0",
"react-router-dom": "^6.21.2",
"react-script": "^2.0.5",
"react-scripts": "^3.0.1",
"react-scripts": "^5.0.1",
"react-toastify": "^10.0.4",
"redux": "^5.0.1",
"uninstall": "^0.0.0",
"web-vitals": "^2.1.4"
},
"scripts": {
Expand Down
9 changes: 8 additions & 1 deletion client/src/App.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { Component } from 'react';
import React, { Component,cloneElement } from 'react';
import { BrowserRouter, Routes, Route } from "react-router-dom";
import './App.css';
import Home from './pages/home/home';
Expand All @@ -10,12 +10,19 @@ import Reset from './pages/Auth/Reset'
import LoginAuth from './pages/Auth/LoginAuth';
import Profile from './pages/Profile/Profile';
import ChangePassword from './pages/ChangePassword/ChangePassword';
import axios from 'axios';
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';



axios.defaults.withCredentials= true;

function App() {
return (
<div>
<BrowserRouter>
<ToastContainer />
<Routes>
<Route path="/" element={<Layout>
<Home />
Expand Down
5 changes: 5 additions & 0 deletions client/src/redux/features/auth/authService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import axios from 'axios'

const BACKEND_URL = process.env.REACT_APP_BACKEND_URL
const API_URl = `${BACKEND_URL}/api/users/`;

33 changes: 33 additions & 0 deletions client/src/redux/features/auth/authSlice.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { createSlice } from '@reduxjs/toolkit'

const initialState = {
idLoggedIn: false,
user:null,
users:[],
twoFactor:false,
iserror:false,
isSuccess:false,
isLoading:false,
message:"",

}

const authSlice = createSlice({
name: "auth",
initialState,
reducers: {
RESET(state){

state.twoFactor=false;
state.iserror=false;
state.isSuccess=false;
state.isLoading=false;
state.message="";
}
}
});

export const {RESET} = authSlice.actions
export const selectIsLoggedIn = (state) => state.auth.isLoggedIn;

export default authSlice.reducer
12 changes: 12 additions & 0 deletions client/src/redux/features/store.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { configureStore } from ("@reduxjs/toolkit");
import authReducer from "../features/auth/authSlice"


const store = configureStore({
reducer:{
auth:authReducer,

},


})
68 changes: 66 additions & 2 deletions server/controllers/userController.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ const loginUser = asyncHandler(async (req, res) => {
}).save();

res.status(400)
throw new Error("Check your email for login code");
throw new Error("New browser or device detected");
}


Expand Down Expand Up @@ -211,6 +211,69 @@ const sendLoginCode = asyncHandler(async (req, res) => {

});

// Login with Code
const LoginWithCode = asyncHandler(async (req, res) => {
const { email } = req.params;
const { loginCode } = req.body;

const user = await User.findOne({ email });

if (!user) {
res.status(404);
throw new Error("User Not found, please signup.");
}

// Find user loginToken
const userToken = await Token.findOne({
userId: user.id,
expiredAt: { $gt: Date.now() },
});

if (!userToken) {
res.status(404);
throw new Error("Invalid or Expired token, please login again");
}

const decryptedLoginCode = cryptr.decrypt(userToken.loginToken);

if (loginCode !== decryptedLoginCode) {
res.status(400);
throw new Error("Incorrect login code, Please Try again");
} else {
// Register useragent
const ua = parser(req.headers["user-agent"]);
const thisUserAgent = ua.ua;
user.userAgent.push(thisUserAgent);
await user.save();
// Generate Token
const token = generateToken(user._id);

// Send HTTP Only cookie
res.cookie("token", token, {
path: "/",
httpOnly: true,
expires: new Date(Date.now() + 1000 * 86400), // 1 day
sameSite: "none",
secure: true,
});

const { _id, name, email, phone, bio, photo, role, isVerified } = user;

res.status(201).json({
_id,
name,
email,
phone,
bio,
photo,
role,
isVerified,
token,
});
}
});


// Send verification email

const sendVerificationEmail = asyncHandler(async (req, res) => {
Expand Down Expand Up @@ -609,6 +672,7 @@ module.exports = {
forgotPassword,
resetPassword,
changePassword,
sendLoginCode
sendLoginCode,
LoginWithCode

};
3 changes: 2 additions & 1 deletion server/routes/userRoute.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const express = require('express');
const router = express.Router();
const { registerUser ,loginUser, logoutUser, getUser, updateUser, loginStatus, sendAutomatedEmail, sendVerificationEmail, verifyUser, forgotPassword, resetPassword, changePassword, sendLoginCode, } = require("../controllers/userController");
const { registerUser ,loginUser, logoutUser, getUser, updateUser, loginStatus, sendAutomatedEmail, sendVerificationEmail, verifyUser, forgotPassword, resetPassword, changePassword, sendLoginCode, LoginWithCode, } = require("../controllers/userController");
const { protect } = require('../middleware/authMiddleware');


Expand All @@ -17,6 +17,7 @@ router.post("/forgotPassword", forgotPassword);
router.patch("/resetpassword/:resetToken", resetPassword);
router.patch("/changePassword",protect, changePassword);
router.post("/sendLoginCode/:email",sendLoginCode);
router.post("/loginWithCode/:email",LoginWithCode);



Expand Down