"use client"; import {useState, useRef, useEffect, useCallback} from "react"; import clsx from "clsx"; import {CartDetail} from "@/types/cart/type"; import {clientFetch} from "@/lib/restApiClient"; import { useCustomToast } from "@/utils/hooks/useToast"; import {useSaveCheckoutCart} from "@/utils/hooks/useSaveCheckoutCart"; import { formatCartDetail } from "@/utils/cartDetailTools"; import { overlayLoading } from "@/components/theme/ui/kernel/loading/api"; import {GiftCardItem, GiftCardRespBody} from "@/types/api/gift/my-gift-cards"; import CommonModal from "@/components/theme/ui/CommonModal"; import { LoadingSpinner } from "@components/common/LoadingSpinner"; export default function CheckoutGiftCardGate({ giftcardNumber, formattedGiftcardAmount, onChangeGiftcard }: { giftcardNumber: string; formattedGiftcardAmount: string; onChangeGiftcard: (payload:CartDetail) => void; }) { const [isShow, setIsShow] = useState(false); const [giftCardsList, setGiftCardsList] = useState([]); const [hasMore, setHasMore] = useState(true); const [loadingList, setLoadingList] = useState(false); const currentPageRef = useRef(1); const scrollerFooterRef = useRef(null); const { showToast } = useCustomToast(); const {saveCheckoutCart} = useSaveCheckoutCart(); const amount = Number(formattedGiftcardAmount.replace(/^\D+/ig,'')); const getMyGiftCard = useCallback(async (page: number) => { // overlayLoading.start(); setLoadingList(true); const params = new URLSearchParams({ page: String(page), per_page: '20' }); const res = await clientFetch(`/api/gift/my-gift-cards?${params.toString()}`,{ method: 'GET', }); console.log(res); // overlayLoading.stop(); setLoadingList(false); if(res.success) { setGiftCardsList((preList) => { return preList.concat(res.data); }); setHasMore(res.pagination.has_more); currentPageRef.current = res.pagination.current_page; } else { showToast(res.message,"danger"); } },[showToast]); useEffect(()=>{ const element = scrollerFooterRef.current; if(!element) return; const observer = new IntersectionObserver(entries=>{ // console.log('IntersectionObserver --- ', entries); // if (entries[0].intersectionRatio <= 0) return; if(entries[0].intersectionRatio > 0 && !loadingList && hasMore){ getMyGiftCard(currentPageRef.current + 1); } }); observer.observe(element); return ()=>observer.disconnect(); },[loadingList,hasMore, getMyGiftCard]); const toggleModal = (bool: boolean) => { setIsShow(bool); if(bool && giftCardsList.length === 0) { getMyGiftCard(1); } }; const applyGiftCard = async (code: string) => { const paramCode = code === giftcardNumber ? '' : code; // '' 表示取消应用 overlayLoading.start(); const saveRes = await saveCheckoutCart({ // shippingMethod: '-1', // paymentMethod: '-1', // couponCode: '-1', giftCardNumber: paramCode, // memberDiscount: '-1' }); overlayLoading.stop(); if(!saveRes.error) { if(saveRes.data) { const newCartDetail = formatCartDetail(saveRes.data); onChangeGiftcard(newCartDetail); } } else { showToast(saveRes.msg, 'danger'); } toggleModal(false); }; return ( <>
Gift Card
{amount > 0 && -{formattedGiftcardAmount} }
My Gift Card } body={
{giftCardsList.length > 0 && giftCardsList.map((item) => { const amountArr = item.formatted_remaining_giftcard_amount.split('.'); return (
{applyGiftCard(item.giftcard_number)}} className={clsx("relative w-full box-border mt-3 p-3 rounded-sm overflow-hidden first:mt-0", [ item.giftcard_number === giftcardNumber ? "border-2 border-ly-green" : "border-1", ] )}>
CODE: {item.giftcard_number}
Expire Date: {item.expirationdate}
{Number(amountArr[1]) === 0 ? amountArr[0] : item.formatted_remaining_giftcard_amount }
); }) }
{!hasMore &&

No More Data

} {(hasMore && loadingList) && }
} /> ); }