diff --git a/src/actions/cart.tsx b/src/actions/cart.tsx index 2828d5af..bebe1d3f 100644 --- a/src/actions/cart.tsx +++ b/src/actions/cart.tsx @@ -3,45 +3,63 @@ import { getCookieCart, updateCookieCartProduct, removeCookieCartProduct, - changeCookieCartProductQuanity, getCartProductKey, } from "@/lib/utils/cart"; export const GRBPWR_CART = "grbpwr-cart"; -export async function addCartProduct(slug: string, size: string) { +export async function addCartProduct({ + slug, + size, + price, +}: { + slug: string; + size: string; + price: number; +}) { "use server"; const cartData = getCookieCart(); try { if (!cartData) { - createCookieCartProduct(slug, size); + createCookieCartProduct({ productSlug: slug, size, price }); return; } const productKey = getCartProductKey(slug, size); const cartProduct = cartData.products[productKey]; - let newProductQuanity; + const newProduct = { + quanity: 0, + price: 0, + }; if (cartProduct) { - newProductQuanity = cartProduct.quanity + 1; + newProduct.quanity = cartProduct.quanity + 1; + newProduct.price = cartProduct.price + price; } else { - newProductQuanity = 1; + newProduct.quanity = 1; + newProduct.price = price; } - updateCookieCartProduct(slug, size, newProductQuanity); + updateCookieCartProduct({ productSlug: slug, size, data: newProduct }); } catch (error) { console.log("failed to parse cart", error); } } -export async function removeCartProduct(slug: string, size: string) { +export async function removeCartProduct({ + productSlug, + size, +}: { + productSlug: string; + size: string; +}) { "use server"; try { - removeCookieCartProduct(slug, size); + removeCookieCartProduct(productSlug, size); } catch (error) { console.log("failed to parse cart", error); } @@ -51,25 +69,48 @@ export async function changeCartProductQuanity({ slug, size, operation, + price, }: { slug: string; + price: number; size: string; operation: "increase" | "decrease"; }) { "use server"; + const cartData = getCookieCart(); try { - const cartData = getCookieCart(); - if ( - operation === "decrease" && - cartData?.products[getCartProductKey(slug, size)]?.quanity === 1 - ) { + if (!cartData) return; + + const productKey = getCartProductKey(slug, size); + const cartProduct = cartData.products[productKey]; + + if (operation === "decrease" && cartProduct.quanity === 1) { removeCookieCartProduct(slug, size); return; } - changeCookieCartProductQuanity(slug, size, operation); + const newProduct = { + quanity: cartProduct.quanity, + price: cartProduct.price, + }; + + if (operation === "decrease") { + newProduct.quanity = cartProduct.quanity - 1; + newProduct.price = cartProduct.price - price; + } + + if (operation === "increase") { + newProduct.quanity = cartProduct.quanity + 1; + newProduct.price = cartProduct.price + price; + } + + updateCookieCartProduct({ + productSlug: slug, + size, + data: newProduct, + }); } catch (error) { console.log("failed to parse cart", error); } diff --git a/src/app/cart/page.tsx b/src/app/cart/page.tsx index b9c10dba..1f9c4cb0 100644 --- a/src/app/cart/page.tsx +++ b/src/app/cart/page.tsx @@ -5,10 +5,11 @@ import { CartProductsSkeleton } from "@/components/ui/Skeleton"; import Button from "@/components/ui/Button"; import { ButtonStyle } from "@/components/ui/Button/styles"; import Link from "next/link"; +import TotalPrice from "@/components/cart/TotalPrice"; export const dynamic = "force-dynamic"; -export default async function Page() { +export default async function CartPage() { return (
@@ -24,8 +25,9 @@ export default async function Page() {
-

total:

-

170$

+ {/*

total:

+

170$

*/} +
measurements
- + {baseCurrencyPrice && + product?.product?.slug && + product?.sizes?.length && ( + + )}
diff --git a/src/components/cart/CartItemRow.tsx b/src/components/cart/CartItemRow.tsx index 2c574973..b61342a7 100644 --- a/src/components/cart/CartItemRow.tsx +++ b/src/components/cart/CartItemRow.tsx @@ -15,6 +15,7 @@ export default function CartItemRow({ if (!product) return null; const { product: p } = product; + const basicCurrencyValue = p?.productDisplay?.productBody?.price?.value; return (
@@ -34,12 +35,15 @@ export default function CartItemRow({
- + {p?.slug && basicCurrencyValue && ( + + )}
quanity: {quanity}
diff --git a/src/components/cart/CartPopup.tsx b/src/components/cart/CartPopup.tsx index 265c6141..38cc951f 100644 --- a/src/components/cart/CartPopup.tsx +++ b/src/components/cart/CartPopup.tsx @@ -1,13 +1,19 @@ "use client"; -import Button from "@/components/ui/Button"; import { useState } from "react"; -import { ButtonStyle } from "../ui/Button/styles"; import Link from "next/link"; -import { cn } from "@/lib/utils"; import { useClickAway } from "@uidotdev/usehooks"; +import Button from "@/components/ui/Button"; +import { cn } from "@/lib/utils"; +import { ButtonStyle } from "../ui/Button/styles"; -export default function CartPopup({ children }: { children: React.ReactNode }) { +export default function CartPopup({ + children, + itemsQuanity, +}: { + children: React.ReactNode; + itemsQuanity?: number; +}) { const [open, setOpenStatus] = useState(false); const ref = useClickAway(() => { @@ -21,7 +27,7 @@ export default function CartPopup({ children }: { children: React.ReactNode }) { onClick={() => setOpenStatus(!open)} style={ButtonStyle.underlinedButton} > - cart + cart {itemsQuanity ? `(${itemsQuanity})` : ""}
added to cart {"[06]"}
-
-
- {children} -
-
-
-
- total: - 170$ -
+ {children}
diff --git a/src/components/cart/TotalPrice/SelectedCurrency.tsx b/src/components/cart/TotalPrice/SelectedCurrency.tsx new file mode 100644 index 00000000..94684953 --- /dev/null +++ b/src/components/cart/TotalPrice/SelectedCurrency.tsx @@ -0,0 +1,21 @@ +"use client"; + +import { useHeroContext } from "@/components/contexts/HeroContext"; + +export default function SelectedCurrency({ + baseCurrencyTotal, +}: { + baseCurrencyTotal: number; +}) { + const { selectedCurrency } = useHeroContext(); + + return ( +
+
total
+
base currency: {baseCurrencyTotal}
+
+ todo: convert to {selectedCurrency}: {baseCurrencyTotal} +
+
+ ); +} diff --git a/src/components/cart/TotalPrice/index.tsx b/src/components/cart/TotalPrice/index.tsx new file mode 100644 index 00000000..f7b80af7 --- /dev/null +++ b/src/components/cart/TotalPrice/index.tsx @@ -0,0 +1,19 @@ +import { getCookieCart } from "@/lib/utils/cart"; +import SelectedCurrency from "./SelectedCurrency"; + +export default function TotalPrice() { + const cartData = getCookieCart(); + + if (!cartData) return; + + const total = Object.values(cartData.products).reduce( + (acc, p) => acc + p.price, + 0, + ); + + return ( +
+ +
+ ); +} diff --git a/src/components/forms/AddToCartForm/index.tsx b/src/components/forms/AddToCartForm/index.tsx index 09248985..fda7c52b 100644 --- a/src/components/forms/AddToCartForm/index.tsx +++ b/src/components/forms/AddToCartForm/index.tsx @@ -12,10 +12,20 @@ export default function AddToCartForm({ handleSubmit, sizes, slug, + price, }: { - handleSubmit: (slug: string, size: string) => Promise; + handleSubmit: ({ + slug, + size, + price, + }: { + slug: string; + size: string; + price: number; + }) => Promise; slug: string; sizes: common_ProductSize[]; + price: number; }) { const [loading, setLoadingStatus] = useState(false); const form = useForm({ @@ -27,7 +37,7 @@ export default function AddToCartForm({ setLoadingStatus(true); try { - await handleSubmit(slug, data.size); + await handleSubmit({ slug, size: data.size, price }); } catch (error) { console.error(error); } finally { diff --git a/src/components/layouts/CoreLayout.tsx b/src/components/layouts/CoreLayout.tsx index eef7949a..2639a85f 100644 --- a/src/components/layouts/CoreLayout.tsx +++ b/src/components/layouts/CoreLayout.tsx @@ -6,6 +6,7 @@ import CartPopup from "@/components/cart/CartPopup"; import Link from "next/link"; import { Suspense } from "react"; import CartProductsList from "../cart/CartProductsList"; +import TotalPrice from "../cart/TotalPrice"; export default function CoreLayout({ children, @@ -39,9 +40,19 @@ export default function CoreLayout({