import Alert from '@/core/components/elements/Alert/Alert'
import Divider from '@/core/components/elements/Divider/Divider'
import Link from '@/core/components/elements/Link/Link'
import useAuth from '@/core/hooks/useAuth'
import { getItemAddress } from '@/core/utils/address'
import addressesApi from '@/lib/address/api/addressesApi'
import CartApi from '@/lib/cart/api/CartApi'
import { ExclamationCircleIcon } from '@heroicons/react/24/outline'
import { useEffect, useRef, useState } from 'react'
import _ from 'lodash'
import { deleteItemCart, getCart, getItemCart } from '@/core/utils/cart'
import currencyFormat from '@/core/utils/currencyFormat'
import { toast } from 'react-hot-toast'
import getFileBase64 from '@/core/utils/getFileBase64'
import checkoutApi from '../api/checkoutApi'
import { useRouter } from 'next/router'
import VariantGroupCard from '@/lib/variant/components/VariantGroupCard'
import axios from 'axios'
import Image from '@/core/components/elements/Image/Image'
import MobileView from '@/core/components/views/MobileView'
import DesktopView from '@/core/components/views/DesktopView'
import whatsappUrl from '@/core/utils/whatsappUrl'
import { createSlug } from '@/core/utils/slug'
const Checkout = () => {
const router = useRouter()
const auth = useAuth()
const [selectedAddress, setSelectedAddress] = useState({
shipping: null,
invoicing: null
})
const [addresses, setAddresses] = useState(null)
useEffect(() => {
if (!auth) return
const getAddresses = async () => {
const dataAddresses = await addressesApi()
setAddresses(dataAddresses)
}
getAddresses()
}, [auth])
useEffect(() => {
if (!addresses) return
const matchAddress = (key) => {
const addressToMatch = getItemAddress(key)
const foundAddress = addresses.filter((address) => address.id == addressToMatch)
if (foundAddress.length > 0) {
return foundAddress[0]
}
return addresses[0]
}
setSelectedAddress({
shipping: matchAddress('shipping'),
invoicing: matchAddress('invoicing')
})
}, [addresses])
const [products, setProducts] = useState(null)
const [totalAmount, setTotalAmount] = useState(0)
const [totalDiscountAmount, setTotalDiscountAmount] = useState(0)
const [priceCheck, setPriceCheck] = useState(false)
useEffect(() => {
const loadProducts = async () => {
let variantIds = ''
let { query } = router
if (query?.productId) {
variantIds = query.productId
} else {
const cart = getCart()
variantIds = _.filter(cart, (o) => o.selected == true)
.map((o) => o.productId)
.join(',')
}
const dataProducts = await CartApi({ variantIds })
const productsWithQuantity = dataProducts?.map((product) => {
if (product.price.priceDiscount == 0) setPriceCheck(true)
return {
...product,
quantity: query.quantity
? query.quantity
: getItemCart({ productId: product.id }).quantity
}
})
setProducts(productsWithQuantity)
}
loadProducts()
}, [router])
useEffect(() => {
if (products) {
let calculateTotalAmount = 0
let calculateTotalDiscountAmount = 0
products.forEach((product) => {
calculateTotalAmount += product.price.price * product.quantity
calculateTotalDiscountAmount +=
(product.price.price - product.price.priceDiscount) * product.quantity
})
setTotalAmount(calculateTotalAmount)
setTotalDiscountAmount(calculateTotalDiscountAmount)
}
}, [products])
const poNumber = useRef(null)
const poFile = useRef(null)
const [isLoading, setIsLoading] = useState(false)
const checkout = async () => {
const file = poFile.current.files[0]
if (typeof file !== 'undefined' && file.size > 5000000) {
toast.error('Maksimal ukuran file adalah 5MB', { position: 'bottom-center' })
return
}
setIsLoading(true)
const productOrder = products.map((product) => ({
product_id: product.id,
quantity: product.quantity
}))
let data = {
partner_shipping_id: auth.partnerId,
partner_invoice_id: auth.partnerId,
order_line: JSON.stringify(productOrder),
type: 'sale_order'
}
if (poNumber.current.value) data.po_number = poNumber.current.value
if (typeof file !== 'undefined') data.po_file = await getFileBase64(file)
const isCheckouted = await checkoutApi({ data })
if (!isCheckouted?.id) {
toast.error('Gagal melakukan transaksi, terjadi kesalahan internal')
return
}
for (const product of products) deleteItemCart({ productId: product.id })
const payment = await axios.post(
`${process.env.NEXT_PUBLIC_SELF_HOST}/api/shop/midtrans-payment?transactionId=${isCheckouted.id}`
)
setIsLoading(false)
window.location.href = payment.data.redirectUrl
}
const taxTotal = (totalAmount - totalDiscountAmount) * 0.11
return (
<>
*) Belum termasuk biaya pengiriman
Dengan melakukan pembelian melalui website Indoteknik, saya menyetujui{' '}
Syarat & Ketentuan
{' '}
yang berlaku
Ukuran dokumen PO Maksimal 5MB
Dengan melakukan pembelian melalui website Indoteknik, saya menyetujui{' '}
Syarat & Ketentuan
{' '}
yang berlaku
Ukuran dokumen PO Maksimal 5MB
{products?.map((product) => (
Nama Produk
Jumlah
Harga
Subtotal
))}
{product?.price?.discountPercentage > 0 && (
{priceCheck && (
{address.name}
{address.mobile}
{address.street}, {address?.city?.name}
Indoteknik
Jl. Bandengan Utara Raya No.85, RT.3/RW.16, Penjaringan, Kec. Penjaringan, Kota Jkt Utara, Daerah Khusus Ibukota Jakarta, Indonesia Kodepos : 14440
Telp : 021-2933 8828/29
Mobile : 0813 9000 7430
*) Belum termasuk biaya pengiriman