Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wishlist Refactor by Backend API Integration #9

Merged
merged 6 commits into from
May 27, 2023
Merged
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
44 changes: 19 additions & 25 deletions src/components/Product-listing/product-card/ProductCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,14 @@ import {
StarRoundedIcon,
} from "assets";
import {
ADD_TO_WISHLIST,
REMOVE_FROM_WISHLIST,
ADD_TO_CART,
REMOVE_FROM_CART,
} from "utils";
import "./productcard.css";

const ProductCard = ({ product }) => {
const navigate = useNavigate();
const { wishlistState, wishlistDispatch } = useWishlist();
const { wishlistState, removeFromWishlistHandler,addToWishlistHandler } = useWishlist();
const { wishlist } = wishlistState;
const { cartState, cartDispatch } = useCart();
const { cart } = cartState;
Expand All @@ -41,28 +39,24 @@ const ProductCard = ({ product }) => {

// Check if the product is in the wishlist
const isFavorite =
wishlist && wishlist.find((wishlistProduct) => wishlistProduct._id === _id);

const toggleWishlist = (e) => {
e.stopPropagation();

if (!isLoggedIn) {
navigate("/login");
return;
}
const actionType = isFavorite ? REMOVE_FROM_WISHLIST : ADD_TO_WISHLIST;
const payload = isFavorite ? _id : product;

wishlistDispatch({
type: actionType,
payload,
});

const toastMessage = isFavorite
? "Removed from wishlist"
: "Added to wishlist";
toast.success(toastMessage);
};
isLoggedIn && wishlist && wishlist.find((wishlistProduct) => wishlistProduct._id === _id);

const toggleWishlist = (e) => {
e.stopPropagation();

if (!isLoggedIn) {
navigate("/login");
return;
}

if (isFavorite) {
removeFromWishlistHandler(_id);
toast.success(`${product.name} removed from wishlist`);
} else {
addToWishlistHandler(product);
toast.success(`${product.name} added to wishlist`);
}
};

//--------------For Cart----------------------//

Expand Down
13 changes: 5 additions & 8 deletions src/components/cart/CartItem.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ import { toast } from "react-hot-toast";
import { useNavigate } from "react-router-dom";

import { useCart, useWishlist } from "context";
import { ADD_TO_WISHLIST, REMOVE_FROM_CART } from "utils";
import { REMOVE_FROM_CART } from "utils";

const CartItem = ({ product, quantity, setQuantity }) => {
const navigate = useNavigate();
const { cartDispatch } = useCart();
const { wishlistState,wishlistDispatch } = useWishlist();
const { wishlistState,addToWishlistHandler } = useWishlist();
const { wishlist } = wishlistState;

// Decrease the quantity of the cart item
Expand All @@ -34,13 +34,10 @@ const CartItem = ({ product, quantity, setQuantity }) => {
e.stopPropagation();
if (isProductInWishlist) {
navigate("/wishlist");
toast.success("Already in Wishlist");
toast.success(`${product.name} is already in wishlist`);
} else {
wishlistDispatch({
type: ADD_TO_WISHLIST,
payload: product,
});
toast.success("Added to Wishlist");
addToWishlistHandler(product);
toast.success(`${product.name} added to wishlist`);
}
};

Expand Down
57 changes: 29 additions & 28 deletions src/components/product-details/ProductDetails.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,23 @@ import {
LocalShippingIcon,
StarRoundedIcon,
} from "assets";
import { useCart, useProductsData, useWishlist } from "context";
import { ADD_TO_CART, ADD_TO_WISHLIST } from "utils";
import { toast } from "react-hot-toast";
import {
useAuth,
useCart,
useProductsData,
useWishlist,
} from "context";
import { ADD_TO_CART } from "utils";
import { toast } from "react-hot-toast";
import "./productdetails.css";

const ProductDetails = () => {
const { productId } = useParams();
const navigate = useNavigate();

const { isLoggedIn } = useAuth();
const { productsData } = useProductsData();
const { wishlistState, wishlistDispatch } = useWishlist();
const { wishlistState, addToWishlistHandler } = useWishlist();
const { wishlist } = wishlistState;
const { cartState, cartDispatch } = useCart();
const { cart } = cartState;
Expand All @@ -26,12 +32,17 @@ const ProductDetails = () => {
return product._id === productId;
});

const isFavorite =
wishlist &&
wishlist.find((wishlistProduct) => wishlistProduct._id === product._id);
const isFavorite = wishlist && wishlist.find((wishlistProduct) => wishlistProduct._id === product._id);
const isAddedToCart = cart && cart.find((cartProduct) => cartProduct._id === product._id);

const isAddedToCart =
cart && cart.find((cartProduct) => cartProduct._id === product._id);
const handleAddToWishlist = () => {
if (isLoggedIn) {
addToWishlistHandler(product);
toast.success(`${product.name} added to wishlist`);
} else {
navigate("/login");
}
};

return (
<>
Expand Down Expand Up @@ -92,25 +103,15 @@ const ProductDetails = () => {
</span>
)}
</button>
<button className="product-detail-add-to-whishlist-btn">
{isFavorite ? (
<span onClick={() => navigate("/wishlist")}>
Go To Wishlist
</span>
) : (
<span
onClick={() => {
wishlistDispatch({
type: ADD_TO_WISHLIST,
payload: product,
});
toast.success("Added to wishlist");
}}
>
Add To Whishlist
</span>
)}
</button>
{isFavorite ? (
<button className="product-detail-add-to-whishlist-btn" onClick={() => navigate("/wishlist")}>
Go To Wishlist
</button>
) : (
<button className="product-detail-add-to-whishlist-btn" onClick={handleAddToWishlist}>
Add To Wishlist
</button>
)}
</div>
</div>
</div>
Expand Down
17 changes: 8 additions & 9 deletions src/components/wishlist/Wishlist.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import {
DeleteOutlinedIcon,
AddShoppingCartRoundedIcon,
} from "assets";
import { ADD_TO_CART, REMOVE_FROM_WISHLIST } from "utils";
import { ADD_TO_CART } from "utils";
import "./wishlist.css";

const Wishlist = () => {
const navigate = useNavigate();
const { wishlistState, wishlistDispatch } = useWishlist();
const { wishlistState ,removeFromWishlistHandler} = useWishlist();
const { wishlist } = wishlistState;
const { cartState, cartDispatch } = useCart();
const { cart } = cartState;
Expand All @@ -27,13 +27,12 @@ const Wishlist = () => {
toast.success("Already in cart");
};

const handleRemoveFromWishlist = (e, productId) => {
const handleRemoveFromWishlist = (e, product) => {
e.stopPropagation();
wishlistDispatch({
type: REMOVE_FROM_WISHLIST,
payload: productId,
});
toast.success("Item removed from wishlist");
removeFromWishlistHandler(
product._id
);
toast.success(`${product.name} removed from wishlist`);
};

return (
Expand Down Expand Up @@ -95,7 +94,7 @@ const Wishlist = () => {
<button
className="wishlist-delete-icon"
onClick={(e) =>
handleRemoveFromWishlist(e, product._id)
handleRemoveFromWishlist(e, product)
}
>
<DeleteOutlinedIcon className="delete-icon" />
Expand Down
56 changes: 53 additions & 3 deletions src/context/wishlistContext.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
import { createContext, useReducer, useContext } from "react";
import React, { createContext, useReducer, useContext } from "react";

import { wishlistReducer } from "reducer";
import {
ADD_TO_WISHLIST,
REMOVE_FROM_WISHLIST,
SET_WISHLIST,
addToWishlist,
getWishlist,
removeFromWishlist,
} from "utils";
import { useAuth } from "./authContext";

const WishlistContext = createContext();

const WishlistContextProvider = ({ children }) => {
const { token } = useAuth();

// Set the initial state for the wishlist context
const initialState = {
wishlist: [],
Expand All @@ -15,8 +27,46 @@ const WishlistContextProvider = ({ children }) => {
initialState
);

const fetchWishlist = async () => {
try {
const response = await getWishlist(token);
const { data } = response;
wishlistDispatch({ type: SET_WISHLIST, payload: data.wishlist });
} catch (error) {
console.error("Fetch Wishlist Error:", error);
}
};

const addToWishlistHandler = async (product) => {
try {
await addToWishlist(token, product);
wishlistDispatch({
type: ADD_TO_WISHLIST,
payload: product,
});
} catch (error) {
console.log(error);
}
};

const removeFromWishlistHandler = async (productId) => {
try {
await removeFromWishlist(token, productId);
wishlistDispatch({ type: REMOVE_FROM_WISHLIST, payload: productId });
} catch (error) {
console.log(error);
}
};

return (
<WishlistContext.Provider value={{ wishlistState, wishlistDispatch }}>
<WishlistContext.Provider
value={{
wishlistState,
fetchWishlist,
addToWishlistHandler,
removeFromWishlistHandler,
}}
>
{children}
</WishlistContext.Provider>
);
Expand All @@ -25,4 +75,4 @@ const WishlistContextProvider = ({ children }) => {
// Custom hook to consume the WishlistContext
const useWishlist = () => useContext(WishlistContext);

export { useWishlist, WishlistContextProvider };
export { WishlistContextProvider, useWishlist };
12 changes: 7 additions & 5 deletions src/reducer/wishlistReducer.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
import { ADD_TO_WISHLIST, REMOVE_FROM_WISHLIST } from "utils";
import { ADD_TO_WISHLIST, REMOVE_FROM_WISHLIST, SET_WISHLIST } from "utils";

const wishlistReducer = (state, action) => {
switch (action.type) {
case SET_WISHLIST:
return {
...state,
wishlist: action.payload,
};

case ADD_TO_WISHLIST:
const { payload } = action;

// Check if the product is already in the wishlist
const isAlreadyInWishlist = state.wishlist.some(
(item) => item._id === payload._id
);

// If the item is already in the wishlist, return the current state
if (isAlreadyInWishlist) {
return state;
}

// Add the item to the wishlist
const updatedWishlist = [...state.wishlist, payload];

return {
Expand All @@ -24,7 +27,6 @@ const wishlistReducer = (state, action) => {
};

case REMOVE_FROM_WISHLIST:
// Remove the item from the wishlist
return {
...state,
wishlist: state.wishlist.filter(
Expand Down
2 changes: 2 additions & 0 deletions src/utils/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const SORT_BY_RATING = "SORT_BY_RATING";
const FILTER_BY_SECTION = "FILTER_BY_SECTION";
const FILTER_BY_CATEGORY = "FILTER_BY_CATEGORY";
const CLEAR_FILTERS = "CLEAR_FILTERS";
const SET_WISHLIST = "SET_WISHLIST";
const ADD_TO_WISHLIST = "ADD_TO_WISHLIST";
const REMOVE_FROM_WISHLIST = "REMOVE_FROM_WISHLIST";
const ADD_TO_CART = "ADD_TO_CART";
Expand All @@ -19,6 +20,7 @@ export {
FILTER_BY_SECTION,
FILTER_BY_CATEGORY,
CLEAR_FILTERS,
SET_WISHLIST,
ADD_TO_WISHLIST,
REMOVE_FROM_WISHLIST,
ADD_TO_CART,
Expand Down
6 changes: 6 additions & 0 deletions src/utils/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,15 @@ export {
FILTER_BY_SECTION,
FILTER_BY_CATEGORY,
CLEAR_FILTERS,
SET_WISHLIST,
ADD_TO_WISHLIST,
REMOVE_FROM_WISHLIST,
ADD_TO_CART,
REMOVE_FROM_CART,
} from "./constants";
export { loginService, signupService } from "./authServices";
export {
getWishlist,
addToWishlist,
removeFromWishlist,
} from "./wishlistServices";
Loading