added redux-thunk

parent 94b00997
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
"react-router-dom": "^6.22.0", "react-router-dom": "^6.22.0",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"redux-thunk": "^3.1.0",
"typescript": "^4.9.5", "typescript": "^4.9.5",
"web-vitals": "^2.1.4" "web-vitals": "^2.1.4"
} }
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
"react-router-dom": "^6.22.0", "react-router-dom": "^6.22.0",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"redux-thunk": "^3.1.0",
"typescript": "^4.9.5", "typescript": "^4.9.5",
"web-vitals": "^2.1.4" "web-vitals": "^2.1.4"
}, },
......
import React, { memo,useMemo, useCallback, useEffect} from 'react'; import React, { memo, useMemo, useCallback, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { RootState } from '../../reduxstore/store'; import { RootState } from '../../reduxstore/store';
import { fetchCartItems, updateCartItems, removeFromCart, clearCart, incrementQuantity, decrementQuantity } from '../../reduxstore/cartSlice'; import { fetchCartItems, updateCartItems, removeFromCart, clearCart, incrementQuantity, decrementQuantity } from '../../reduxstore/cartSlice';
...@@ -12,20 +12,24 @@ const Cart = memo(() => { ...@@ -12,20 +12,24 @@ const Cart = memo(() => {
const capitalizedUserId = user && user.userId ? user.userId.charAt(0).toUpperCase() + user.userId.slice(1) : null; const capitalizedUserId = user && user.userId ? user.userId.charAt(0).toUpperCase() + user.userId.slice(1) : null;
useEffect(() => { useEffect(() => {
if (Object.keys(user).length === 0) { if (user) {
navigate('/login') if (Object.keys(user).length === 0) {
} else { navigate('/login')
dispatch(fetchCartItems(user.userId)) } else {
dispatch(fetchCartItems(user.userId))
}
} }
}, [user]) }, [user])
const handleCartChanges = () => { const handleCartChanges = () => {
dispatch(updateCartItems({ userId: user.userId, updateCartItems: cartItems })) if (user) {
dispatch(updateCartItems({ userId: user.userId, updateCartItems: cartItems }))
}
} }
const totalPay=useMemo(()=>{ const totalPay = useMemo(() => {
return cartItems.reduce((acc,curr)=>{ return cartItems.reduce((acc, curr) => {
return acc=acc+ (parseInt(curr.price) * parseInt(curr.qty)); return acc = acc + (parseInt(curr.price) * parseInt(curr.qty));
},0) }, 0)
},[cartItems]) }, [cartItems])
return ( return (
...@@ -59,9 +63,9 @@ const Cart = memo(() => { ...@@ -59,9 +63,9 @@ const Cart = memo(() => {
<td>{item.price}</td> <td>{item.price}</td>
<td> <td>
<span className='d-flex justify-content-start align-items-center'> <span className='d-flex justify-content-start align-items-center'>
<button onClick={()=>{dispatch(decrementQuantity(item))}} className='btn btn-tranparent fw-bolder d-flex justify-content-center align-items-center' style={{ height: "15px", width: "15px" }}>-</button> <button onClick={() => { dispatch(decrementQuantity(item)) }} className='btn btn-tranparent fw-bolder d-flex justify-content-center align-items-center' style={{ height: "15px", width: "15px" }}>-</button>
<span> {item.qty} </span> <span> {item.qty} </span>
<button onClick={()=>{dispatch(incrementQuantity(item))}} className='btn btn-tranparent fw-bolder d-flex justify-content-center align-items-center' style={{ height: "10px", width: "8px" }}>+</button> <button onClick={() => { dispatch(incrementQuantity(item)) }} className='btn btn-tranparent fw-bolder d-flex justify-content-center align-items-center' style={{ height: "10px", width: "8px" }}>+</button>
</span> </span>
</td> </td>
<td>$ {(item.price * item.qty).toFixed()}</td> <td>$ {(item.price * item.qty).toFixed()}</td>
......
...@@ -26,10 +26,12 @@ const Product = memo((props: ProductPropsType) => { ...@@ -26,10 +26,12 @@ const Product = memo((props: ProductPropsType) => {
const {id,title,description,category,image,rating:{rate,count},qty,price}:ProductType= props.product!; const {id,title,description,category,image,rating:{rate,count},qty,price}:ProductType= props.product!;
const handleAddtoCart=()=>{ const handleAddtoCart=()=>{
if(user){
if(Object.keys(user).length!=0){ if(Object.keys(user).length!=0){
// dispatch(updateCartItems({userId:user.userId,updateCartItems:props.product})) // dispatch(updateCartItems({userId:user.userId,updateCartItems:props.product}))
dispatch(addToCart(props.product)) dispatch(addToCart(props.product))
} }
}
} }
......
...@@ -13,16 +13,21 @@ const Products = memo(() => { ...@@ -13,16 +13,21 @@ const Products = memo(() => {
const user = useSelector((state: RootState) => state.userDetails.userDetails) const user = useSelector((state: RootState) => state.userDetails.userDetails)
useEffect(() => { useEffect(() => {
if (user !== null) { // if (user !== null) {
const isEmpty = Object.keys(user).length === 0 && user.constructor === Object; // const isEmpty = Object.keys(user).length === 0 && user.constructor === Object;
if (isEmpty) { // if (isEmpty) {
navigate('/login'); // navigate('/login');
} else { // } else {
dispatch(fetchProducts()); // dispatch(fetchProducts());
} // }
} else { // } else {
navigate('/login'); // navigate('/login');
} // }
if (user) {
dispatch(fetchProducts())
} else {
navigate('/login')
}
}, [user]) }, [user])
if (products.loading) { return <div className="text-center mt-5">Loading...</div> } if (products.loading) { return <div className="text-center mt-5">Loading...</div> }
......
...@@ -26,7 +26,7 @@ export const fetchCartItems: any = createAsyncThunk('cart/fetchCartItems', async ...@@ -26,7 +26,7 @@ export const fetchCartItems: any = createAsyncThunk('cart/fetchCartItems', async
export const updateCartItems: any = createAsyncThunk('updatecart/updateCartItems', async ({ userId, updateCartItems }: CartItemType) => { export const updateCartItems: any = createAsyncThunk('updatecart/updateCartItems', async ({ userId, updateCartItems }: CartItemType) => {
return await axios.patch(`http://localhost:4000/updateCartItems/${userId}`, updateCartItems) return await axios.patch(`http://localhost:4000/updateCartItems/${userId}`, updateCartItems)
.then(response => { .then(response => {
console.log(response.data); // console.log(response.data);
return response.data return response.data
}); });
}); });
...@@ -77,6 +77,8 @@ const cartSlice = createSlice({ ...@@ -77,6 +77,8 @@ const cartSlice = createSlice({
prevCartItems[index] = updatedItem; prevCartItems[index] = updatedItem;
state.cartItems = [...prevCartItems]; state.cartItems = [...prevCartItems];
} }
}else{
alert("Use remove button")
} }
} }
}, },
......
import { configureStore } from '@reduxjs/toolkit' import { configureStore ,Tuple} from '@reduxjs/toolkit'
import cartReducer,{CartStateType} from './cartSlice' import cartReducer,{CartStateType} from './cartSlice'
import productsReducer,{ProductsStateType} from './productsSlice' import productsReducer,{ProductsStateType} from './productsSlice'
import usersReducer,{UsersStateType} from './usersSlice' import usersReducer,{UsersStateType} from './usersSlice'
import userDetailsslice,{UserDetailsType} from './userDetailsslice' import userDetailsslice,{UserDetailsType} from './userDetailsslice'
import sessionStorage from 'redux-persist/es/storage/session' import sessionStorage from 'redux-persist/es/storage/session'
import { persistReducer, persistStore } from 'redux-persist'; import { persistReducer, persistStore } from 'redux-persist';
import { thunk } from 'redux-thunk'
const persistConfig={ const persistConfig={
key: "root", key: "root",
storage:sessionStorage storage:sessionStorage,
} }
export type RootState= { export type RootState= {
products:ProductsStateType; products:ProductsStateType;
...@@ -24,6 +25,7 @@ const store=configureStore({ ...@@ -24,6 +25,7 @@ const store=configureStore({
users: usersReducer, users: usersReducer,
userDetails:persistUserDetailsReducer userDetails:persistUserDetailsReducer
}, },
middleware:()=>new Tuple(thunk)
}) })
export const persistor = persistStore(store); export const persistor = persistStore(store);
......
import { createSlice } from "@reduxjs/toolkit" import { createSlice } from "@reduxjs/toolkit"
type User = {
userId: string;
fname: string; lname: string; email: string
mobile: string;
password: string;}|null;
export type UserDetailsType={ export type UserDetailsType={
userDetails:any|null userDetails:User|null
} }
const initialState:UserDetailsType={ const initialState:UserDetailsType={
userDetails:{}, userDetails:null
} }
const userDetailsSlice=createSlice({ const userDetailsSlice=createSlice({
...@@ -14,7 +21,7 @@ const userDetailsSlice=createSlice({ ...@@ -14,7 +21,7 @@ const userDetailsSlice=createSlice({
state.userDetails=action.payload state.userDetails=action.payload
}, },
logoutUser:(state)=>{ logoutUser:(state)=>{
state.userDetails={} state.userDetails=null
}, },
}, },
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment