Skip to content

Commit 3287f30

Browse files
nabi-ebrahimiCopilot
andcommitted
refactor: move received payment action to lifecycle hook and key names in translations
Co-authored-by: Copilot <copilot@github.com>
1 parent 64715ae commit 3287f30

12 files changed

Lines changed: 67 additions & 68 deletions

File tree

src/components/MoneyReportHeaderActions/MoneyReportHeaderSecondaryActions.tsx

Lines changed: 5 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import Button from '@components/Button';
99
import type {ButtonWithDropdownMenuRef} from '@components/ButtonWithDropdownMenu/types';
1010
import {useDelegateNoAccessActions, useDelegateNoAccessState} from '@components/DelegateNoAccessModalProvider';
1111
import {KYCWallContext} from '@components/KYCWall/KYCWallContext';
12-
import {ModalActions} from '@components/Modal/Global/ModalContext';
1312
import MoneyReportHeaderKYCDropdown from '@components/MoneyReportHeaderKYCDropdown';
1413
import {useMoneyReportHeaderModals} from '@components/MoneyReportHeaderModalsContext';
1514
import NavigationDeferredMount from '@components/NavigationDeferredMount';
@@ -18,7 +17,6 @@ import type {PopoverMenuItem} from '@components/PopoverMenu';
1817
import {useSearchStateContext} from '@components/Search/SearchContext';
1918
import type {PaymentActionParams} from '@components/SettlementButton/types';
2019
import useActiveAdminPolicies from '@hooks/useActiveAdminPolicies';
21-
import useConfirmModal from '@hooks/useConfirmModal';
2220
import {useCurrencyListActions} from '@hooks/useCurrencyList';
2321
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
2422
import useExpenseActions from '@hooks/useExpenseActions';
@@ -61,7 +59,7 @@ import {
6159
navigateToDetailsPage,
6260
} from '@libs/ReportUtils';
6361
import {isExpensifyCardTransaction, isPending} from '@libs/TransactionUtils';
64-
import {markReportPaymentReceived, payInvoice, payMoneyRequest} from '@userActions/IOU/PayMoneyRequest';
62+
import {payInvoice, payMoneyRequest} from '@userActions/IOU/PayMoneyRequest';
6563
import {canApproveIOU, canIOUBePaid as canIOUBePaidAction} from '@userActions/IOU/ReportWorkflow';
6664
import CONST from '@src/CONST';
6765
import ONYXKEYS from '@src/ONYXKEYS';
@@ -82,7 +80,6 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo
8280

8381
const {translate, localeCompare} = useLocalize();
8482
const kycWallRef = useContext(KYCWallContext);
85-
const {showConfirmModal} = useConfirmModal();
8683

8784
const [moneyRequestReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`);
8885
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(moneyRequestReport?.policyID)}`);
@@ -248,7 +245,7 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo
248245
? sortPoliciesByName(activeAdminPolicies, localeCompare)
249246
: [];
250247

251-
const expensifyIcons = useMemoizedLazyExpensifyIcons(['Info', 'Cash', 'ArrowRight', 'Building', 'MoneyBag']);
248+
const expensifyIcons = useMemoizedLazyExpensifyIcons(['Info', 'Cash', 'ArrowRight', 'Building']);
252249

253250
// Build PAY action sub-items. Workspace-policy entries carry the policy as data and have no onSelected;
254251
// MoneyReportHeaderKYCDropdown picks them up via onSubItemSelected where triggerKYCFlow is in scope.
@@ -275,9 +272,10 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo
275272
const lifecycleActions = useLifecycleActions({
276273
reportID,
277274
startApprovedAnimation,
275+
startAnimation,
278276
startSubmittingAnimation,
279-
onHoldMenuOpen: (requestType, onConfirm) => {
280-
openHoldMenu({requestType, onConfirm: onConfirm ?? (() => startApprovedAnimation())});
277+
onHoldMenuOpen: (requestType, onConfirm, paymentType) => {
278+
openHoldMenu({requestType, onConfirm: onConfirm ?? (() => startApprovedAnimation()), paymentType});
281279
},
282280
});
283281

@@ -345,44 +343,6 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo
345343
navigateToDetailsPage(moneyRequestReport, Navigation.getReportRHPActiveRoute());
346344
},
347345
},
348-
[CONST.REPORT.SECONDARY_ACTIONS.RECEIVED_PAYMENT]: {
349-
value: CONST.REPORT.SECONDARY_ACTIONS.RECEIVED_PAYMENT,
350-
text: translate('iou.receivedPayment'),
351-
icon: expensifyIcons.MoneyBag,
352-
sentryLabel: CONST.SENTRY_LABEL.MORE_MENU.RECEIVED_PAYMENT,
353-
onSelected: async () => {
354-
if (isDelegateAccessRestricted) {
355-
showDelegateNoAccessModal();
356-
return;
357-
}
358-
359-
const result = await showConfirmModal({
360-
title: translate('iou.confirmPaymentReceived'),
361-
prompt: translate('iou.receivedPaymentConfirmation'),
362-
confirmText: translate('iou.yesIHaveReceivedPayment'),
363-
cancelText: translate('common.cancel'),
364-
});
365-
366-
if (result.action !== ModalActions.CONFIRM) {
367-
return;
368-
}
369-
370-
if (isAnyTransactionOnHold) {
371-
openHoldMenu({
372-
requestType: CONST.IOU.REPORT_ACTION_TYPE.PAY,
373-
paymentType: CONST.IOU.PAYMENT_TYPE.ELSEWHERE,
374-
onConfirm: () => {
375-
startAnimation();
376-
markReportPaymentReceived(chatReport, moneyRequestReport, nextStep);
377-
},
378-
});
379-
return;
380-
}
381-
382-
startAnimation();
383-
markReportPaymentReceived(chatReport, moneyRequestReport, nextStep);
384-
},
385-
},
386346
...exportActionEntries,
387347
...lifecycleActions.actions,
388348
...expenseActions,

src/hooks/useLifecycleActions.tsx

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ import {
2020
shouldBlockSubmitDueToStrictPolicyRules,
2121
} from '@libs/ReportUtils';
2222
import {hasAnyPendingRTERViolation as hasAnyPendingRTERViolationTransactionUtils} from '@libs/TransactionUtils';
23-
import {cancelPayment} from '@userActions/IOU/PayMoneyRequest';
23+
import {cancelPayment, markReportPaymentReceived} from '@userActions/IOU/PayMoneyRequest';
2424
import {approveMoneyRequest, reopenReport, retractReport, submitReport, unapproveExpenseReport} from '@userActions/IOU/ReportWorkflow';
2525
import {markPendingRTERTransactionsAsCash} from '@userActions/Transaction';
2626
import CONST from '@src/CONST';
2727
import ONYXKEYS from '@src/ONYXKEYS';
28+
import type {PaymentMethodType} from '@src/types/onyx/OriginalMessage';
2829
import useConfirmModal from './useConfirmModal';
2930
import useConfirmPendingRTERAndProceed from './useConfirmPendingRTERAndProceed';
3031
import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails';
@@ -42,8 +43,9 @@ import useTransactionsAndViolationsForReport from './useTransactionsAndViolation
4243
type UseLifecycleActionsParams = {
4344
reportID: string | undefined;
4445
startApprovedAnimation: () => void;
46+
startAnimation: () => void;
4547
startSubmittingAnimation: () => void;
46-
onHoldMenuOpen: (requestType: ActionHandledType, onConfirm?: () => void) => void;
48+
onHoldMenuOpen: (requestType: ActionHandledType, onConfirm?: () => void, paymentType?: PaymentMethodType) => void;
4749
};
4850

4951
type UseLifecycleActionsResult = {
@@ -58,7 +60,7 @@ type UseLifecycleActionsResult = {
5860
* Provides report lifecycle transition actions (submit, approve, unapprove, cancel payment, retract, reopen)
5961
* and their associated guards (delegate access, hold, pending RTER, strict policy rules).
6062
*/
61-
function useLifecycleActions({reportID, startApprovedAnimation, startSubmittingAnimation, onHoldMenuOpen}: UseLifecycleActionsParams): UseLifecycleActionsResult {
63+
function useLifecycleActions({reportID, startApprovedAnimation, startAnimation, startSubmittingAnimation, onHoldMenuOpen}: UseLifecycleActionsParams): UseLifecycleActionsResult {
6264
const [moneyRequestReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`);
6365
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(moneyRequestReport?.policyID)}`);
6466
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(moneyRequestReport?.chatReportID)}`);
@@ -95,7 +97,7 @@ function useLifecycleActions({reportID, startApprovedAnimation, startSubmittingA
9597
const {clearSelectedTransactions} = useSearchActionsContext();
9698
const shouldCalculateTotals = useSearchShouldCalculateTotals(currentSearchKey, currentSearchQueryJSON?.hash, true);
9799

98-
const expensifyIcons = useMemoizedLazyExpensifyIcons(['Send', 'ThumbsUp', 'CircularArrowBackwards', 'Clear']);
100+
const expensifyIcons = useMemoizedLazyExpensifyIcons(['Send', 'ThumbsUp', 'CircularArrowBackwards', 'Clear', 'MoneyBag']);
99101

100102
const nextApproverAccountID = getNextApproverAccountID(moneyRequestReport);
101103
const isSubmitterSameAsNextApprover =
@@ -251,6 +253,44 @@ function useLifecycleActions({reportID, startApprovedAnimation, startSubmittingA
251253
sentryLabel: CONST.SENTRY_LABEL.MORE_MENU.APPROVE,
252254
onSelected: confirmApproval,
253255
},
256+
[CONST.REPORT.SECONDARY_ACTIONS.RECEIVED_PAYMENT]: {
257+
value: CONST.REPORT.SECONDARY_ACTIONS.RECEIVED_PAYMENT,
258+
text: translate('iou.receivedPayment'),
259+
icon: expensifyIcons.MoneyBag,
260+
sentryLabel: CONST.SENTRY_LABEL.MORE_MENU.RECEIVED_PAYMENT,
261+
onSelected: async () => {
262+
if (isDelegateAccessRestricted) {
263+
showDelegateNoAccessModal();
264+
return;
265+
}
266+
267+
const result = await showConfirmModal({
268+
title: translate('iou.confirmPaymentReceivedModalTitle'),
269+
prompt: translate('iou.receivedPaymentConfirmation'),
270+
confirmText: translate('iou.confirmReceivedPayment'),
271+
cancelText: translate('common.cancel'),
272+
});
273+
274+
if (result.action !== ModalActions.CONFIRM) {
275+
return;
276+
}
277+
278+
if (isAnyTransactionOnHold) {
279+
onHoldMenuOpen(
280+
CONST.IOU.REPORT_ACTION_TYPE.PAY,
281+
() => {
282+
startAnimation();
283+
markReportPaymentReceived(chatReport, moneyRequestReport, nextStep);
284+
},
285+
CONST.IOU.PAYMENT_TYPE.ELSEWHERE,
286+
);
287+
return;
288+
}
289+
290+
startAnimation();
291+
markReportPaymentReceived(chatReport, moneyRequestReport, nextStep);
292+
},
293+
},
254294
[CONST.REPORT.SECONDARY_ACTIONS.UNAPPROVE]: {
255295
value: CONST.REPORT.SECONDARY_ACTIONS.UNAPPROVE,
256296
text: translate('iou.unapprove'),

src/languages/de.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,10 +1319,10 @@ const translations: TranslationDeepObject<typeof en> = {
13191319
settlePayment: (formattedAmount: string) => `${formattedAmount} bezahlen`,
13201320
settleBusiness: (formattedAmount?: string) => (formattedAmount ? `${formattedAmount} als Unternehmen bezahlen` : `Mit Geschäftskonto bezahlen`),
13211321
payElsewhere: (formattedAmount?: string) => (formattedAmount ? `${formattedAmount} als bezahlt markieren` : `Als bezahlt markieren`),
1322-
confirmPaymentReceived: 'Zahlungseingang bestätigen',
1322+
confirmPaymentReceivedModalTitle: 'Zahlungseingang bestätigen',
13231323
receivedPayment: 'Zahlung erhalten',
13241324
receivedPaymentConfirmation: 'Bitte fahren Sie nur fort, wenn Sie die Zahlung bereits außerhalb von Expensify erhalten haben.',
1325-
yesIHaveReceivedPayment: 'Ja, ich habe die Zahlung erhalten.',
1325+
confirmReceivedPayment: 'Ja, ich habe die Zahlung erhalten.',
13261326
settleInvoicePersonal: (amount?: string, last4Digits?: string) => (amount ? `${amount} mit persönlichem Konto ${last4Digits} bezahlt` : `Mit Privatkonto bezahlt`),
13271327
settleInvoiceBusiness: (amount?: string, last4Digits?: string) => (amount ? `${amount} mit Geschäftskonto ${last4Digits} bezahlt` : `Mit Geschäftskonto bezahlt`),
13281328
payWithPolicy: (policyName: string, formattedAmount?: string) => (formattedAmount ? `Bezahle ${formattedAmount} über ${policyName}` : `Bezahlen über ${policyName}`),

src/languages/es.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,10 +1265,10 @@ const translations: TranslationDeepObject<typeof en> = {
12651265
settlePayment: (formattedAmount) => `Pagar ${formattedAmount}`,
12661266
settleBusiness: (formattedAmount) => (formattedAmount ? `Pagar ${formattedAmount} como negocio` : `Pago con cuenta empresarial`),
12671267
payElsewhere: (formattedAmount) => (formattedAmount ? `Marcar ${formattedAmount} como pagado` : `Marcar como pagado`),
1268-
confirmPaymentReceived: 'Confirmar el pago recibido',
1268+
confirmPaymentReceivedModalTitle: 'Confirmar el pago recibido',
12691269
receivedPayment: 'Pago recibido',
12701270
receivedPaymentConfirmation: 'Por favor, continúa solo si ya has recibido el pago fuera de Expensify.',
1271-
yesIHaveReceivedPayment: 'Sí, he recibido el pago.',
1271+
confirmReceivedPayment: 'Sí, he recibido el pago.',
12721272
settleInvoicePersonal: (amount, last4Digits) => (amount ? `pagado ${amount} con cuenta personal ${last4Digits}` : `Pagado con cuenta personal`),
12731273
settleInvoiceBusiness: (amount, last4Digits) => (amount ? `pagado ${amount} con cuenta de empresa ${last4Digits}` : `Pagado con cuenta de empresa`),
12741274
payWithPolicy: (policyName, formattedAmount) => (formattedAmount ? `Pay ${formattedAmount} via ${policyName}` : `Pay via ${policyName}`),

src/languages/fr.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,10 +1323,10 @@ const translations: TranslationDeepObject<typeof en> = {
13231323
settlePayment: (formattedAmount: string) => `Payer ${formattedAmount}`,
13241324
settleBusiness: (formattedAmount?: string) => (formattedAmount ? `Payer ${formattedAmount} en tant qu’entreprise` : `Payer avec le compte professionnel`),
13251325
payElsewhere: (formattedAmount?: string) => (formattedAmount ? `Marquer ${formattedAmount} comme payé` : `Marquer comme payé`),
1326-
confirmPaymentReceived: 'Confirmer la réception du paiement',
1326+
confirmPaymentReceivedModalTitle: 'Confirmer la réception du paiement',
13271327
receivedPayment: 'Paiement reçu',
13281328
receivedPaymentConfirmation: 'Veuillez continuer uniquement si vous avez déjà reçu le paiement en dehors d’Expensify.',
1329-
yesIHaveReceivedPayment: 'Oui, j’ai reçu le paiement.',
1329+
confirmReceivedPayment: 'Oui, j’ai reçu le paiement.',
13301330
settleInvoicePersonal: (amount?: string, last4Digits?: string) => (amount ? `a payé ${amount} avec le compte personnel ${last4Digits}` : `Payé avec un compte personnel`),
13311331
settleInvoiceBusiness: (amount?: string, last4Digits?: string) => (amount ? `a payé ${amount} avec le compte professionnel ${last4Digits}` : `Payé avec le compte professionnel`),
13321332
payWithPolicy: (policyName: string, formattedAmount?: string) => (formattedAmount ? `Payer ${formattedAmount} via ${policyName}` : `Payer via ${policyName}`),

src/languages/it.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,10 +1318,10 @@ const translations: TranslationDeepObject<typeof en> = {
13181318
settlePayment: (formattedAmount: string) => `Paga ${formattedAmount}`,
13191319
settleBusiness: (formattedAmount?: string) => (formattedAmount ? `Paga ${formattedAmount} come azienda` : `Paga con conto aziendale`),
13201320
payElsewhere: (formattedAmount?: string) => (formattedAmount ? `Segna ${formattedAmount} come pagato` : `Segna come pagata`),
1321-
confirmPaymentReceived: 'Conferma la ricezione del pagamento',
1321+
confirmPaymentReceivedModalTitle: 'Conferma la ricezione del pagamento',
13221322
receivedPayment: 'Pagamento ricevuto',
13231323
receivedPaymentConfirmation: 'Procedi solo se hai già ricevuto il pagamento al di fuori di Expensify.',
1324-
yesIHaveReceivedPayment: 'Sì, ho ricevuto il pagamento.',
1324+
confirmReceivedPayment: 'Sì, ho ricevuto il pagamento.',
13251325
settleInvoicePersonal: (amount?: string, last4Digits?: string) => (amount ? `pagato ${amount} con conto personale ${last4Digits}` : `Pagato con conto personale`),
13261326
settleInvoiceBusiness: (amount?: string, last4Digits?: string) => (amount ? `ha pagato ${amount} con il conto aziendale ${last4Digits}` : `Pagato con conto aziendale`),
13271327
payWithPolicy: (policyName: string, formattedAmount?: string) => (formattedAmount ? `Paga ${formattedAmount} tramite ${policyName}` : `Paga tramite ${policyName}`),

src/languages/ja.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,10 +1301,10 @@ const translations: TranslationDeepObject<typeof en> = {
13011301
settlePayment: (formattedAmount: string) => `${formattedAmount} を支払う`,
13021302
settleBusiness: (formattedAmount?: string) => (formattedAmount ? `${formattedAmount} をビジネスとして支払う` : `ビジネスアカウントで支払う`),
13031303
payElsewhere: (formattedAmount?: string) => (formattedAmount ? `${formattedAmount} を支払済みにする` : `支払い済みにする`),
1304-
confirmPaymentReceived: '支払いを受領したことを確認',
1304+
confirmPaymentReceivedModalTitle: '支払いを受領したことを確認',
13051305
receivedPayment: '支払い受領済み',
13061306
receivedPaymentConfirmation: 'Expensify以外で支払いを受け取っている場合のみ続行してください。',
1307-
yesIHaveReceivedPayment: 'はい、支払いを受け取りました。',
1307+
confirmReceivedPayment: 'はい、支払いを受け取りました。',
13081308
settleInvoicePersonal: (amount?: string, last4Digits?: string) => (amount ? `個人アカウント(下4桁 ${last4Digits})で ${amount} を支払いました` : `個人アカウントで支払い済み`),
13091309
settleInvoiceBusiness: (amount?: string, last4Digits?: string) => (amount ? `ビジネス口座(末尾${last4Digits})で${amount}を支払いました` : `ビジネスアカウントで支払済み`),
13101310
payWithPolicy: (policyName: string, formattedAmount?: string) => (formattedAmount ? `${policyName}で${formattedAmount}を支払う` : `${policyName}で支払う`),

src/languages/nl.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,10 +1317,10 @@ const translations: TranslationDeepObject<typeof en> = {
13171317
settlePayment: (formattedAmount: string) => `Betaal ${formattedAmount}`,
13181318
settleBusiness: (formattedAmount?: string) => (formattedAmount ? `Betaal ${formattedAmount} als bedrijf` : `Betalen met zakelijke rekening`),
13191319
payElsewhere: (formattedAmount?: string) => (formattedAmount ? `Markeer ${formattedAmount} als betaald` : `Markeren als betaald`),
1320-
confirmPaymentReceived: 'Ontvangst van betaling bevestigen',
1320+
confirmPaymentReceivedModalTitle: 'Ontvangst van betaling bevestigen',
13211321
receivedPayment: 'Betaling ontvangen',
13221322
receivedPaymentConfirmation: 'Ga alleen verder als je de betaling al buiten Expensify hebt ontvangen.',
1323-
yesIHaveReceivedPayment: 'Ja, ik heb de betaling ontvangen.',
1323+
confirmReceivedPayment: 'Ja, ik heb de betaling ontvangen.',
13241324
settleInvoicePersonal: (amount?: string, last4Digits?: string) => (amount ? `heeft ${amount} betaald met persoonlijke rekening ${last4Digits}` : `Betaald met privérekening`),
13251325
settleInvoiceBusiness: (amount?: string, last4Digits?: string) => (amount ? `heeft ${amount} betaald met zakelijke rekening ${last4Digits}` : `Betaald met zakelijke rekening`),
13261326
payWithPolicy: (policyName: string, formattedAmount?: string) => (formattedAmount ? `Betaal ${formattedAmount} via ${policyName}` : `Betaal via ${policyName}`),

0 commit comments

Comments
 (0)