"use client"; import Image from "next/image"; import { Ref, useImperativeHandle } from "react"; import { useForm, get } from "react-hook-form"; import { CheckoutPaymentMethod } from "@/types/checkout/type"; import { AirwallexCardElements } from "@/lib/Airwallex/airwallexInit"; import { useCustomToast } from "@/utils/hooks/useToast"; import AirwallexCardInput from "./PaymentMethodAdditional/AirwallexCardInput"; import {useAirwallexCard} from "@/lib/Airwallex/useAirwallexCard"; /** * 关于如何确定默认选中哪个支付方式: * 从购物车详情中获取支付方式 A,支付方式列表中有A,那么把A标记为默认选中;如果支付方式列表中没有A,把paypal标记为默认选中; */ export interface RefPaymentMethodsHandle { getSelectPaymentMethod: () => string; getSelectPaymentTitle: () => string; validatePaymentMethod: () => Promise; getAirwallexCardElements: () => AirwallexCardElements; validateAirwallexCard: () => boolean; } export function PaymentMethodCheckout({ ref, paymentMethods, selectedPaymentMethod, onPaymentMethodChange, }: { ref: Ref; paymentMethods: CheckoutPaymentMethod[]; selectedPaymentMethod: string; onPaymentMethodChange: (value: string) => Promise; }) { const { showToast } = useCustomToast(); const {airwallexCardState,getCardElements} = useAirwallexCard(true,{ cardNumber: 'airwallex_cardNumber', cvc: 'airwallex_cvc', expiry: 'airwallex_expiry' }); let defaultValue = ''; const findItem = paymentMethods.find((item) => item.method === selectedPaymentMethod); if(findItem !== undefined) { defaultValue = selectedPaymentMethod; } else { paymentMethods.forEach((item) => { if(item.method === 'paypal_smart_button') { defaultValue = item.method; } }); } const { register, getValues, trigger, formState: { errors } } = useForm({ mode: "onChange", reValidateMode: "onChange", defaultValues: { paymentMethod: defaultValue, } }); // 参考 https://github.com/react-hook-form/error-message/blob/master/src/ErrorMessage.tsx const paymentMethodError = get(errors, "paymentMethod"); const paymentMethodOnChange = async (event: React.ChangeEvent) => { onPaymentMethodChange(event.target.value); }; useImperativeHandle(ref, () => { return { // 获取用户选择的支付方式 getSelectPaymentMethod: () => { return getValues('paymentMethod'); }, getSelectPaymentTitle: () => { const nowValue = getValues('paymentMethod'); const findItem = paymentMethods.find((item) => item.method === nowValue); return findItem?.title ?? ''; }, // 触发校验 validatePaymentMethod: () => { return trigger(); }, // 获取airwallex card 支付创建的elements getAirwallexCardElements: () => { return getCardElements(); }, validateAirwallexCard: () => { if(!airwallexCardState.cardNumberReady) { showToast('Card number input has not ready. Please wait a minute.', 'danger'); return false; } if(!airwallexCardState.expiryReady) { showToast('Card expiry date input has not ready. Please wait a minute.', 'danger'); return false; } if(!airwallexCardState.cvcReady) { showToast('Card cvc input has not ready. Please wait a minute.', 'danger'); return false; } if(!airwallexCardState.cardNumberValid) { showToast('Please input your card number.', 'danger'); return false; } if(!airwallexCardState.cvcValid) { showToast('Please input cvc.', 'danger'); return false; } if(!airwallexCardState.expiryValid) { showToast('Please input expiry date.', 'danger'); return false; } return true; } } },[getCardElements,paymentMethods,airwallexCardState]); const airwallexOtherInfoShow = selectedPaymentMethod === 'airwallex' && airwallexCardState.cardNumberReady && airwallexCardState.expiryReady && airwallexCardState.cvcReady; return (
    { paymentMethods.map((item) => { return (
  • { item.method === "airwallex" &&
    }
  • ) }) }
{paymentMethodError &&

{paymentMethodError.message}

}
); }