Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add merge account feature to ND #56911

Open
wants to merge 31 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
cda8dad
draft version of merge account
allroundexperts Dec 16, 2024
e4bdee3
account details page draft
allroundexperts Dec 17, 2024
16d5fdc
add translations and forms
allroundexperts Dec 17, 2024
ec445e1
more files
allroundexperts Dec 18, 2024
06c15e5
Merge branch 'main' into feat-47073
allroundexperts Jan 8, 2025
717bc14
WIP: ad6007b6398 onboarding flow without errors
allroundexperts Feb 16, 2025
217ceb4
more finetunings
allroundexperts Feb 16, 2025
353a410
fix a bunch of lint errors
allroundexperts Feb 18, 2025
e79174a
working version
allroundexperts Feb 21, 2025
89ecf4e
remove delegate access wrappers
allroundexperts Feb 21, 2025
61ff190
merge with main
allroundexperts Feb 21, 2025
478de42
add confirmation screen
allroundexperts Feb 23, 2025
20f900e
fix spanish translations
allroundexperts Feb 23, 2025
3281bc5
merge with main
allroundexperts Feb 23, 2025
c2eeb1e
handle lint issues
allroundexperts Feb 23, 2025
305253c
more lint errors
allroundexperts Feb 23, 2025
78a5563
lint fix
allroundexperts Feb 23, 2025
6501b6d
fix: footer styles
allroundexperts Feb 23, 2025
a4800c2
merge with main
allroundexperts Feb 26, 2025
c210eda
Merge branch 'main' into feat-47073
allroundexperts Mar 7, 2025
9368bec
fix all the bugs
allroundexperts Mar 7, 2025
89f3947
fix lint errors
allroundexperts Mar 7, 2025
4474019
prettier
allroundexperts Mar 7, 2025
f4e5d37
fix type checks
allroundexperts Mar 7, 2025
6a8d5b8
revert back to onButton press
allroundexperts Mar 7, 2025
025b2a0
change order of menu
allroundexperts Mar 7, 2025
5b995df
prettier
allroundexperts Mar 7, 2025
54b1340
remove help button
allroundexperts Mar 7, 2025
c8f1ad0
update more designs
allroundexperts Mar 7, 2025
9cd1765
prettier
allroundexperts Mar 7, 2025
907e1eb
more edge cases fix
allroundexperts Mar 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions assets/images/arrow-collapse.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
96 changes: 96 additions & 0 deletions assets/images/running-turtle.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const EMPTY_ARRAY = Object.freeze([]);
const EMPTY_OBJECT = Object.freeze({});

const DEFAULT_NUMBER_ID = 0;
const DEFAULT_STRING_NEGATIVE_ID = '-1';
Copy link
Member

@parasharrajat parasharrajat Feb 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Earlier we are getting away from -1 defaults. So is It a good move? I think we need a discussion for this before adopting this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just used it because linter was throwing an error. I'll try changing this to '0' instead.


const CLOUDFRONT_DOMAIN = 'cloudfront.net';
const CLOUDFRONT_URL = `https://d2k5nsl2zxldvw.${CLOUDFRONT_DOMAIN}`;
Expand Down Expand Up @@ -972,6 +973,7 @@ const CONST = {
EMPTY_ARRAY,
EMPTY_OBJECT,
DEFAULT_NUMBER_ID,
DEFAULT_STRING_NEGATIVE_ID,
USE_EXPENSIFY_URL,
EXPENSIFY_URL,
GOOGLE_MEET_URL_ANDROID: 'https://meet.google.com',
Expand Down Expand Up @@ -1035,6 +1037,7 @@ const CONST = {
DELAYED_SUBMISSION_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/reports/Automatically-submit-employee-reports',
ENCRYPTION_AND_SECURITY_HELP_URL: 'https://help.expensify.com/articles/new-expensify/settings/Encryption-and-Data-Security',
PLAN_TYPES_AND_PRICING_HELP_URL: 'https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Plan-types-and-pricing',
MERGE_ACCOUNT_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/settings/Merge-accounts',
TEST_RECEIPT_URL: `${CLOUDFRONT_URL}/images/fake-receipt__tacotodds.png`,
// Use Environment.getEnvironmentURL to get the complete URL with port number
DEV_NEW_EXPENSIFY_URL: 'https://dev.new.expensify.com:',
Expand Down Expand Up @@ -4836,6 +4839,17 @@ const CONST = {
DISABLED: 'DISABLED',
DISABLE: 'DISABLE',
},
MERGE_ACCOUNT_RESULTS: {
SUCCESS: 'success',
ERR_2FA: 'err_2fa',
ERR_NO_EXIST: 'err_no_exist',
ERR_SMART_SCANNER: 'err_smart_scanner',
ERR_INVOICING: 'err_invoicing',
ERR_SAML_PRIMARY_LOGIN: 'err_saml_primary_login',
ERR_SAML_DOMAIN_CONTROL: 'err_saml_domain_control',
ERR_SAML_NOT_SUPPORTED: 'err_saml_not_supported',
ERR_ACCOUNT_LOCKED: 'err_account_locked',
},
DELEGATE_ROLE: {
ALL: 'all',
SUBMITTER: 'submitter',
Expand Down
3 changes: 3 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,8 @@ const ONYXKEYS = {
RULES_CUSTOM_FORM_DRAFT: 'rulesCustomFormDraft',
DEBUG_DETAILS_FORM: 'debugDetailsForm',
DEBUG_DETAILS_FORM_DRAFT: 'debugDetailsFormDraft',
MERGE_ACCOUNT_DETAILS_FORM: 'mergeAccountDetailsForm',
MERGE_ACCOUNT_DETAILS_FORM_DRAFT: 'mergeAccountDetailsFormDraft',
WORKSPACE_PER_DIEM_FORM: 'workspacePerDiemForm',
WORKSPACE_PER_DIEM_FORM_DRAFT: 'workspacePerDiemFormDraft',
},
Expand Down Expand Up @@ -855,6 +857,7 @@ type OnyxFormValuesMapping = {
[ONYXKEYS.FORMS.RULES_CUSTOM_FORM]: FormTypes.RulesCustomForm;
[ONYXKEYS.FORMS.SEARCH_SAVED_SEARCH_RENAME_FORM]: FormTypes.SearchSavedSearchRenameForm;
[ONYXKEYS.FORMS.DEBUG_DETAILS_FORM]: FormTypes.DebugReportForm | FormTypes.DebugReportActionForm | FormTypes.DebugTransactionForm | FormTypes.DebugTransactionViolationForm;
[ONYXKEYS.FORMS.MERGE_ACCOUNT_DETAILS_FORM]: FormTypes.MergeAccountDetailsForm;
[ONYXKEYS.FORMS.INTERNATIONAL_BANK_ACCOUNT_FORM]: FormTypes.InternationalBankAccountForm;
[ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM]: FormTypes.WorkspacePerDiemForm;
};
Expand Down
9 changes: 9 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,15 @@ const ROUTES = {
SETTINGS_WORKSPACES: 'settings/workspaces',
SETTINGS_SECURITY: 'settings/security',
SETTINGS_CLOSE: 'settings/security/closeAccount',
SETTINGS_MERGE_ACCOUNTS: 'settings/security/merge-accounts',
SETTINGS_MERGE_ACCOUNTS_MAGIC_CODE: {
route: 'settings/security/merge-accounts/:login/magic-code',
getRoute: (login: string) => `settings/security/merge-accounts/${encodeURIComponent(login)}/magic-code` as const,
},
SETTINGS_MERGE_ACCOUNTS_RESULT: {
route: 'settings/security/merge-accounts/:login/result/:result',
getRoute: (login: string, result: string) => `settings/security/merge-accounts/${encodeURIComponent(login)}/result/${result}` as const,
},
SETTINGS_ADD_DELEGATE: 'settings/security/delegate',
SETTINGS_DELEGATE_ROLE: {
route: 'settings/security/delegate/:login/role/:role',
Expand Down
5 changes: 5 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,11 @@ const SCREENS = {
DELEGATE_CONFIRM: 'Settings_Delegate_Confirm',
UPDATE_DELEGATE_ROLE: 'Settings_Delegate_Update_Role',
},
MERGE_ACCOUNTS: {
ACCOUNT_DETAILS: 'Settings_MergeAccounts_AccountDetails',
ACCOUNT_VALIDATE: 'Settings_MergeAccounts_AccountValidate',
MERGE_RESULT: 'Settings_MergeAccounts_MergeResult',
},
},
TWO_FACTOR_AUTH: {
ROOT: 'Settings_TwoFactorAuth_Root',
Expand Down
68 changes: 48 additions & 20 deletions src/components/ConfirmationPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,23 @@ type ConfirmationPageProps = {
/** Description of the confirmation page */
description: React.ReactNode;

/** The text for the button label */
buttonText?: string;
/** The text for the primary button label */
primaryButtonText?: string;

/** A function that is called when the button is clicked on */
onButtonPress?: () => void;
/** A function that is called when the primary button is clicked on */
onPrimaryButtonPress?: () => void;

/** Whether we should show a confirmation button */
shouldShowButton?: boolean;
/** Whether we should show a primary confirmation button */
shouldShowPrimaryButton?: boolean;

/** The text for the secondary button label */
secondaryButtonText?: string;

/** A function that is called when the secondary button is clicked on */
onSecondaryButtonPress?: () => void;

/** Whether we should show a secondary confirmation button */
shouldShowSecondaryButton?: boolean;

/** Additional style for the heading */
headingStyle?: TextStyle;
Expand All @@ -40,6 +49,8 @@ type ConfirmationPageProps = {
/** Additional style for the description */
descriptionStyle?: TextStyle;

/** Additional style for the footer */
footerStyle?: ViewStyle;
/** Additional style for the container */
containerStyle?: ViewStyle;
};
Expand All @@ -48,12 +59,16 @@ function ConfirmationPage({
illustration = LottieAnimations.Fireworks,
heading,
description,
buttonText = '',
onButtonPress = () => {},
shouldShowButton = false,
primaryButtonText = '',
onPrimaryButtonPress = () => {},
shouldShowPrimaryButton = false,
secondaryButtonText = '',
onSecondaryButtonPress = () => {},
shouldShowSecondaryButton = false,
headingStyle,
illustrationStyle,
descriptionStyle,
footerStyle,
containerStyle,
}: ConfirmationPageProps) {
const styles = useThemeStyles();
Expand All @@ -80,17 +95,28 @@ function ConfirmationPage({
<Text style={[styles.textHeadline, styles.textAlignCenter, styles.mv2, headingStyle]}>{heading}</Text>
<Text style={[styles.textAlignCenter, descriptionStyle]}>{description}</Text>
</View>
{shouldShowButton && (
<FixedFooter>
<Button
success
large
text={buttonText}
testID="confirmation-button"
style={styles.mt6}
pressOnEnter
onPress={onButtonPress}
/>
{(shouldShowSecondaryButton || shouldShowPrimaryButton) && (
<FixedFooter style={footerStyle}>
{shouldShowSecondaryButton && (
<Button
large
text={secondaryButtonText}
testID="confirmation-secondary-button"
style={styles.mt3}
onPress={onSecondaryButtonPress}
/>
)}
{shouldShowPrimaryButton && (
<Button
success
large
text={primaryButtonText}
testID="confirmation-primary-button"
style={styles.mt3}
pressOnEnter
onPress={onPrimaryButtonPress}
/>
)}
</FixedFooter>
)}
</View>
Expand All @@ -100,3 +126,5 @@ function ConfirmationPage({
ConfirmationPage.displayName = 'ConfirmationPage';

export default ConfirmationPage;

export type {ConfirmationPageProps};
2 changes: 2 additions & 0 deletions src/components/Icon/Expensicons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import AddReaction from '@assets/images/add-reaction.svg';
import All from '@assets/images/all.svg';
import Android from '@assets/images/android.svg';
import Apple from '@assets/images/apple.svg';
import ArrowCollapse from '@assets/images/arrow-collapse.svg';
import ArrowDownLong from '@assets/images/arrow-down-long.svg';
import ArrowRightLong from '@assets/images/arrow-right-long.svg';
import ArrowRight from '@assets/images/arrow-right.svg';
Expand Down Expand Up @@ -223,6 +224,7 @@ export {
AnnounceRoomAvatar,
Apple,
AppleLogo,
ArrowCollapse,
ArrowRight,
ArrowRightLong,
ArrowsUpDown,
Expand Down
2 changes: 2 additions & 0 deletions src/components/Icon/Illustrations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import TeleScope from '@assets/images/product-illustrations/telescope.svg';
import ThreeLeggedLaptopWoman from '@assets/images/product-illustrations/three_legged_laptop_woman.svg';
import ToddBehindCloud from '@assets/images/product-illustrations/todd-behind-cloud.svg';
import ToddWithPhones from '@assets/images/product-illustrations/todd-with-phones.svg';
import RunningTurtle from '@assets/images/running-turtle.svg';
import ReportReceipt from '@assets/images/simple-illustration__report-receipt.svg';
import BigVault from '@assets/images/simple-illustrations/emptystate__big-vault.svg';
import Puzzle from '@assets/images/simple-illustrations/emptystate__puzzlepieces.svg';
Expand Down Expand Up @@ -274,6 +275,7 @@ export {
Filters,
MagnifyingGlassMoney,
Rules,
RunningTurtle,
CompanyCardsEmptyState,
AmexCompanyCards,
MasterCardCompanyCards,
Expand Down
57 changes: 57 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ import type {
ManagerApprovedParams,
MarkedReimbursedParams,
MarkReimbursedFromIntegrationParams,
MergeAccountGenericParams,
MissingPropertyParams,
MovedFromPersonalSpaceParams,
NeedCategoryForExportToIntegrationParams,
Expand Down Expand Up @@ -1362,6 +1363,62 @@ const translations = {
defaultContact: 'Default contact method:',
enterYourDefaultContactMethod: 'Please enter your default contact method to close your account.',
},
mergeAccountsPage: {
mergeAccount: 'Merge accounts',
accountDetails: {
accountToMergeInto: ({email}: MergeAccountGenericParams) => `Enter the account you want to merge into ${email}`,
notReversibleConsent: 'I understand this is not reversible',
},
accountValidate: {
confirmMerge: 'Are you sure you want to merge accounts?',
lossOfUnsubmittedData: ({email}: MergeAccountGenericParams) => `Merging your accounts is irreversible and will result in the loss of any unsubmitted expenses for ${email}`,
enterMagicCode: ({email}: MergeAccountGenericParams) => `To continue, please enter the magic code sent to ${email}`,
},
mergeSuccess: {
accountsMerged: 'Accounts merged!',
successfullyMergedAllData: ({email, newEmail}: MergeAccountGenericParams & {newEmail: string}) =>
`You've successfully merged all data from ${email} into ${newEmail}. Moving forward, you can use either login for this account.`,
},
mergePendingSAML: {
weAreWorkingOnIt: 'We’re working on it',
limitedSupport: 'We don’t yet support merging accounts on New Expensify. Please take this action on Expensify Classic instead.',
reachOutForHelp: {
beforeLink: 'Feel free to ',
linkText: 'reach out to Concierge',
afterLink: ' if you have any questions!',
},
goToExpensifyClassic: 'Go to Expensify Classic',
},
mergeFailureSAMLDomainControl: {
beforeLink: ({email}: MergeAccountGenericParams) => `You can't merge ${email} because it's controlled by ${email.split('@').at(0)}. Please `,
linkText: 'reach out to Concierge',
afterLink: ' for assistance.',
},
mergeFailureSAMLAccount: ({email}: MergeAccountGenericParams) =>
`You can’t merge ${email} into other accounts because your domain admin has set it as your primary login. Please merge other accounts into it instead.`,
mergeFailure2FA: {
oldAccount2FAEnabled: ({email}: MergeAccountGenericParams) =>
`You can’t merge accounts because ${email} has two-factor authentication (2FA) enabled. Please disable 2FA for ${email} and try again.`,
learnMore: 'Learn more about merging accounts.',
},
mergeFailureAccountLocked: {
beforeLink: ({email}: MergeAccountGenericParams) => `You can't merge ${email} because it's locked. Please `,
linkText: 'reach out to Concierge ',
afterLink: `for assistance.`,
},
mergeFailureUncreatedAccount: {
noExpensifyAccount: ({email}: MergeAccountGenericParams) => `You can’t merge accounts because ${email} doesn’t have an Expensify account.`,
addContactMethod: {
beforeLink: 'Please ',
linkText: 'add it as a contact method',
afterLink: ' instead.',
},
},
mergeFailureSmartScannerAccount: ({email}: MergeAccountGenericParams) => `You can’t merge ${email} into other accounts. Please merge other accounts into it instead.`,
mergeFailureInvoicedAccount: ({email}: MergeAccountGenericParams) =>
`You can’t merge ${email} into other accounts because it’s the billing owner of an invoiced account. Please merge other accounts into it instead.`,
mergeFailureGenericHeading: 'Can’t merge accounts',
},
passwordPage: {
changePassword: 'Change password',
changingYourPasswordPrompt: 'Changing your password will update your password for both your Expensify.com and New Expensify accounts.',
Expand Down
57 changes: 57 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ import type {
ManagerApprovedParams,
MarkedReimbursedParams,
MarkReimbursedFromIntegrationParams,
MergeAccountGenericParams,
MissingPropertyParams,
MovedFromPersonalSpaceParams,
NeedCategoryForExportToIntegrationParams,
Expand Down Expand Up @@ -1360,6 +1361,62 @@ const translations = {
defaultContact: 'Método de contacto predeterminado:',
enterYourDefaultContactMethod: 'Por favor, introduce tu método de contacto predeterminado para cerrar tu cuenta.',
},
mergeAccountsPage: {
mergeAccount: 'Fusionar cuentas',
accountDetails: {
accountToMergeInto: ({email}: MergeAccountGenericParams) => `Introduce la cuenta en la que deseas fusionar ${email}`,
notReversibleConsent: 'Entiendo que esto no es reversible',
},
accountValidate: {
confirmMerge: '¿Estás seguro de que deseas fusionar cuentas?',
lossOfUnsubmittedData: ({email}: MergeAccountGenericParams) => `Fusionar tus cuentas es irreversible y resultará en la pérdida de cualquier gasto no enviado de ${email}`,
enterMagicCode: ({email}: MergeAccountGenericParams) => `Para continuar, por favor introduce el código mágico enviado a ${email}`,
},
mergeSuccess: {
accountsMerged: '¡Cuentas fusionadas!',
successfullyMergedAllData: ({email, newEmail}: MergeAccountGenericParams & {newEmail: string}) =>
`Has fusionado exitosamente todos los datos de ${email} en ${newEmail}. De ahora en adelante, puedes usar cualquiera de los inicios de sesión para esta cuenta`,
},
mergePendingSAML: {
weAreWorkingOnIt: 'Estamos trabajando en ello',
limitedSupport: 'Todavía no es posible fusionar cuentas en New Expensify. Por favor, realiza esta acción en Expensify Classic en su lugar',
reachOutForHelp: {
beforeLink: '¡No dudes en ',
linkText: 'comunicarte con Concierge',
afterLink: ' si tienes alguna pregunta!',
},
goToExpensifyClassic: 'Dirígete a Expensify Classic',
},
mergeFailureSAMLDomainControl: {
beforeLink: ({email}: MergeAccountGenericParams) => `No puedes fusionar ${email} porque está controlado por ${email.split('@').at(0)}. Póngase `,
linkText: 'en contacto con Conserjería',
afterLink: ' si necesita ayuda.',
},
mergeFailureSAMLAccount: ({email}: MergeAccountGenericParams) =>
`No puedes fusionar ${email} en otras cuentas porque tu administrador de dominio la ha establecido como tu inicio de sesión principal. Por favor, fusiona otras cuentas en esta en su lugar.`,
mergeFailure2FA: {
oldAccount2FAEnabled: ({email}: MergeAccountGenericParams) =>
`No puedes fusionar cuentas porque ${email} tiene habilitada la autenticación de dos factores (2FA). Por favor, deshabilita 2FA para ${email} e inténtalo nuevamente.`,
learnMore: 'Aprende más sobre cómo fusionar cuentas.',
},
mergeFailureAccountLocked: {
beforeLink: ({email}: MergeAccountGenericParams) => `No puedes fusionar ${email} porque está bloqueado. Póngase `,
linkText: 'en contacto con Conserjería',
afterLink: ` si necesita ayuda.`,
},
mergeFailureUncreatedAccount: {
noExpensifyAccount: ({email}: MergeAccountGenericParams) => `No puedes fusionar cuentas porque ${email} no tiene una cuenta de Expensify.`,
addContactMethod: {
beforeLink: 'Por favor, ',
linkText: 'añádela como método de contacto',
afterLink: ' en su lugar.',
},
},
mergeFailureSmartScannerAccount: ({email}: MergeAccountGenericParams) => `No puedes fusionar ${email} en otras cuentas. Por favor, fusiona otras cuentas en esta en su lugar.`,
mergeFailureInvoicedAccount: ({email}: MergeAccountGenericParams) =>
`No puedes fusionar ${email} en otras cuentas porque es el propietario de facturación de una cuenta facturada. Por favor, fusiona otras cuentas en esta en su lugar.`,
mergeFailureGenericHeading: 'No se pueden fusionar cuentas',
},
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have we confirmed all these?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add link to the slack discussion on checklist.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are in the design doc.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Screenshot 2025-03-07 at 1 35 36 PM

passwordPage: {
changePassword: 'Cambiar contraseña',
changingYourPasswordPrompt: 'El cambio de contraseña va a afectar tanto a la cuenta de Expensify.com como la de New Expensify.',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/params.ts
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,10 @@ type SettlementDateParams = {
settlementDate: string;
};

type MergeAccountGenericParams = {
email: string;
};

type PolicyExpenseChatNameParams = {
displayName: string;
};
Expand Down Expand Up @@ -886,6 +890,7 @@ export type {
UpdatedPolicyReportFieldDefaultValueParams,
SubmitsToParams,
SettlementDateParams,
MergeAccountGenericParams,
PolicyExpenseChatNameParams,
NeedCategoryForExportToIntegrationParams,
};
3 changes: 3 additions & 0 deletions src/libs/API/parameters/GetValidateCodeForAccountMerge.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
type GetValidateCodeForAccountMergeParams = {email: string; authToken: string};

export default GetValidateCodeForAccountMergeParams;
3 changes: 3 additions & 0 deletions src/libs/API/parameters/MergeWithValidateCode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
type MergeWithValidateCode = {email: string; validateCode: string};

export default MergeWithValidateCode;
Loading
Loading