From 9eeb4d3286b08d9f1008a49f3f6622e17f3b794d Mon Sep 17 00:00:00 2001 From: allgandaf Date: Sat, 5 Sep 2026 19:56:15 +0530 Subject: [PATCH 1/6] require reasonTargetEmail for the add_delegate reason --- src/libs/API/parameters/ResendValidateCodeParams.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libs/API/parameters/ResendValidateCodeParams.ts b/src/libs/API/parameters/ResendValidateCodeParams.ts index 2d7b692d763a..e84ab3198e35 100644 --- a/src/libs/API/parameters/ResendValidateCodeParams.ts +++ b/src/libs/API/parameters/ResendValidateCodeParams.ts @@ -5,7 +5,10 @@ type ResendValidateCodeBaseParams = { // Exclude reasons that require parameters - redefine them as separate types below to enforce their parameters are always passed reasonCode: Exclude< ValueOf, - typeof CONST.VALIDATE_CODE_REASONS.REVEAL_CARD_DETAILS | typeof CONST.VALIDATE_CODE_REASONS.REPLACE_CARD | typeof CONST.VALIDATE_CODE_REASONS.REPORT_CARD_FRAUD + | typeof CONST.VALIDATE_CODE_REASONS.REVEAL_CARD_DETAILS + | typeof CONST.VALIDATE_CODE_REASONS.REPLACE_CARD + | typeof CONST.VALIDATE_CODE_REASONS.REPORT_CARD_FRAUD + | typeof CONST.VALIDATE_CODE_REASONS.ADD_DELEGATE >; }; @@ -24,6 +27,11 @@ type ResendValidateCodeForReportCardFraudParams = { reasonCardID: number; }; +type ResendValidateCodeForAddDelegateParams = { + reasonCode: typeof CONST.VALIDATE_CODE_REASONS.ADD_DELEGATE; + reasonTargetEmail: string; +}; + // Will be removed eventually type ResendValidateCodeNotYetImplementedParams = { reasonCode: null; @@ -34,6 +42,7 @@ type ResendValidateCodeParams = | ResendValidateCodeNotYetImplementedParams | ResendValidateCodeForRevealCardDetailsParams | ResendValidateCodeForReplaceCardParams - | ResendValidateCodeForReportCardFraudParams; + | ResendValidateCodeForReportCardFraudParams + | ResendValidateCodeForAddDelegateParams; export default ResendValidateCodeParams; From 2e806004552fa0dbbf86811a7ba14346d52f25e0 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Sat, 5 Sep 2026 19:56:15 +0530 Subject: [PATCH 2/6] send the add_delegate reason when inviting a copilot --- .../Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx b/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx index 38feb76a114c..5ebd1d8ba071 100644 --- a/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx +++ b/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx @@ -17,6 +17,7 @@ import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import {CONST as COMMON_CONST} from 'expensify-common'; import type {ValueOf} from 'type-fest'; import React, {useEffect} from 'react'; @@ -57,7 +58,7 @@ function ConfirmDelegateValidateCodePage({route}: ConfirmDelegateValidateCodePag onClose={() => Navigation.goBack(ROUTES.SETTINGS_DELEGATE_CONFIRM.getRoute(login, role))} validateError={validateLoginError} title={translate('delegate.makeSureItIsYou')} - sendValidateCode={() => requestValidateCodeAction()} + sendValidateCode={() => requestValidateCodeAction({reasonCode: COMMON_CONST.VALIDATE_CODE_REASONS.ADD_DELEGATE, reasonTargetEmail: login})} handleSubmitForm={(validateCode) => addDelegate({email: login, role, validateCode, delegatedAccess: account?.delegatedAccess})} descriptionPrimary={translate('delegate.enterSecurityCode', account?.primaryLogin ?? session?.email ?? '')} /> From 3904efc1d6593429bb3b7b7df294cc9345f47462 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Sat, 5 Sep 2026 20:11:08 +0530 Subject: [PATCH 3/6] scope the resend dedup to the add_delegate reason --- .../Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx b/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx index 5ebd1d8ba071..6d2220a908d9 100644 --- a/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx +++ b/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx @@ -59,6 +59,7 @@ function ConfirmDelegateValidateCodePage({route}: ConfirmDelegateValidateCodePag validateError={validateLoginError} title={translate('delegate.makeSureItIsYou')} sendValidateCode={() => requestValidateCodeAction({reasonCode: COMMON_CONST.VALIDATE_CODE_REASONS.ADD_DELEGATE, reasonTargetEmail: login})} + validateCodeReasonCode={COMMON_CONST.VALIDATE_CODE_REASONS.ADD_DELEGATE} handleSubmitForm={(validateCode) => addDelegate({email: login, role, validateCode, delegatedAccess: account?.delegatedAccess})} descriptionPrimary={translate('delegate.enterSecurityCode', account?.primaryLogin ?? session?.email ?? '')} /> From 8d940d084848c6966c4a11f4b82f1de5540b0761 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Sun, 6 Sep 2026 18:50:33 +0530 Subject: [PATCH 4/6] run oxfmt on the delegate validate code page --- .../Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx b/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx index 6d2220a908d9..af4bab643d47 100644 --- a/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx +++ b/src/pages/settings/Security/AddDelegate/ConfirmDelegateValidateCodePage.tsx @@ -17,9 +17,9 @@ import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import {CONST as COMMON_CONST} from 'expensify-common'; import type {ValueOf} from 'type-fest'; +import {CONST as COMMON_CONST} from 'expensify-common'; import React, {useEffect} from 'react'; type ConfirmDelegateValidateCodePageProps = PlatformStackScreenProps; From fa294cb1779ebbc169bf38db9d3f9e12a27e0814 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Sun, 6 Sep 2026 18:55:57 +0530 Subject: [PATCH 5/6] require reasonTargetEmail for the update_delegate reason --- src/libs/API/parameters/ResendValidateCodeParams.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libs/API/parameters/ResendValidateCodeParams.ts b/src/libs/API/parameters/ResendValidateCodeParams.ts index e84ab3198e35..ac80be668546 100644 --- a/src/libs/API/parameters/ResendValidateCodeParams.ts +++ b/src/libs/API/parameters/ResendValidateCodeParams.ts @@ -9,6 +9,7 @@ type ResendValidateCodeBaseParams = { | typeof CONST.VALIDATE_CODE_REASONS.REPLACE_CARD | typeof CONST.VALIDATE_CODE_REASONS.REPORT_CARD_FRAUD | typeof CONST.VALIDATE_CODE_REASONS.ADD_DELEGATE + | typeof CONST.VALIDATE_CODE_REASONS.UPDATE_DELEGATE >; }; @@ -32,6 +33,11 @@ type ResendValidateCodeForAddDelegateParams = { reasonTargetEmail: string; }; +type ResendValidateCodeForUpdateDelegateParams = { + reasonCode: typeof CONST.VALIDATE_CODE_REASONS.UPDATE_DELEGATE; + reasonTargetEmail: string; +}; + // Will be removed eventually type ResendValidateCodeNotYetImplementedParams = { reasonCode: null; @@ -43,6 +49,7 @@ type ResendValidateCodeParams = | ResendValidateCodeForRevealCardDetailsParams | ResendValidateCodeForReplaceCardParams | ResendValidateCodeForReportCardFraudParams - | ResendValidateCodeForAddDelegateParams; + | ResendValidateCodeForAddDelegateParams + | ResendValidateCodeForUpdateDelegateParams; export default ResendValidateCodeParams; From 0c467ec9f083cad4a51c0831afa2b7b997379f8b Mon Sep 17 00:00:00 2001 From: allgandaf Date: Sun, 6 Sep 2026 18:55:57 +0530 Subject: [PATCH 6/6] send the update_delegate reason when changing a copilot role --- .../UpdateDelegateRole/UpdateDelegateValidateCodePage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateValidateCodePage.tsx b/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateValidateCodePage.tsx index d023234bdc06..72f3085eba71 100644 --- a/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateValidateCodePage.tsx +++ b/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateValidateCodePage.tsx @@ -18,6 +18,7 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject'; import type {ValueOf} from 'type-fest'; +import {CONST as COMMON_CONST} from 'expensify-common'; import React, {useEffect} from 'react'; type UpdateDelegateValidateCodePageProps = PlatformStackScreenProps; @@ -54,7 +55,8 @@ function UpdateDelegateValidateCodePage({route}: UpdateDelegateValidateCodePageP onClose={() => Navigation.goBack(ROUTES.SETTINGS_UPDATE_DELEGATE_ROLE.getRoute(login, currentDelegate?.role ?? ''))} validateError={updateDelegateErrors} title={translate('delegate.makeSureItIsYou')} - sendValidateCode={() => requestValidateCodeAction()} + sendValidateCode={() => requestValidateCodeAction({reasonCode: COMMON_CONST.VALIDATE_CODE_REASONS.UPDATE_DELEGATE, reasonTargetEmail: login})} + validateCodeReasonCode={COMMON_CONST.VALIDATE_CODE_REASONS.UPDATE_DELEGATE} handleSubmitForm={(validateCode) => updateDelegateRole({email: login, role: newRole, validateCode, delegatedAccess: account?.delegatedAccess})} descriptionPrimary={translate('delegate.enterSecurityCode', account?.primaryLogin ?? session?.email ?? '')} />