From 86dd53cb2893bfd9d2a186d320556eb5268e9724 Mon Sep 17 00:00:00 2001 From: ImAlpha Date: Sun, 24 Nov 2024 22:38:28 -0800 Subject: [PATCH] added redux support for cart and products. Need to update cart based on redux state and add cache --- frontend/bun.lockb | Bin 197382 -> 200612 bytes frontend/package.json | 3 + frontend/src/app/StoreProvider.tsx | 18 ++++++ frontend/src/app/layout.tsx | 15 +++-- frontend/src/app/redux/CartReducer.ts | 40 +++++++++++++ frontend/src/app/redux/slice.ts | 37 ++++++++++++ frontend/src/components/CartTab/CartTab.tsx | 56 ++++++++++-------- .../components/ProductPage/ProductPage.tsx | 27 ++++++++- frontend/src/lib/Store.ts | 16 +++++ frontend/src/lib/hooks.ts | 7 +++ frontend/tsconfig.json | 2 +- 11 files changed, 188 insertions(+), 33 deletions(-) create mode 100644 frontend/src/app/StoreProvider.tsx create mode 100644 frontend/src/app/redux/CartReducer.ts create mode 100644 frontend/src/app/redux/slice.ts create mode 100644 frontend/src/lib/Store.ts create mode 100644 frontend/src/lib/hooks.ts diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 5adf760795373f08c58c92b658421ce238e9d64a..0878d98f51196333ccaa601c684005cd31ef2494 100755 GIT binary patch delta 36720 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 delta 34645 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 bqNb_txE&3*sh@j^4SQ9u9YH(Qd8z*&ePfGV diff --git a/frontend/package.json b/frontend/package.json index 8e3b0d7..f1098f5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,6 +13,7 @@ "@radix-ui/react-slot": "^1.1.0", "@react-email/components": "^0.0.22", "@react-email/tailwind": "^0.0.19", + "@reduxjs/toolkit": "^2.3.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "dotenv": "^16.4.5", @@ -25,6 +26,8 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.3.0", + "react-redux": "^9.1.2", + "redux": "^5.0.1", "resend": "^3.5.0", "sass": "^1.80.5", "sharp": "^0.33.5", diff --git a/frontend/src/app/StoreProvider.tsx b/frontend/src/app/StoreProvider.tsx new file mode 100644 index 0000000..13ccb28 --- /dev/null +++ b/frontend/src/app/StoreProvider.tsx @@ -0,0 +1,18 @@ +'use client' +import { useRef } from 'react' +import { Provider } from 'react-redux' +import { makeStore, AppStore } from '../lib/Store' + +export default function StoreProvider({ + children +}: { + children: React.ReactNode +}) { + const storeRef = useRef() + if (!storeRef.current) { + // Create the store instance the first time this renders + storeRef.current = makeStore() + } + + return {children} +} \ No newline at end of file diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 9d98d4c..d03158b 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -3,6 +3,7 @@ import { Inter } from "next/font/google"; import "./globals.css"; import Navbar from "@/components/Navbar/Navbar"; import Footer from "@/components/Footer/Footer"; +import StoreProvider from "./StoreProvider"; const inter = Inter({ subsets: ["latin"] }); @@ -18,12 +19,14 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - - - - {children} -