From eb4ae7be05ed97bd02b7f3e9cc56393f435188e2 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Wed, 14 Jun 2023 13:22:20 +0700 Subject: layout promotion program di detail product dan layout modal popup --- src/lib/cart/components/Cart.jsx | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 907d1267..718541af 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -17,10 +17,16 @@ import DesktopView from '@/core/components/views/DesktopView' import ProductCard from '@/lib/product/components/ProductCard' import productSearchApi from '@/lib/product/api/productSearchApi' import whatsappUrl from '@/core/utils/whatsappUrl' +import useAuth from '@/core/hooks/useAuth' const Cart = () => { const router = useRouter() const [products, setProducts] = useState(null) + const auth = useAuth() + + useEffect(() => { + if (!auth) return + }, [auth]) const { cart } = useCart({ enabled: !products }) const [totalPriceBeforeTax, setTotalPriceBeforeTax] = useState(0) -- cgit v1.2.3 From e4b4f2c09ebd819acc204c2e58288fe9fc6294ea Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Thu, 15 Jun 2023 15:45:43 +0700 Subject: get dan delete cart --- src/lib/cart/api/CartApi.js | 12 +- src/lib/cart/components/Cart.jsx | 15 +- src/lib/cart/components/CartOld.jsx | 497 ++++++++++++++++++++++++++++++++++++ 3 files changed, 521 insertions(+), 3 deletions(-) create mode 100644 src/lib/cart/components/CartOld.jsx (limited to 'src/lib/cart') diff --git a/src/lib/cart/api/CartApi.js b/src/lib/cart/api/CartApi.js index 7683a935..038479f8 100644 --- a/src/lib/cart/api/CartApi.js +++ b/src/lib/cart/api/CartApi.js @@ -1,6 +1,7 @@ import odooApi from '@/core/api/odooApi' +import { getAuth } from '@/core/utils/auth' -const CartApi = async ({ variantIds }) => { +export const CartApi = async ({ variantIds }) => { if (variantIds) { const dataCart = await odooApi('GET', `/api/v2/product_variant/${variantIds}`) return dataCart @@ -8,4 +9,11 @@ const CartApi = async ({ variantIds }) => { return null } -export default CartApi +// export default CartApi + +export const getCartApi = async () => { + const id = getAuth()?.id + const cart = await odooApi('GET', `/api/v1/user/${id}/cart`) + + return cart +} \ No newline at end of file diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 718541af..561a0064 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -4,7 +4,7 @@ import Image from '@/core/components/elements/Image/Image' import NextImage from 'next/image' import currencyFormat from '@/core/utils/currencyFormat' import { useEffect, useState } from 'react' -import { deleteItemCart, getItemCart, updateItemCart } from '@/core/utils/cart' +import { deleteItemCart, getCart, getCartnew, getItemCart, updateItemCart } from '@/core/utils/cart' import { CheckIcon, TrashIcon } from '@heroicons/react/24/outline' import { createSlug } from '@/core/utils/slug' import { useRouter } from 'next/router' @@ -19,14 +19,27 @@ import productSearchApi from '@/lib/product/api/productSearchApi' import whatsappUrl from '@/core/utils/whatsappUrl' import useAuth from '@/core/hooks/useAuth' + +const { useQuery } = require('react-query') +const { getCartApi } = require('../api/CartApi') + const Cart = () => { const router = useRouter() const [products, setProducts] = useState(null) const auth = useAuth() + const { data: listCart } = useQuery('listCart', getCartApi) useEffect(() => { if (!auth) return }, [auth]) + + useEffect(() => { + if(listCart){ + setProducts(listCart.products) + } + }, [listCart]) + + console.log('product', products) const { cart } = useCart({ enabled: !products }) const [totalPriceBeforeTax, setTotalPriceBeforeTax] = useState(0) diff --git a/src/lib/cart/components/CartOld.jsx b/src/lib/cart/components/CartOld.jsx new file mode 100644 index 00000000..718541af --- /dev/null +++ b/src/lib/cart/components/CartOld.jsx @@ -0,0 +1,497 @@ +import Link from '@/core/components/elements/Link/Link' +import useCart from '../hooks/useCart' +import Image from '@/core/components/elements/Image/Image' +import NextImage from 'next/image' +import currencyFormat from '@/core/utils/currencyFormat' +import { useEffect, useState } from 'react' +import { deleteItemCart, getItemCart, updateItemCart } from '@/core/utils/cart' +import { CheckIcon, TrashIcon } from '@heroicons/react/24/outline' +import { createSlug } from '@/core/utils/slug' +import { useRouter } from 'next/router' +import BottomPopup from '@/core/components/elements/Popup/BottomPopup' +import { toast } from 'react-hot-toast' +import Spinner from '@/core/components/elements/Spinner/Spinner' +import Alert from '@/core/components/elements/Alert/Alert' +import MobileView from '@/core/components/views/MobileView' +import DesktopView from '@/core/components/views/DesktopView' +import ProductCard from '@/lib/product/components/ProductCard' +import productSearchApi from '@/lib/product/api/productSearchApi' +import whatsappUrl from '@/core/utils/whatsappUrl' +import useAuth from '@/core/hooks/useAuth' + +const Cart = () => { + const router = useRouter() + const [products, setProducts] = useState(null) + const auth = useAuth() + + useEffect(() => { + if (!auth) return + }, [auth]) + const { cart } = useCart({ enabled: !products }) + + const [totalPriceBeforeTax, setTotalPriceBeforeTax] = useState(0) + const [totalTaxAmount, setTotalTaxAmount] = useState(0) + const [totalDiscountAmount, setTotalDiscountAmount] = useState(0) + + const [deleteConfirmation, setDeleteConfirmation] = useState(null) + + const [productRecomendation, setProductRecomendation] = useState(null) + + useEffect(() => { + if (cart.data && !products) { + const productsWithQuantity = cart.data.map((product) => { + const productInCart = getItemCart({ productId: product.id }) + if (!productInCart) return + return { + ...product, + quantity: productInCart.quantity, + selected: productInCart.selected + } + }) + setProducts(productsWithQuantity) + } + }, [cart, products]) + + useEffect(() => { + if (!products) return + + let calculateTotalPriceBeforeTax = 0 + let calculateTotalTaxAmount = 0 + let calculateTotalDiscountAmount = 0 + for (const product of products) { + if (product.quantity == '') continue + updateItemCart({ + productId: product.id, + quantity: product.quantity, + selected: product.selected + }) + + if (!product.selected) continue + let priceBeforeTax = product.price.price / 1.11 + calculateTotalPriceBeforeTax += priceBeforeTax * product.quantity + calculateTotalTaxAmount += (product.price.price - priceBeforeTax) * product.quantity + calculateTotalDiscountAmount += + (product.price.price - product.price.priceDiscount) * product.quantity + } + setTotalPriceBeforeTax(calculateTotalPriceBeforeTax) + setTotalTaxAmount(calculateTotalTaxAmount) + setTotalDiscountAmount(calculateTotalDiscountAmount) + }, [products]) + + useEffect(() => { + const LoadProductSimilar = async () => { + const randProductIndex = Math.floor(Math.random() * products.length) + const productLoad = await productSearchApi({ + query: `q=${products?.[randProductIndex].parent.name}&limit=10&operation=OR` + }) + + setProductRecomendation(productLoad) + } + if (products?.length > 0 && !productRecomendation) LoadProductSimilar() + }, [products, productRecomendation]) + + const updateQuantity = (value, productId, operation = '') => { + let productIndex = products.findIndex((product) => product.id == productId) + if (productIndex < 0) return + + let productsToUpdate = products + let quantity = productsToUpdate[productIndex].quantity + if (value != '' && isNaN(parseInt(value))) return + value = value != '' ? parseInt(value) : '' + switch (operation) { + case 'PLUS': + quantity += value + break + case 'MINUS': + if (quantity - value < 1) return + quantity -= value + break + case 'BLUR': + if (value != '' && value > 0) return + quantity = 1 + break + default: + quantity = value != '' && value < 1 ? 1 : value + break + } + productsToUpdate[productIndex].quantity = quantity + setProducts([...productsToUpdate]) + } + + const toggleSelected = (productId) => { + let productIndex = products.findIndex((product) => product.id == productId) + if (productIndex < 0) return + + let productsToUpdate = products + productsToUpdate[productIndex].selected = !productsToUpdate[productIndex].selected + setProducts([...productsToUpdate]) + } + + const selectedProduct = () => { + if (!products) return [] + return products?.filter((product) => product?.selected == true) + } + + const deleteProduct = (productId) => { + const productsToUpdate = products.filter((product) => product.id != productId) + deleteItemCart({ productId }) + setDeleteConfirmation(null) + setProducts([...productsToUpdate]) + toast.success('Berhasil menghapus barang dari keranjang') + } + + return ( + <> + setDeleteConfirmation(null)} + title='Hapus dari Keranjang' + > +
+ Apakah anda yakin menghapus barang{' '} + {deleteConfirmation?.name} dari keranjang? +
+
+ + +
+
+ + +
+
+

Keranjang

+ Cari Produk Lain +
+ +
+ {cart.isLoading && ( +
+ +
+ )} + + {!cart.isLoading && (!products || products?.length == 0) && ( +
+ + Keranjang belanja anda masih kosong + +
+ )} + + {products?.map((product) => ( +
+ toggleSelected(product.id)} + checked={product?.selected} + className='mr-2 accent-danger-500 w-4' + /> + + + {product?.name} + +
+ + {product?.parent?.name} + +
+ {product?.code}{' '} + {product?.attributes.length > 0 ? `| ${product?.attributes.join(', ')}` : ''} +
+ {product?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
{product?.price?.discountPercentage}%
+
+ )} +
+ {currencyFormat(product?.price?.priceDiscount)} +
+
+
+ {currencyFormat(product?.price?.priceDiscount * product?.quantity)} +
+
+ + updateQuantity(e.target.value, product?.id)} + onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')} + /> + + +
+
+
+
+ ))} + +
+
+
+ Total: + +   + {selectedProduct().length > 0 + ? currencyFormat(totalPriceBeforeTax - totalDiscountAmount + totalTaxAmount) + : '-'} + +
+
+
+ + +
+
+
+
+
+ + +
+
+

Keranjang

+ + + + + + + + + + + + + {cart.isLoading && ( + + + + )} + {!cart.isLoading && (!products || products?.length == 0) && ( + + + + )} + {products && + products?.map((product) => ( + + + + + + + + + ))} + +
Nama ProdukJumlahHargaSubtotalAction
+
+ +
+
Keranjang belanja anda masih kosong
+ toggleSelected(product.id)} + checked={product?.selected} + className='accent-danger-500 w-4' + /> + + + {product?.name} + +
+ + {product?.parent?.name} + +
+ {product?.code}{' '} + {product?.attributes.length > 0 + ? `| ${product?.attributes.join(', ')}` + : ''} +
+
+
+ updateQuantity(e.target.value, product?.id)} + onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')} + /> + + {product?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ {product?.price?.discountPercentage}% +
+
+ )} +
+ {currencyFormat(product?.price?.priceDiscount)} +
+
+
+ {currencyFormat(product?.price?.priceDiscount * product?.quantity)} +
+
+
+ +
+
+ +
+ +
+ Tanya stock untuk pembelian anda sebelum melanjutkan pembayaran! + + {' '} + + Hubungi Kami + + +
+
+
+ +
+
+

Ringkasan Belanja

+
+
+ Total: + +   + {selectedProduct().length > 0 + ? currencyFormat(totalPriceBeforeTax - totalDiscountAmount + totalTaxAmount) + : '-'} + +
+
+
+ + +
+
+
+ +
+

Produk Yang Mungkin Kamu Suka

+
+ {productRecomendation && + productRecomendation.response.products.map((product) => ( + + ))} +
+
+
+
+ + ) +} + +export default Cart -- cgit v1.2.3 From 637c22f1886cecf7307ced88dc951134d466a3fa Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 19 Jun 2023 15:46:03 +0700 Subject: checkout --- src/lib/cart/components/Cart.jsx | 66 ++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 36 deletions(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 561a0064..31aa034d 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -4,7 +4,7 @@ import Image from '@/core/components/elements/Image/Image' import NextImage from 'next/image' import currencyFormat from '@/core/utils/currencyFormat' import { useEffect, useState } from 'react' -import { deleteItemCart, getCart, getCartnew, getItemCart, updateItemCart } from '@/core/utils/cart' +import { addCart, deleteItemCart, getCart, getCartApi, getCartnew, getItemCart, updateItemCart } from '@/core/utils/cart' import { CheckIcon, TrashIcon } from '@heroicons/react/24/outline' import { createSlug } from '@/core/utils/slug' import { useRouter } from 'next/router' @@ -19,28 +19,34 @@ import productSearchApi from '@/lib/product/api/productSearchApi' import whatsappUrl from '@/core/utils/whatsappUrl' import useAuth from '@/core/hooks/useAuth' - -const { useQuery } = require('react-query') -const { getCartApi } = require('../api/CartApi') - const Cart = () => { const router = useRouter() const [products, setProducts] = useState(null) + const [isLoading, setIsLoading] = useState(true) const auth = useAuth() - const { data: listCart } = useQuery('listCart', getCartApi) + + + const [cart, setCart] = useState(null) useEffect(() => { if (!auth) return }, [auth]) useEffect(() => { - if(listCart){ - setProducts(listCart.products) + const cart = async () => { + const listCart = await getCartApi() + setCart(listCart) } - }, [listCart]) + cart() + }) + + useEffect(() => { + if(cart){ + setProducts(cart.products) + setIsLoading(false) + } + }, [cart]) - console.log('product', products) - const { cart } = useCart({ enabled: !products }) const [totalPriceBeforeTax, setTotalPriceBeforeTax] = useState(0) const [totalTaxAmount, setTotalTaxAmount] = useState(0) @@ -50,20 +56,6 @@ const Cart = () => { const [productRecomendation, setProductRecomendation] = useState(null) - useEffect(() => { - if (cart.data && !products) { - const productsWithQuantity = cart.data.map((product) => { - const productInCart = getItemCart({ productId: product.id }) - if (!productInCart) return - return { - ...product, - quantity: productInCart.quantity, - selected: productInCart.selected - } - }) - setProducts(productsWithQuantity) - } - }, [cart, products]) useEffect(() => { if (!products) return @@ -73,11 +65,6 @@ const Cart = () => { let calculateTotalDiscountAmount = 0 for (const product of products) { if (product.quantity == '') continue - updateItemCart({ - productId: product.id, - quantity: product.quantity, - selected: product.selected - }) if (!product.selected) continue let priceBeforeTax = product.price.price / 1.11 @@ -127,8 +114,11 @@ const Cart = () => { quantity = value != '' && value < 1 ? 1 : value break } - productsToUpdate[productIndex].quantity = quantity + let qty = quantity + productsToUpdate[productIndex].quantity = qty + setProducts([...productsToUpdate]) + addCart(productId, qty, productsToUpdate[productIndex].selected) } const toggleSelected = (productId) => { @@ -136,8 +126,12 @@ const Cart = () => { if (productIndex < 0) return let productsToUpdate = products - productsToUpdate[productIndex].selected = !productsToUpdate[productIndex].selected + let isSelected = !productsToUpdate[productIndex].selected + productsToUpdate[productIndex].selected = isSelected + + setProducts([...productsToUpdate]) + addCart(productId, productsToUpdate[productIndex].quantity, isSelected) } const selectedProduct = () => { @@ -190,13 +184,13 @@ const Cart = () => {
- {cart.isLoading && ( + {isLoading && (
)} - {!cart.isLoading && (!products || products?.length == 0) && ( + {!isLoading && (!products || products?.length == 0) && (
Keranjang belanja anda masih kosong @@ -335,7 +329,7 @@ const Cart = () => { - {cart.isLoading && ( + {isLoading && (
@@ -344,7 +338,7 @@ const Cart = () => { )} - {!cart.isLoading && (!products || products?.length == 0) && ( + {!isLoading && (!products || products?.length == 0) && ( Keranjang belanja anda masih kosong -- cgit v1.2.3 From d2ac3371d30464801924539350ddb50eb42eb007 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Wed, 21 Jun 2023 13:19:30 +0700 Subject: handling cart --- src/lib/cart/components/Cart.jsx | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 31aa034d..a9113e75 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -4,7 +4,15 @@ import Image from '@/core/components/elements/Image/Image' import NextImage from 'next/image' import currencyFormat from '@/core/utils/currencyFormat' import { useEffect, useState } from 'react' -import { addCart, deleteItemCart, getCart, getCartApi, getCartnew, getItemCart, updateItemCart } from '@/core/utils/cart' +import { + addCart, + deleteItemCart, + getCart, + getCartApi, + getCartnew, + getItemCart, + updateItemCart +} from '@/core/utils/cart' import { CheckIcon, TrashIcon } from '@heroicons/react/24/outline' import { createSlug } from '@/core/utils/slug' import { useRouter } from 'next/router' @@ -18,6 +26,7 @@ import ProductCard from '@/lib/product/components/ProductCard' import productSearchApi from '@/lib/product/api/productSearchApi' import whatsappUrl from '@/core/utils/whatsappUrl' import useAuth from '@/core/hooks/useAuth' +import LogoSpinner from '@/core/components/elements/Spinner/LogoSpinner' const Cart = () => { const router = useRouter() @@ -25,8 +34,7 @@ const Cart = () => { const [isLoading, setIsLoading] = useState(true) const auth = useAuth() - - const [cart, setCart] = useState(null) + const [cart, setCart] = useState(null) useEffect(() => { if (!auth) return @@ -38,16 +46,15 @@ const Cart = () => { setCart(listCart) } cart() - }) + },[]) useEffect(() => { - if(cart){ + if (cart) { setProducts(cart.products) setIsLoading(false) } }, [cart]) - const [totalPriceBeforeTax, setTotalPriceBeforeTax] = useState(0) const [totalTaxAmount, setTotalTaxAmount] = useState(0) const [totalDiscountAmount, setTotalDiscountAmount] = useState(0) @@ -56,7 +63,6 @@ const Cart = () => { const [productRecomendation, setProductRecomendation] = useState(null) - useEffect(() => { if (!products) return @@ -116,7 +122,7 @@ const Cart = () => { } let qty = quantity productsToUpdate[productIndex].quantity = qty - + setProducts([...productsToUpdate]) addCart(productId, qty, productsToUpdate[productIndex].selected) } @@ -128,8 +134,7 @@ const Cart = () => { let productsToUpdate = products let isSelected = !productsToUpdate[productIndex].selected productsToUpdate[productIndex].selected = isSelected - - + setProducts([...productsToUpdate]) addCart(productId, productsToUpdate[productIndex].quantity, isSelected) } @@ -332,8 +337,8 @@ const Cart = () => { {isLoading && ( -
- +
+
-- cgit v1.2.3 From 84ae09f61f05f212ec098da1fd4ed14960119527 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 27 Jun 2023 09:07:22 +0700 Subject: promotion detail --- src/lib/cart/components/Cart.jsx | 155 +++++++++++++++++++++------------------ 1 file changed, 83 insertions(+), 72 deletions(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index a9113e75..cfbc3989 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -46,7 +46,7 @@ const Cart = () => { setCart(listCart) } cart() - },[]) + }, []) useEffect(() => { if (cart) { @@ -350,89 +350,100 @@ const Cart = () => { )} {products && products?.map((product) => ( - - - toggleSelected(product.id)} - checked={product?.selected} - className='accent-danger-500 w-4' - /> - - - - {product?.name} + + +
+
Promo
+
Pilih Promo Yang Tersedia Bisa lebih Hemat
+
Cek Promo
+
+ + + + + toggleSelected(product.id)} + checked={product?.selected} + className='accent-danger-500 w-4' /> - -
+ + - {product?.parent?.name} + {product?.name} -
- {product?.code}{' '} - {product?.attributes.length > 0 - ? `| ${product?.attributes.join(', ')}` - : ''} -
-
- - - updateQuantity(e.target.value, product?.id)} - onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')} - /> - - - {product?.price?.discountPercentage > 0 && ( -
-
- {currencyFormat(product?.price?.price)} +
+ + {product?.parent?.name} + +
+ {product?.code}{' '} + {product?.attributes.length > 0 + ? `| ${product?.attributes.join(', ')}` + : ''}
-
- {product?.price?.discountPercentage}% +
+ + + updateQuantity(e.target.value, product?.id)} + onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')} + /> + + + {product?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ {product?.price?.discountPercentage}% +
+ )} +
+ {currencyFormat(product?.price?.priceDiscount)}
- )} -
- {currencyFormat(product?.price?.priceDiscount)} -
- - -
- {currencyFormat(product?.price?.priceDiscount * product?.quantity)} -
- - -
- -
- - + + +
+ {currencyFormat(product?.price?.priceDiscount * product?.quantity)} +
+ + +
+ +
+ + + ))} -- cgit v1.2.3 From 927022b91855dba6d64365b68b4d20551256e7db Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 27 Jun 2023 16:47:16 +0700 Subject: product detail mobile & cart --- src/lib/cart/components/Cart.jsx | 173 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 160 insertions(+), 13 deletions(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index cfbc3989..29bbf080 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -7,10 +7,7 @@ import { useEffect, useState } from 'react' import { addCart, deleteItemCart, - getCart, getCartApi, - getCartnew, - getItemCart, updateItemCart } from '@/core/utils/cart' import { CheckIcon, TrashIcon } from '@heroicons/react/24/outline' @@ -27,6 +24,8 @@ import productSearchApi from '@/lib/product/api/productSearchApi' import whatsappUrl from '@/core/utils/whatsappUrl' import useAuth from '@/core/hooks/useAuth' import LogoSpinner from '@/core/components/elements/Spinner/LogoSpinner' +import { getPromotionProgram } from '@/lib/promotinProgram/api/homepageApi' +import PromotionType from '@/lib/promotinProgram/components/PromotionType' const Cart = () => { const router = useRouter() @@ -50,7 +49,21 @@ const Cart = () => { useEffect(() => { if (cart) { - setProducts(cart.products) + const processProducts = async () => { + const updatedProducts = await Promise.all( + cart.products.map(async (product) => { + const id = product.id + const program = await getPromotionProgram({ id }) + const isPromo = program.length > 0 ? 1 : 0 + return { + ...product, + isPromo + } + }) + ) + setProducts(updatedProducts) + } + processProducts() setIsLoading(false) } }, [cart]) @@ -62,6 +75,10 @@ const Cart = () => { const [deleteConfirmation, setDeleteConfirmation] = useState(null) const [productRecomendation, setProductRecomendation] = useState(null) + const [promotionType, setPromotionType] = useState(null) + const [variantId, setVariantId] = useState(null) + const [quantity, setQuantity] = useState(null) + const [promotionActiveId, setPromotionActiveId] = useState(null) useEffect(() => { if (!products) return @@ -84,6 +101,18 @@ const Cart = () => { setTotalDiscountAmount(calculateTotalDiscountAmount) }, [products]) + useEffect(() => { + if(!promotionActiveId) return + + console.log('bajingan') + updateItemCart({ + productId: variantId, + quantity, + programLineId:promotionActiveId, + selected: true + }) + }, [promotionActiveId, variantId, quantity]) + useEffect(() => { const LoadProductSimilar = async () => { const randProductIndex = Math.floor(Math.random() * products.length) @@ -152,6 +181,13 @@ const Cart = () => { toast.success('Berhasil menghapus barang dari keranjang') } + const handlePopUpPromo = (variantId, quantity, promoId = null) => { + setPromotionType(true) + setVariantId(variantId) + setQuantity(quantity) + setPromotionActiveId(promoId) + } + return ( <> {
+ setPromotionType(false)} + > +
+ +
+
+
@@ -351,15 +404,61 @@ const Cart = () => { {products && products?.map((product) => ( <> - - -
-
Promo
-
Pilih Promo Yang Tersedia Bisa lebih Hemat
-
Cek Promo
-
- - + {product.isPromo > 0 && ( + + +
+ {product.program ? ( + <> +
+ + {product.program.type.label} + +
+
+ Anda Lebih hamat{' '} + + {' '} + {currencyFormat(product.program.price.priceDiscount)} + +
+ + ) : ( + <> +
+ Promo +
+
+ Pilih Promo Yang Tersedia Bisa lebih Hemat +
+ + )} +
handlePopUpPromo(product.id, product.quantity, product.program?.id)} + className='ml-auto text-red-500 flex gap-x-1 cursor-pointer' + > +
Cek Promo
+
+ +
+
+
+ + + )} {
+ {product.program && ( + + + +
+ {product.program.name} +
+
+
+
+ {product.program.type.label} +
+
{product.program.name}
+
+
+ + + + + + {product?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ )} +
+ {product?.program?.price.priceDiscount > 0 ? 'Gratis' : ''} +
+ + +
+ {product.program.price.priceDiscount > 0 ? 'Gratis' : ''} +
+ + + + )} ))} -- cgit v1.2.3 From c4ff871551cfbf3ed759b3d7be735d7039edb6f5 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Fri, 30 Jun 2023 14:58:05 +0700 Subject: cart --- src/lib/cart/components/Cart.jsx | 83 ++++++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 33 deletions(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 29bbf080..0cbcacd8 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -4,12 +4,7 @@ import Image from '@/core/components/elements/Image/Image' import NextImage from 'next/image' import currencyFormat from '@/core/utils/currencyFormat' import { useEffect, useState } from 'react' -import { - addCart, - deleteItemCart, - getCartApi, - updateItemCart -} from '@/core/utils/cart' +import { addCart, deleteItemCart, getCartApi, updateItemCart } from '@/core/utils/cart' import { CheckIcon, TrashIcon } from '@heroicons/react/24/outline' import { createSlug } from '@/core/utils/slug' import { useRouter } from 'next/router' @@ -39,12 +34,13 @@ const Cart = () => { if (!auth) return }, [auth]) + const getCart = async () => { + const listCart = await getCartApi() + setCart(listCart) + } + useEffect(() => { - const cart = async () => { - const listCart = await getCartApi() - setCart(listCart) - } - cart() + getCart() }, []) useEffect(() => { @@ -102,16 +98,20 @@ const Cart = () => { }, [products]) useEffect(() => { - if(!promotionActiveId) return - - console.log('bajingan') - updateItemCart({ - productId: variantId, - quantity, - programLineId:promotionActiveId, - selected: true - }) - }, [promotionActiveId, variantId, quantity]) + const updateData = () => { + updateItemCart({ + productId: variantId, + quantity, + programLineId: promotionActiveId, + selected: true + }).then(() => { + getCart().then(() => { + setPromotionType(false) + }) + }) + } + updateData() + }, [promotionActiveId]) useEffect(() => { const LoadProductSimilar = async () => { @@ -416,11 +416,17 @@ const Cart = () => {
- Anda Lebih hamat{' '} - - {' '} - {currencyFormat(product.program.price.priceDiscount)} - + {product.program.type.value == 'merchandise' ? ( + <>Selamat anda mendapatkan merchandise indoteknik.com + ) : ( + <> + Selamat! Pembelian anda lebih hemat + + {' '} + {currencyFormat(product.program.price.priceDiscount)} + + + )}
) : ( @@ -434,7 +440,13 @@ const Cart = () => { )}
handlePopUpPromo(product.id, product.quantity, product.program?.id)} + onClick={() => + handlePopUpPromo( + product.id, + product.quantity, + product.program?.id + ) + } className='ml-auto text-red-500 flex gap-x-1 cursor-pointer' >
Cek Promo
@@ -459,7 +471,10 @@ const Cart = () => { )} - + { />
-
-
- {product.program.type.label} -
-
{product.program.name}
+
+ + {product.program.type.label} + +
+
+ {product.program.name}
-- cgit v1.2.3 From 2777e0d64152dace9c5307cd07bd8e13c6f6631e Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 3 Jul 2023 10:05:40 +0700 Subject: cart mobile --- src/lib/cart/components/Cart.jsx | 210 +++++++++++++++++++++++++-------------- 1 file changed, 138 insertions(+), 72 deletions(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 0cbcacd8..45f2f770 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -256,85 +256,151 @@ const Cart = () => {
)} - {products?.map((product) => ( -
- toggleSelected(product.id)} - checked={product?.selected} - className='mr-2 accent-danger-500 w-4' - /> - - - {product?.name} - -
- - {product?.parent?.name} - -
- {product?.code}{' '} - {product?.attributes.length > 0 ? `| ${product?.attributes.join(', ')}` : ''} -
- {product?.price?.discountPercentage > 0 && ( -
-
- {currencyFormat(product?.price?.price)} + {products && + products?.map((product) => ( + <> + {product.isPromo > 0 && ( +
+ {product.program ? ( + <> +
+ {product.program.type.label} +
+
+ {product.program.type.value == 'merchandise' ? ( + <>Selamat anda mendapatkan merchandise indoteknik.com + ) : ( + <> + Selamat! Pembelian anda lebih hemat + + {' '} + {currencyFormat(product.program.price.priceDiscount)} + + + )} +
+ + ) : ( + <> +
+ Promo +
+
Pilih Promo Yang Tersedia Bisa lebih Hemat
+ + )} +
+ handlePopUpPromo(product.id, product.quantity, product.program?.id) + } + className='ml-auto text-red-500 flex gap-x-1 cursor-pointer' + > +
Cek Promo
+
+ +
-
{product?.price?.discountPercentage}%
)} -
- {currencyFormat(product?.price?.priceDiscount)} -
-
-
- {currencyFormat(product?.price?.priceDiscount * product?.quantity)} -
-
- - updateQuantity(e.target.value, product?.id)} - onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')} +
+ toggleSelected(product.id)} + checked={product?.selected} + className='mr-2 accent-danger-500 w-4' + /> + + + {product?.name} - - + {product?.parent?.name} + +
+ {product?.code}{' '} + {product?.attributes.length > 0 + ? `| ${product?.attributes.join(', ')}` + : ''} +
+ {product?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ {product?.price?.discountPercentage}% +
+
+ )} +
+ {currencyFormat(product?.price?.priceDiscount)} +
+
+
+ {currencyFormat(product?.price?.priceDiscount * product?.quantity)} +
+
+ + updateQuantity(e.target.value, product?.id)} + onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')} + /> + + +
+
-
-
- ))} + + ))}
-- cgit v1.2.3 From 8b173abd19630b7cab5f0f562925c46e3f71d096 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 4 Jul 2023 13:38:33 +0700 Subject: promotion program --- src/lib/cart/components/Cart.jsx | 149 +++++++++++++++++++++++---------------- 1 file changed, 90 insertions(+), 59 deletions(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 45f2f770..f1584f98 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -59,7 +59,8 @@ const Cart = () => { ) setProducts(updatedProducts) } - processProducts() + // processProducts() + setProducts(cart.products) setIsLoading(false) } }, [cart]) @@ -86,6 +87,10 @@ const Cart = () => { if (product.quantity == '') continue if (!product.selected) continue + + if (product.canBuy == false) { + toggleSelected(product.id) + } let priceBeforeTax = product.price.price / 1.11 calculateTotalPriceBeforeTax += priceBeforeTax * product.quantity calculateTotalTaxAmount += (product.price.price - priceBeforeTax) * product.quantity @@ -153,7 +158,12 @@ const Cart = () => { productsToUpdate[productIndex].quantity = qty setProducts([...productsToUpdate]) - addCart(productId, qty, productsToUpdate[productIndex].selected) + addCart( + productId, + qty, + productsToUpdate[productIndex].selected, + productsToUpdate[productIndex].program?.id + ) } const toggleSelected = (productId) => { @@ -165,7 +175,12 @@ const Cart = () => { productsToUpdate[productIndex].selected = isSelected setProducts([...productsToUpdate]) - addCart(productId, productsToUpdate[productIndex].quantity, isSelected) + addCart( + productId, + productsToUpdate[productIndex].quantity, + isSelected, + productsToUpdate[productIndex].program?.id + ) } const selectedProduct = () => { @@ -259,7 +274,7 @@ const Cart = () => { {products && products?.map((product) => ( <> - {product.isPromo > 0 && ( + {product.hasProgram > 0 && (
{product.program ? ( <> @@ -470,7 +485,7 @@ const Cart = () => { {products && products?.map((product) => ( <> - {product.isPromo > 0 && ( + {product.hasProgram && (
@@ -489,7 +504,7 @@ const Cart = () => { Selamat! Pembelian anda lebih hemat {' '} - {currencyFormat(product.program.price.priceDiscount)} + {currencyFormat(product.program?.totalSavings)} )} @@ -539,9 +554,10 @@ const Cart = () => { )} - + + toggleSelected(product.id)} @@ -549,7 +565,8 @@ const Cart = () => { className='accent-danger-500 w-4' /> - + + {
- + + { onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')} /> - + + {product?.price?.discountPercentage > 0 && (
@@ -607,7 +626,8 @@ const Cart = () => { {currencyFormat(product?.price?.priceDiscount)}
- + +
{currencyFormat(product?.price?.priceDiscount * product?.quantity)}
@@ -623,54 +643,62 @@ const Cart = () => {
- {product.program && ( - - - -
- {product.program.name} -
-
-
- - {product.program.type.label} - -
-
- {product.program.name} -
-
- - - - - - {product?.price?.discountPercentage > 0 && ( -
-
- {currencyFormat(product?.price?.price)} + {product?.program?.items && ( + + {product.program.items.map((item) => ( + <> + + + + + +
+ {item.name}
-
- )} -
- {product?.program?.price.priceDiscount > 0 ? 'Gratis' : ''} -
- - -
- {product.program.price.priceDiscount > 0 ? 'Gratis' : ''} -
- - +
+
+ + {product.program.type.label} + +
+
{item.name}
+
+ + + + + + + + {item?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ )} +
+ {item?.price.priceDiscount > 0 ? 'Gratis' : ''} +
+ + + +
+ {item.price.priceDiscount > 0 ? 'Gratis' : ''} +
+ + + + ))} )} @@ -747,4 +775,7 @@ const Cart = () => { ) } +const ComponentCanBuy = ({ canBuy }) => + !canBuy &&
+ export default Cart -- cgit v1.2.3 From 9272a07644a75d201753501cfff173b1260963ea Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Wed, 5 Jul 2023 09:29:46 +0700 Subject: cart, checkout dan nav bar mobile --- src/lib/cart/components/Cart.jsx | 69 +++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 8 deletions(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index f1584f98..224d02d1 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -278,18 +278,18 @@ const Cart = () => {
{product.program ? ( <> -
+
{product.program.type.label}
-
+
{product.program.type.value == 'merchandise' ? ( <>Selamat anda mendapatkan merchandise indoteknik.com ) : ( <> - Selamat! Pembelian anda lebih hemat - + Selamat! Pembelian anda hemat + {' '} - {currencyFormat(product.program.price.priceDiscount)} + {currencyFormat(product.program?.totalSavings)} )} @@ -307,9 +307,12 @@ const Cart = () => { onClick={() => handlePopUpPromo(product.id, product.quantity, product.program?.id) } - className='ml-auto text-red-500 flex gap-x-1 cursor-pointer' + className='ml-auto text-red-500 flex gap-x-0 cursor-pointer' > -
Cek Promo
+
+ {' '} + Cek Promo +
)} -
+
+ toggleSelected(product.id)} @@ -414,6 +418,55 @@ const Cart = () => {
+ {product.program && + product.program.items && + product.program.items.map((item) => ( +
+ + + + {item?.name} + +
+ +
+
+ + {product.program.type.label} + +
+
{item.name}
+
+ + {item.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(item?.price?.price)} +
+
+ )} +
Gratis
+
+
+ ))} ))} -- cgit v1.2.3 From 581334e8d077916c3a9ab87fd5b6e6b5126aba12 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 10 Jul 2023 10:00:33 +0700 Subject: add auth id --- src/lib/cart/components/Cart.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/lib/cart') diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 224d02d1..41efffe9 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -111,7 +111,9 @@ const Cart = () => { selected: true }).then(() => { getCart().then(() => { - setPromotionType(false) + if(promotionActiveId){ + setPromotionType(false) + } }) }) } -- cgit v1.2.3