/** * External Dependencies */ import { useState } from 'react'; /** * WordPress Dependencies */ import { __ } from '@wordpress/i18n'; import { Spinner } from '@wordpress/components'; /** * Internal Dependencies */ import ModalDialog from '@givewp/components/AdminUI/ModalDialog'; import styles from './styles.module.scss'; import { CurrencyControl } from '@givewp/form-builder-library'; import { useFormContext } from 'react-hook-form'; import { CurrencyCode } from '@givewp/form-builder-library/build/CurrencyControl/CurrencyCode'; import { formatToDateLocalInput } from '@givewp/admin/common'; import { InfoIcon } from '@givewp/components/AdminDetailsPage/Icons'; /** * @since 4.8.0 */ interface AddRenewalDialogProps { isOpen: boolean; handleClose: () => void; handleConfirm: (data: any) => void; } interface RenewalData { amount: number | string; date: string; updateRenewalDate: boolean; transactionId?: string; } /** * @since 4.8.0 */ export default function AddRenewalDialog({ isOpen, handleClose, handleConfirm, }: AddRenewalDialogProps) { const { getValues } = useFormContext(); const { amount } = getValues(); const [data, setData] = useState({ amount: amount.value, date: formatToDateLocalInput(new Date().toISOString()), updateRenewalDate: false, transactionId: '', }); const [errors, setErrors] = useState>({}); const [isLoading, setIsLoading] = useState(false); const handleFieldChange = (field: keyof RenewalData, value: typeof data[keyof RenewalData]) => { setData(prev => ({ ...prev, [field]: value })); // Clear error for this field if it exists if (errors[field]) { setErrors(prev => ({ ...prev, [field]: '' })); } }; const validateForm = (): boolean => { const newErrors: Partial = {}; if (!data.amount) { newErrors.amount = __('Amount is required', 'give'); } if (!data.date) { newErrors.date = __('Date is required', 'give'); } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const resetData = () => { setData({ amount: amount.value, date: formatToDateLocalInput(new Date().toISOString()), updateRenewalDate: false, transactionId: '', }); }; const handleFormSubmit = async (e: React.FormEvent) => { e.stopPropagation(); e.preventDefault(); if (!validateForm() || isLoading) { return; } setIsLoading(true); try { await handleConfirm({ ...data, amount: { value: data.amount, currency: amount.currency, }, }); resetData(); setErrors({}); setIsLoading(false); handleClose(); } catch (error) { console.error('Error adding renewal:', error); setIsLoading(false); } }; const handleCancel = () => { resetData(); setErrors({}); handleClose(); }; const isFormValid = data.amount && data.date; const isSubmitDisabled = !isFormValid || isLoading; return (
{ handleFieldChange('amount', Number(value ?? 0)); }} /> {errors.amount && ( )}
{ handleFieldChange('date', e.target.value); }} /> {errors.date && ( )}
handleFieldChange('transactionId', e.target.value)} /> {errors.transactionId && ( )}
{!isFormValid && (
{__('Please fill in all required fields to continue', 'give')}
)}
{__('Please note that this will not charge the donor nor create the renewal at the gateway.', 'give')}
); }