From c51c36a99a8acacfc2c99cff0376997292d2dfbf Mon Sep 17 00:00:00 2001 From: AjayGol Date: Fri, 17 Jul 2026 18:09:32 +0530 Subject: [PATCH] fix: update total donation amount live when fee coverage option is selected --- .../src/donations/components/FundDonation.tsx | 14 +++++++++++--- .../src/donations/components/FundDonations.tsx | 9 ++++++++- .../components/MultiGatewayDonationForm.tsx | 12 ++++++++++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/apphelper/src/donations/components/FundDonation.tsx b/apphelper/src/donations/components/FundDonation.tsx index a15295a..1eafbf8 100644 --- a/apphelper/src/donations/components/FundDonation.tsx +++ b/apphelper/src/donations/components/FundDonation.tsx @@ -2,7 +2,7 @@ import React from "react"; import { FundDonationInterface, FundInterface, CurrencyHelper } from "@churchapps/helpers"; -import { FormControl, Grid, Icon, InputLabel, MenuItem, Select, TextField, Typography } from "@mui/material"; +import { FormControl, Grid, Icon, InputLabel, MenuItem, Select, TextField, Typography, IconButton } from "@mui/material"; import type { SelectChangeEvent } from "@mui/material"; import { Locale } from "../helpers"; @@ -11,6 +11,7 @@ interface Props { funds: FundInterface[], index: number, updatedFunction: (fundDonation: FundDonationInterface, index: number) => void, + removeFunction?: (index: number) => void, params?: any, currency?: string, hideFundSelect?: boolean, @@ -42,8 +43,8 @@ export const FundDonation: React.FC = (props) => { return ( <> - - + + {props.currency ? CurrencyHelper.getCurrencySymbol(props.currency) : "$"} }} /> {!props.hideFundSelect && ( @@ -56,6 +57,13 @@ export const FundDonation: React.FC = (props) => { )} + {props.removeFunction && ( + + props.removeFunction?.(props.index)} color="error" aria-label="remove"> + delete + + + )} ); diff --git a/apphelper/src/donations/components/FundDonations.tsx b/apphelper/src/donations/components/FundDonations.tsx index 8cbdb44..e8ee47b 100644 --- a/apphelper/src/donations/components/FundDonations.tsx +++ b/apphelper/src/donations/components/FundDonations.tsx @@ -23,11 +23,18 @@ export const FundDonations: React.FC = (props) => { props.updatedFunction(fundDonations); }; + const removeRow = (index: number) => { + const fundDonations = [...props.fundDonations]; + fundDonations.splice(index, 1); + props.updatedFunction(fundDonations); + }; + const getRows = () => { const result = []; for (let i = 0; i < props.fundDonations.length; i++) { const fd = props.fundDonations[i]; - result.push(); + const canRemove = props.fundDonations.length > 1; + result.push(); } return result; diff --git a/apphelper/src/donations/components/MultiGatewayDonationForm.tsx b/apphelper/src/donations/components/MultiGatewayDonationForm.tsx index 515620f..ca2833e 100644 --- a/apphelper/src/donations/components/MultiGatewayDonationForm.tsx +++ b/apphelper/src/donations/components/MultiGatewayDonationForm.tsx @@ -63,6 +63,7 @@ const MultiGatewayDonationInner: React.FC = (props) => { const [transactionFee, setTransactionFee] = useState(0); const [payFee, setPayFee] = useState(0); const [total, setTotal] = useState(0); + const [coverFee, setCoverFee] = useState(false); const [paymentMethodName, setPaymentMethodName] = useState( props?.paymentMethods?.length > 0 ? `${props.paymentMethods[0].name} ${props.paymentMethods[0].last4 ? `****${props.paymentMethods[0].last4}` : props.paymentMethods[0].email || ""}` : "" ); @@ -146,6 +147,7 @@ const MultiGatewayDonationInner: React.FC = (props) => { const d = { ...donation } as MultiGatewayDonationInterface; d.amount = checked ? fundsTotal + transactionFee : fundsTotal; const showFee = checked ? transactionFee : 0; + setCoverFee(checked); setTotal(d.amount); setPayFee(showFee); setDonation(d); @@ -352,9 +354,15 @@ const MultiGatewayDonationInner: React.FC = (props) => { setTotal(updatedAmount); setPayFee(fee); setDonation(prev => ({ ...prev, amount: updatedAmount })); + } else if (coverFee) { + // User has opted in to cover fees — recalculate total with the updated fee + const updatedAmount = totalAmount + fee; + setTotal(updatedAmount); + setPayFee(fee); + setDonation(prev => ({ ...prev, amount: updatedAmount })); } }, 500); - }, [donation, funds, gateway, selectedGatewayObj?.id, selectedGateway, getTransactionFee]); + }, [donation, funds, gateway, selectedGatewayObj?.id, selectedGateway, getTransactionFee, coverFee]); useEffect(() => { loadFunds(); @@ -593,7 +601,7 @@ const MultiGatewayDonationInner: React.FC = (props) => { ) : ( } + control={} name="transaction-fee" label={Locale.label("donation.donationForm.cover").replace("{}", CurrencyHelper.formatCurrencyWithLocale(transactionFee, gateway?.currency || "USD"))} onChange={handleCheckChange}