import React, { useState, useMemo, useEffect } from "react"; import { useLocation, useNavigate, Link } from "react-router-dom"; import { SelectedProduct } from "../../services/types"; import { Area, Package } from "../../services/product/type"; import { useMutation, useQuery } from "@tanstack/react-query"; import { DataCacheKey, staleTime } from "../../global/constants"; import { useAppDispatch, useAppSelector } from "../../hooks/useRedux"; import { startLoading, stopLoading } from "../../features/loading/loadingSlice"; import { productApi } from "../../apis/productApi"; import { openPopup } from "../../features/popup/popupSlice"; import { get } from "http"; const ProductDetailView: React.FC = () => { const location = useLocation(); const navigate = useNavigate(); const dispatch = useAppDispatch(); const area = location.state as Area; const loading = useAppSelector((state) => state.loading); const [selectedDays, setSelectedDays] = useState(null); const [selectedData, setSelectedData] = useState("Unlimited"); const [daysOptions, setDaysOptions] = useState([]); const [dataOptions, setDataOptions] = useState([]); const [daysActiveOptions, setDaysActiveOptions] = useState([]); const [dataActiveOptions, setDataActiveOptions] = useState([]); const [prices, setPrices] = useState<{ original: string; final: string; discountPercent: string; }>({ original: "0.00", final: "0.00", discountPercent: "0", }); const [simType, setSimType] = useState<"eSIM" | "Physical">("eSIM"); const [quantity, setQuantity] = useState(1); const [packages, setPackages] = useState(null); if (!area) { return (

Product details missing

Go to Shop
); } // const { data: loadPackage = [] } = useQuery({ // queryKey: [DataCacheKey.PACKAGES], // queryFn: async (): Promise => { // try { // dispatch(startLoading({})); // const res = await productApi.loadPackage({ // areaId: area.id, // isUnlimited: "-1", // isDaily: "-1", // }); // return res.data as Package[]; // } catch (error) { // console.error(error); // return []; // 🔴 bắt buộc // } finally { // dispatch(stopLoading()); // } // }, // staleTime: staleTime, // }); useEffect(() => { getProductMutation.mutate(); }, []); const getProductMutation = useMutation({ mutationFn: async () => { dispatch(startLoading({})); const res = await productApi.loadPackage({ areaId: area.id, isUnlimited: "-1", isDaily: "-1", }); return res; }, onSuccess: (data) => { dispatch(stopLoading()); console.log("Get package response data:", data); if (data && data.errorCode === "0") { console.log("Get package successful"); setPackages(data.data as Package[]); } else { console.error("Get package failed, no token received"); } }, onError: (error: any) => { dispatch(stopLoading()); console.error("Get package error:", error.response.data); }, }); const options = useMemo(() => { console.log("Calculating options from loadPackage"); const daysSet = new Set(); const dataSet = new Set(); packages.forEach((p) => { daysSet.add(p.dayDuration); dataSet.add(p.amountData.toString()); }); const daysArray = Array.from(daysSet).sort((a, b) => a - b); const dataArray = Array.from(dataSet).sort((a, b) => { if (a === "Unlimited") return 1; if (b === "Unlimited") return -1; return parseInt(a) - parseInt(b); }); return { daysArray, dataArray, }; }, [packages]); useEffect(() => { setDaysOptions(options.daysArray); setDataOptions(options.dataArray); handleSelectDay(options.daysArray[0]); handleSelectData(options.dataArray[0]); }, [options]); useEffect(() => { getPrices(); }, [selectedDays, selectedData]); const handleSelectDay = (day: number) => { // filter data options based on selected day if needed const dataSet = new Set(); packages.forEach((p) => { if (p.dayDuration === day) { dataSet.add(p.amountData.toString()); } }); setSelectedDays(day); setDataActiveOptions(Array.from(dataSet)); }; const handleSelectData = (data: string) => { // filter day options based on selected data if needed const daysSet = new Set(); packages.forEach((p) => { if (p.amountData.toString() === data) { daysSet.add(p.dayDuration); } }); setSelectedData(data); setDaysActiveOptions(Array.from(daysSet)); }; const getPrices = (quantityParam?: number) => { const quantityToUse = quantityParam !== undefined ? quantityParam : quantity; // find package based on selectedDays and selectedData const selectedPackage = packages.find( (p) => p.dayDuration === selectedDays && p.amountData.toString() === selectedData ); if (!selectedPackage) { console.log( "No package found for the selected options " + selectedDays + " days and " + selectedData + " data" ); return { original: "0.00", final: "0.00", discountPercent: "0", }; } console.log( "Selected package: ", selectedPackage + " for prices calculation " + selectedPackage.sellPrice + " quantity " + quantityToUse ); setPrices({ original: quantityToUse * selectedPackage.displayPrice, final: quantityToUse * selectedPackage.sellPrice, discountPercent: "0", }); }; const handleQuantityChange = (change: number) => { const newQuantity = Math.max(1, quantity + change); setQuantity(newQuantity); console.log("Selected quantity: ", newQuantity); getPrices(newQuantity); }; const handleBuyNow = async () => { // Logic for custom order or standard buy console.log("Buy now clicked"); const selectedPackage = packages.find( (p) => p.dayDuration === selectedDays && p.amountData.toString() === selectedData ); if (!selectedPackage) { alert("Please select a valid package"); return; } // call logic to proceed to checkout const res = await productApi.checkout({ packgId: selectedPackage.id, quantity: quantity, }); if (res && res.errorCode === "0") { console.log("Checkout details loaded:", res.data); // navigate to checkout with selected options navigate("/checkout", { state: { area: area, package: selectedPackage, quantity: quantity, simType: simType, checkoutDetails: res.data, }, }); } else { console.error("Failed to load checkout details:", res.message); dispatch( openPopup({ isSuccess: false, title: "Checkout Error", message: res.message || "Failed to proceed to checkout.", buttonText: "Close", }) ); } }; return (
{area.areaName1}
{area.areaName1}

SIM {area.areaName1}

Verified: High Speed

Number of days

{daysOptions.map((day) => ( ))}

Data

{dataOptions.map((data) => ( ))}

SIM Type

Quantity

{quantity}
-{prices.discountPercent}% {prices.original.toLocaleString("vi-VN", { minimumFractionDigits: 2, maximumFractionDigits: 2, })}{" "} {area.curency}
{prices.final.toLocaleString("vi-VN", { minimumFractionDigits: 2, maximumFractionDigits: 2, })}{" "} {area.curency}
); }; export default ProductDetailView;