From 0c45e9067dd8a299179f763934319bc78403a78d Mon Sep 17 00:00:00 2001 From: ImAlpha Date: Thu, 28 Nov 2024 12:25:00 -0800 Subject: [PATCH] global state for cart working, need to fix cache --- frontend/bun.lockb | Bin 200612 -> 201003 bytes frontend/package.json | 1 + frontend/src/app/redux/CartReducer.ts | 10 ++-- frontend/src/components/CartTab/CartTab.css | 1 - frontend/src/components/CartTab/CartTab.tsx | 53 ++++++++++++-------- frontend/src/components/Navbar/Navbar.tsx | 19 +++++-- frontend/src/lib/Store.ts | 12 +++++ 7 files changed, 67 insertions(+), 29 deletions(-) diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 0878d98f51196333ccaa601c684005cd31ef2494..9a6296266164dcdae9a0b1da72758624f0b35a70 100755 GIT binary patch delta 33901 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

9}IyC7Z+(S!fvdG34&!X~z-sMJdDuE+Ee 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 Avj6}9 delta 33429 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 diff --git a/frontend/package.json b/frontend/package.json index f1098f5..7b77491 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -28,6 +28,7 @@ "react-icons": "^5.3.0", "react-redux": "^9.1.2", "redux": "^5.0.1", + "redux-persist": "^6.0.0", "resend": "^3.5.0", "sass": "^1.80.5", "sharp": "^0.33.5", diff --git a/frontend/src/app/redux/CartReducer.ts b/frontend/src/app/redux/CartReducer.ts index f377c89..91b8e17 100644 --- a/frontend/src/app/redux/CartReducer.ts +++ b/frontend/src/app/redux/CartReducer.ts @@ -1,4 +1,4 @@ -import { createSlice } from "@reduxjs/toolkit"; +import { createSlice, PayloadAction } from "@reduxjs/toolkit"; export interface Product { id: number; @@ -18,7 +18,7 @@ export const cartSlice = createSlice({ name: "cart", initialState, reducers: { - addToCart: (state: any, action: any) => { + addToCart: (state: any, action: PayloadAction) => { const item = state.products.find((p:Product) => p.id === action.payload.id); if(item) { item.quantity += action.payload.quantity; @@ -31,10 +31,12 @@ export const cartSlice = createSlice({ }, resetCart: (state) => { state.products = []; - } + }, }, }); export const { addToCart, removeFromCart, resetCart } = cartSlice.actions; -export default cartSlice.reducer; \ No newline at end of file +export default cartSlice.reducer; + +export const dynamic = 'force-dynamic' \ No newline at end of file diff --git a/frontend/src/components/CartTab/CartTab.css b/frontend/src/components/CartTab/CartTab.css index ea050d5..2829781 100644 --- a/frontend/src/components/CartTab/CartTab.css +++ b/frontend/src/components/CartTab/CartTab.css @@ -1,6 +1,5 @@ .cart{ z-index: 999; - background-color: white; -webkit-box-shadow: 0px 0px 7px -5px rgba(0,0,0,0.5); box-shadow: 0px 0px 7px -5px rgba(0,0,0,0.5); diff --git a/frontend/src/components/CartTab/CartTab.tsx b/frontend/src/components/CartTab/CartTab.tsx index 581193b..fad6f26 100644 --- a/frontend/src/components/CartTab/CartTab.tsx +++ b/frontend/src/components/CartTab/CartTab.tsx @@ -4,18 +4,27 @@ import Image from "next/image"; import { MdDeleteOutline } from "react-icons/md"; import { Button } from "@/components/ui/button"; import "./CartTab.css"; -import { useSelector } from "react-redux"; +import { useSelector, useDispatch } from "react-redux"; import type { RootState } from "@/lib/Store"; - +import { removeFromCart } from "@/app/redux/CartReducer"; import type { Product } from "@/app/redux/CartReducer"; const CartTab = () => { const cartItems = true; + const dispatch = useDispatch(); // get the products from the cart const products = useSelector((state: RootState) => state.cart.products); + const totalPrice = () => { + let total = 0; + products?.forEach((item: Product) => { + total += item.price * item.quantity; + }); + return total.toFixed(2); + }; + // const data = [ // { // id: 1, @@ -39,30 +48,32 @@ const CartTab = () => { // }, // ]; return ( -

+
{products?.map((item: Product) => ( -
-
- item picture +
+
+
+ item picture +
+
+

{item.title}

+ {/*

{item.desc?.substring(0, 100)}

*/} +
{item.quantity} x ${item.price}
+
+ dispatch(removeFromCart(item.id))} />
-
-

{item.title}

-

{item.desc?.substring(0, 100)}

-
{item.quantity} x ${item.price}
+
+ SUBTOTAL + ${totalPrice()}
-
))} -
- SUBTOTAL - $123 -
{/* Reset Cart */}
diff --git a/frontend/src/components/Navbar/Navbar.tsx b/frontend/src/components/Navbar/Navbar.tsx index 8733c9d..915b340 100644 --- a/frontend/src/components/Navbar/Navbar.tsx +++ b/frontend/src/components/Navbar/Navbar.tsx @@ -5,6 +5,10 @@ import { useMediaQuery } from "@/util/useMediaQuery"; import { FiShoppingCart } from "react-icons/fi"; import Image from "next/image"; import CartTab from "@/components/CartTab/CartTab"; +import { useSelector } from "react-redux"; +import type { RootState } from "@/lib/Store"; +import Products from "@/app/products/page"; +import type { Product } from "@/app/redux/CartReducer"; const navMotion = { visible: { @@ -30,8 +34,11 @@ export default function Nav() { const matches = useMediaQuery("(min-width: 1280px)"); // console.log(matches); + // get the products from the cart + const products = useSelector((state: RootState) => state.cart.products); + return ( -
diff --git a/frontend/src/lib/Store.ts b/frontend/src/lib/Store.ts index 982f88f..fd7ce64 100644 --- a/frontend/src/lib/Store.ts +++ b/frontend/src/lib/Store.ts @@ -1,6 +1,16 @@ import { configureStore } from '@reduxjs/toolkit' import counterReducer from '@/app/redux/slice' import cartReducer from '@/app/redux/CartReducer' +import { persistReducer, persistStore } from 'redux-persist' +import storage from 'redux-persist/lib/storage' + +const persistConfig = { + key: 'cart', + storage, +} + +const persistedReducer = persistReducer(persistConfig, cartReducer) + export const makeStore = () => { return configureStore({ reducer: { @@ -9,6 +19,8 @@ export const makeStore = () => { }) } +export const persistor = persistStore(makeStore()); + // Infer the type of makeStore export type AppStore = ReturnType // Infer the `RootState` and `AppDispatch` types from the store itself