import { Spinner } from '@chakra-ui/react'; import axios from 'axios'; import { AnimatePresence, motion } from 'framer-motion'; import React, { useState } from 'react'; import { useForm } from 'react-hook-form'; import { useQuery } from 'react-query'; import { useAddress } from '../stores/useAdress'; import currencyFormat from '@/core/utils/currencyFormat'; import { useCheckout } from '../stores/stateCheckout'; function mappingItems(products) { return products?.map((item) => ({ name: item.parent.name, description: `${item.code} - ${item.name}`, value: item.price.priceDiscount, weight: item.weight * 1000 * item.quantity, quantity: item.quantity, canInstant: item.availableQuantity > item.quantity ? true : false, })); } function mappingCourier(couriers, notIncludeInstant = false) { return couriers?.reduce((result, item) => { const { courier_code, courier_service_code } = item; if ( notIncludeInstant && ['hours'].includes(item.shipment_duration_unit.toLowerCase()) ) { return result; } // Jika courier_code belum ada di result, buat objek baru untuknya if (!result[courier_code]) { result[courier_code] = { courier_name: item.courier_name, courier_code: courier_code, service_type: { [courier_service_code]: { service_name: item.courier_service_name, duration: item.duration, shipment_duration: item.duration, price: item.price, service_type: item.service_type, description: item.description, }, }, }; } else { result[courier_code].service_type[courier_service_code] = { service_name: item.courier_service_name, duration: item.duration, shipment_duration: item.duration, price: item.price, service_type: item.service_type, description: item.description, }; } return result; }, {}); } function hasCanInstantFalse(items) { return items.some((item) => item.canInstant === false); } // interface CourierService { // courier_name: string; // courier_code: string; // service_type: { // [key: string]: { // service_name: string; // duration: number; // shipment_duration: number; // price: number; // service_type: string; // description: string; // }; // }; // } // interface ServiceOption { // service_name: string; // duration: number; // shipment_duration: number; // price: number; // service_type: string; // description: string; // } export default function SectionExpedition({ products }) { const { addressMaps, coordinate, postalCode } = useAddress(); const { control, handleSubmit } = useForm(); const [selectedCourier, setSelectedCourier] = useState(''); const [serviceOptions, setServiceOptions] = useState([]); const [selectedService, setSelectedService] = useState(null); const [isOpen, setIsOpen] = useState(false); const { checkWeigth, checkoutValidation } = useCheckout(); let destination = {}; let items = mappingItems(products); let notIncludeInstant = hasCanInstantFalse(items); console.log('instanCourier', items); if (addressMaps) { destination = { origin_latitude: -6.3031123, origin_longitude: 106.7794934999, ...coordinate, }; } else if (postalCode) { destination = { origin_postal_code: 12440, destination_postal_code: postalCode, }; } const fetchExpedition = async () => { let body = { ...destination, couriers: 'gojek,grab,deliveree,lalamove,jne,tiki,ninja,lion,rara,sicepat,jnt,pos,idexpress,rpx,wahana,jdl,pos,anteraja,sap,paxel,borzo', items: items, }; try { const response = await axios.get(`/api/biteship-service`, { params: { body: JSON.stringify(body) }, }); return response; } catch (error) { console.error('Failed to fetch expedition rates:', error); } }; const { data, isLoading } = useQuery( ['expedition', JSON.stringify(destination), JSON.stringify(items)], fetchExpedition, { enabled: Boolean(Object.keys(destination).length) && items?.length > 0 && !checkWeigth, staleTime: Infinity, cacheTime: Infinity, } ); console.log('data', data); const couriers = mappingCourier(data?.data?.pricing, true) || null; const onCourierChange = (e) => { setIsOpen(false); const courier = e.target.value; setSelectedService(null); setSelectedCourier(courier); console.log('courier', courier); // Menentukan layanan berdasarkan pengiriman yang dipilih if (courier && courier !== '0' && courier !== '32' && couriers[courier]) { setServiceOptions(Object.values(couriers[courier]?.service_type)); } else { setServiceOptions([]); } }; const onSubmit = (data) => { console.log(data); }; const handleSelect = (service) => { setSelectedService(service); setIsOpen(false); }; return (
); }