From 07534df7fa596155fa3ec19d2369ccfdc7611c3e Mon Sep 17 00:00:00 2001
From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com>
Date: Wed, 13 May 2026 20:10:15 +0530
Subject: [PATCH 1/8] Show Gusto sync results
---
src/components/GustoSyncResultsModal.tsx | 125 +++++++++++++++++++
src/hooks/useGustoSyncResultsModal.ts | 50 ++++++++
src/languages/en.ts | 8 ++
src/languages/es.ts | 8 ++
src/pages/workspace/WorkspaceMembersPage.tsx | 3 +
src/pages/workspace/hr/WorkspaceHRPage.tsx | 5 +
6 files changed, 199 insertions(+)
create mode 100644 src/components/GustoSyncResultsModal.tsx
create mode 100644 src/hooks/useGustoSyncResultsModal.ts
diff --git a/src/components/GustoSyncResultsModal.tsx b/src/components/GustoSyncResultsModal.tsx
new file mode 100644
index 000000000000..ed2cea58d1c0
--- /dev/null
+++ b/src/components/GustoSyncResultsModal.tsx
@@ -0,0 +1,125 @@
+import React, {useState} from 'react';
+import {View} from 'react-native';
+import Button from '@components/Button';
+import FixedFooter from '@components/FixedFooter';
+import HeaderWithBackButton from '@components/HeaderWithBackButton';
+import Icon from '@components/Icon';
+import Modal from '@components/Modal';
+import type {ModalProps} from '@components/Modal/Global/ModalContext';
+import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback';
+import ScreenWrapper from '@components/ScreenWrapper';
+import ScrollView from '@components/ScrollView';
+import Text from '@components/Text';
+import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
+import useLocalize from '@hooks/useLocalize';
+import useTheme from '@hooks/useTheme';
+import useThemeStyles from '@hooks/useThemeStyles';
+import type {GustoSyncResult, GustoSyncResultUser} from '@libs/API/GustoSyncResult';
+import CONST from '@src/CONST';
+
+type GustoSyncResultsModalProps = ModalProps & {
+ /** Sync result returned by the completed Gusto sync job */
+ result: GustoSyncResult;
+};
+
+function getResultCount(users?: GustoSyncResultUser[]) {
+ return users?.length ?? 0;
+}
+
+function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps) {
+ const {translate} = useLocalize();
+ const styles = useThemeStyles();
+ const theme = useTheme();
+ const icons = useMemoizedLazyExpensifyIcons(['DownArrow', 'Sync']);
+ const illustrations = useMemoizedLazyIllustrations(['NewUser']);
+ const [isSkippedSectionExpanded, setIsSkippedSectionExpanded] = useState(false);
+
+ const addedCount = getResultCount(result.added);
+ const removedCount = getResultCount(result.removed);
+ const skippedCount = getResultCount(result.skipped);
+ const closeResultsModal = () => closeModal();
+
+ const renderResultSummary = (label: string, count: number) => (
+
+ {label}
+ {translate('workspace.hr.gusto.syncResults.employeeCount', {count})}
+
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {translate('workspace.hr.gusto.syncResults.successTitle')}
+ {renderResultSummary(translate('workspace.hr.gusto.syncResults.added'), addedCount)}
+ {renderResultSummary(translate('workspace.hr.gusto.syncResults.removed'), removedCount)}
+ setIsSkippedSectionExpanded((isExpanded) => !isExpanded)}
+ style={[styles.flexRow, styles.justifyContentBetween, styles.alignItemsCenter]}
+ >
+
+ {translate('workspace.hr.gusto.syncResults.skipped')}
+ {translate('workspace.hr.gusto.syncResults.employeeCount', {count: skippedCount})}
+
+
+
+ {isSkippedSectionExpanded &&
+ result.skipped?.map((user) => (
+
+ {user.displayName ?? user.email}
+ {user.reason}
+
+ ))}
+
+
+
+
+
+
+ );
+}
+
+export default GustoSyncResultsModal;
diff --git a/src/hooks/useGustoSyncResultsModal.ts b/src/hooks/useGustoSyncResultsModal.ts
new file mode 100644
index 000000000000..58974071cc5c
--- /dev/null
+++ b/src/hooks/useGustoSyncResultsModal.ts
@@ -0,0 +1,50 @@
+import {useEffect} from 'react';
+import type {OnyxEntry} from 'react-native-onyx';
+import GustoSyncResultsModal from '@components/GustoSyncResultsModal';
+import {useModal} from '@components/Modal/Global/ModalContext';
+import CONST from '@src/CONST';
+import type {PolicyConnectionSyncProgress} from '@src/types/onyx/Policy';
+import usePrevious from './usePrevious';
+
+function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: OnyxEntry, isFocused: boolean) {
+ const {showModal} = useModal();
+ const previousSyncProgress = usePrevious(connectionSyncProgress);
+
+ useEffect(() => {
+ const isGustoSyncDoneWithResult =
+ connectionSyncProgress?.connectionName === CONST.POLICY.CONNECTIONS.NAME.GUSTO &&
+ connectionSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE &&
+ !!connectionSyncProgress?.result;
+ const wasSameGustoResultAlreadyHandled =
+ previousSyncProgress?.connectionName === CONST.POLICY.CONNECTIONS.NAME.GUSTO &&
+ previousSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE &&
+ previousSyncProgress?.timestamp === connectionSyncProgress?.timestamp &&
+ !!previousSyncProgress?.result;
+ const didGustoSyncComplete =
+ isFocused && isGustoSyncDoneWithResult && !wasSameGustoResultAlreadyHandled;
+
+ if (!didGustoSyncComplete) {
+ return;
+ }
+
+ showModal({
+ component: GustoSyncResultsModal,
+ props: {result: connectionSyncProgress.result},
+ id: `gusto-sync-results-${policyID}`,
+ });
+ }, [
+ connectionSyncProgress?.connectionName,
+ connectionSyncProgress?.result,
+ connectionSyncProgress?.stageInProgress,
+ connectionSyncProgress?.timestamp,
+ isFocused,
+ policyID,
+ previousSyncProgress?.connectionName,
+ previousSyncProgress?.result,
+ previousSyncProgress?.stageInProgress,
+ previousSyncProgress?.timestamp,
+ showModal,
+ ]);
+}
+
+export default useGustoSyncResultsModal;
diff --git a/src/languages/en.ts b/src/languages/en.ts
index d8ffb91ea8cd..75ec3011ae63 100644
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -6431,6 +6431,14 @@ const translations = {
description: 'I’ll manually setup approval workflows in Expensify.',
},
},
+ syncResults: {
+ title: 'Gusto sync results',
+ successTitle: 'Successfully synced your Gusto connection!',
+ added: 'Added to Expensify',
+ removed: 'Removed from Expensify',
+ skipped: 'Skipped',
+ employeeCount: ({count}: {count: number}) => `${count} ${count === 1 ? 'employee' : 'employees'}`,
+ },
},
},
export: {
diff --git a/src/languages/es.ts b/src/languages/es.ts
index a82f3e14163e..c1d5fa065f9f 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -6268,6 +6268,14 @@ ${amount} para ${merchant} - ${date}`,
description: 'Configuraré manualmente los flujos de aprobación en Expensify.',
},
},
+ syncResults: {
+ title: 'Resultados de sincronización de Gusto',
+ successTitle: '¡Tu conexión de Gusto se sincronizó correctamente!',
+ added: 'Añadidos a Expensify',
+ removed: 'Eliminados de Expensify',
+ skipped: 'Omitidos',
+ employeeCount: ({count}) => `${count} ${count === 1 ? 'empleado' : 'empleados'}`,
+ },
},
},
export: {
diff --git a/src/pages/workspace/WorkspaceMembersPage.tsx b/src/pages/workspace/WorkspaceMembersPage.tsx
index f4289fe4cb83..ac586780ea8b 100644
--- a/src/pages/workspace/WorkspaceMembersPage.tsx
+++ b/src/pages/workspace/WorkspaceMembersPage.tsx
@@ -29,6 +29,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
import useDebouncedAccessibilityAnnouncement from '@hooks/useDebouncedAccessibilityAnnouncement';
import useDebouncedValue from '@hooks/useDebouncedValue';
import useFilteredSelection from '@hooks/useFilteredSelection';
+import useGustoSyncResultsModal from '@hooks/useGustoSyncResultsModal';
import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useMobileSelectionMode from '@hooks/useMobileSelectionMode';
@@ -619,6 +620,8 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
clearInviteDraft(route.params.policyID);
}, [invitedEmailsToAccountIDsDraft, isFocused, accountIDs, prevAccountIDs, route.params.policyID]);
+ useGustoSyncResultsModal(policyID, connectionSyncProgress, isFocused);
+
const headerMessage = useMemo(() => {
if (isOfflineAndNoMemberDataAvailable) {
return translate('workspace.common.mustBeOnlineToViewMembers');
diff --git a/src/pages/workspace/hr/WorkspaceHRPage.tsx b/src/pages/workspace/hr/WorkspaceHRPage.tsx
index 2e35466ee60c..00d332e6b887 100644
--- a/src/pages/workspace/hr/WorkspaceHRPage.tsx
+++ b/src/pages/workspace/hr/WorkspaceHRPage.tsx
@@ -1,3 +1,4 @@
+import {useIsFocused} from '@react-navigation/native';
import React, {useCallback, useEffect, useMemo, useState} from 'react';
import {View} from 'react-native';
import type {ValueOf} from 'type-fest';
@@ -15,6 +16,7 @@ import Section from '@components/Section';
import Text from '@components/Text';
import ThreeDotsMenu from '@components/ThreeDotsMenu';
import type ThreeDotsMenuProps from '@components/ThreeDotsMenu/types';
+import useGustoSyncResultsModal from '@hooks/useGustoSyncResultsModal';
import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
@@ -46,6 +48,7 @@ function WorkspaceHRPage({
},
}: WorkspaceHRPageProps) {
const {translate, datetimeToRelative, getLocalDateFromDatetime} = useLocalize();
+ const isFocused = useIsFocused();
const {isBetaEnabled} = usePermissions();
const styles = useThemeStyles();
const {shouldUseNarrowLayout} = useResponsiveLayout();
@@ -91,6 +94,8 @@ function WorkspaceHRPage({
fetchPolicyHRPage();
}, [fetchPolicyHRPage]);
+ useGustoSyncResultsModal(policyID, connectionSyncProgress, isFocused);
+
const overflowMenu: ThreeDotsMenuProps['menuItems'] = useMemo(
() => [
{
From 684f5e190a39b52b5d19479c294601c1c4177f6b Mon Sep 17 00:00:00 2001
From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com>
Date: Thu, 14 May 2026 18:25:41 +0530
Subject: [PATCH 2/8] Update Gusto sync result shape
---
src/components/GustoSyncResultsModal.tsx | 20 ++++++++------------
src/libs/API/GustoSyncResult.ts | 17 +++++++----------
2 files changed, 15 insertions(+), 22 deletions(-)
diff --git a/src/components/GustoSyncResultsModal.tsx b/src/components/GustoSyncResultsModal.tsx
index ed2cea58d1c0..f017aa52e127 100644
--- a/src/components/GustoSyncResultsModal.tsx
+++ b/src/components/GustoSyncResultsModal.tsx
@@ -14,7 +14,7 @@ import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hook
import useLocalize from '@hooks/useLocalize';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
-import type {GustoSyncResult, GustoSyncResultUser} from '@libs/API/GustoSyncResult';
+import type {GustoSyncResult} from '@libs/API/GustoSyncResult';
import CONST from '@src/CONST';
type GustoSyncResultsModalProps = ModalProps & {
@@ -22,10 +22,6 @@ type GustoSyncResultsModalProps = ModalProps & {
result: GustoSyncResult;
};
-function getResultCount(users?: GustoSyncResultUser[]) {
- return users?.length ?? 0;
-}
-
function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps) {
const {translate} = useLocalize();
const styles = useThemeStyles();
@@ -34,9 +30,9 @@ function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps)
const illustrations = useMemoizedLazyIllustrations(['NewUser']);
const [isSkippedSectionExpanded, setIsSkippedSectionExpanded] = useState(false);
- const addedCount = getResultCount(result.added);
- const removedCount = getResultCount(result.removed);
- const skippedCount = getResultCount(result.skipped);
+ const addedCount = result.addedEmployeesCount ?? 0;
+ const removedCount = result.removedEmployeesCount ?? 0;
+ const skippedCount = result.skippedEmployees?.length ?? 0;
const closeResultsModal = () => closeModal();
const renderResultSummary = (label: string, count: number) => (
@@ -99,13 +95,13 @@ function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps)
/>
{isSkippedSectionExpanded &&
- result.skipped?.map((user) => (
+ result.skippedEmployees?.map((employee) => (
- {user.displayName ?? user.email}
- {user.reason}
+ {employee.name}
+ {employee.reason}
))}
diff --git a/src/libs/API/GustoSyncResult.ts b/src/libs/API/GustoSyncResult.ts
index 363162d21ca8..79c497f0fcc9 100644
--- a/src/libs/API/GustoSyncResult.ts
+++ b/src/libs/API/GustoSyncResult.ts
@@ -1,16 +1,13 @@
-type GustoSyncResultUser = {
- email: string;
- displayName?: string;
-};
-
-type GustoSyncSkippedResultUser = GustoSyncResultUser & {
+type GustoSyncSkippedEmployee = {
+ name: string;
+ id: string;
reason: string;
};
type GustoSyncResult = {
- added?: GustoSyncResultUser[];
- removed?: GustoSyncResultUser[];
- skipped?: GustoSyncSkippedResultUser[];
+ addedEmployeesCount?: number;
+ removedEmployeesCount?: number;
+ skippedEmployees?: GustoSyncSkippedEmployee[];
};
-export type {GustoSyncResult, GustoSyncResultUser};
+export type {GustoSyncResult, GustoSyncSkippedEmployee};
From 51bcb75326afc077d6ebfbe76374cabb227ff022 Mon Sep 17 00:00:00 2001
From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com>
Date: Fri, 15 May 2026 14:00:57 +0530
Subject: [PATCH 3/8] Fix Gusto sync results modal
---
.../simple-illustration__syncusers.svg | 1 +
src/components/GustoSyncResultsModal.tsx | 26 ++++++-------------
.../Icon/chunks/illustrations.chunk.ts | 2 ++
3 files changed, 11 insertions(+), 18 deletions(-)
create mode 100644 assets/images/simple-illustrations/simple-illustration__syncusers.svg
diff --git a/assets/images/simple-illustrations/simple-illustration__syncusers.svg b/assets/images/simple-illustrations/simple-illustration__syncusers.svg
new file mode 100644
index 000000000000..6611d1d7c46b
--- /dev/null
+++ b/assets/images/simple-illustrations/simple-illustration__syncusers.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/GustoSyncResultsModal.tsx b/src/components/GustoSyncResultsModal.tsx
index f017aa52e127..a95baa8e57f1 100644
--- a/src/components/GustoSyncResultsModal.tsx
+++ b/src/components/GustoSyncResultsModal.tsx
@@ -7,7 +7,6 @@ import Icon from '@components/Icon';
import Modal from '@components/Modal';
import type {ModalProps} from '@components/Modal/Global/ModalContext';
import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback';
-import ScreenWrapper from '@components/ScreenWrapper';
import ScrollView from '@components/ScrollView';
import Text from '@components/Text';
import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
@@ -24,10 +23,10 @@ type GustoSyncResultsModalProps = ModalProps & {
function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps) {
const {translate} = useLocalize();
- const styles = useThemeStyles();
const theme = useTheme();
- const icons = useMemoizedLazyExpensifyIcons(['DownArrow', 'Sync']);
- const illustrations = useMemoizedLazyIllustrations(['NewUser']);
+ const styles = useThemeStyles();
+ const icons = useMemoizedLazyExpensifyIcons(['DownArrow']);
+ const illustrations = useMemoizedLazyIllustrations(['SyncUsers']);
const [isSkippedSectionExpanded, setIsSkippedSectionExpanded] = useState(false);
const addedCount = result.addedEmployeesCount ?? 0;
@@ -50,10 +49,9 @@ function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps)
shouldHandleNavigationBack
enableEdgeToEdgeBottomSafeAreaPadding
>
-
-
-
-
{translate('workspace.hr.gusto.syncResults.successTitle')}
{renderResultSummary(translate('workspace.hr.gusto.syncResults.added'), addedCount)}
@@ -105,7 +95,7 @@ function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps)
))}
-
+
-
+
);
}
diff --git a/src/components/Icon/chunks/illustrations.chunk.ts b/src/components/Icon/chunks/illustrations.chunk.ts
index ed64b2d5a59a..b5133dbd5058 100644
--- a/src/components/Icon/chunks/illustrations.chunk.ts
+++ b/src/components/Icon/chunks/illustrations.chunk.ts
@@ -185,6 +185,7 @@ import Stopwatch from '@assets/images/simple-illustrations/simple-illustration__
import SubscriptionAnnual from '@assets/images/simple-illustrations/simple-illustration__subscription-annual.svg';
import SubscriptionPPU from '@assets/images/simple-illustrations/simple-illustration__subscription-ppu.svg';
import Sunglasses from '@assets/images/simple-illustrations/simple-illustration__sunglasses.svg';
+import SyncUsers from '@assets/images/simple-illustrations/simple-illustration__syncusers.svg';
import Tag from '@assets/images/simple-illustrations/simple-illustration__tag.svg';
import Target from '@assets/images/simple-illustrations/simple-illustration__target.svg';
import TeachersUnite from '@assets/images/simple-illustrations/simple-illustration__teachers-unite.svg';
@@ -389,6 +390,7 @@ const Illustrations = {
LockOpen,
Mailbox,
NewUser,
+ SyncUsers,
ShieldYellow,
Clock,
Members,
From d059b6e8742178ad3d393cbfcadab9aa8a252adf Mon Sep 17 00:00:00 2001
From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com>
Date: Fri, 15 May 2026 14:19:20 +0530
Subject: [PATCH 4/8] Fix Gusto sync results review issues
---
src/components/GustoSyncResultsModal.tsx | 27 ++++++++++++------------
src/hooks/useGustoSyncResultsModal.ts | 7 +++---
src/languages/en.ts | 4 ++--
src/languages/es.ts | 4 ++--
4 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/src/components/GustoSyncResultsModal.tsx b/src/components/GustoSyncResultsModal.tsx
index a95baa8e57f1..7f771b4bdb3c 100644
--- a/src/components/GustoSyncResultsModal.tsx
+++ b/src/components/GustoSyncResultsModal.tsx
@@ -1,20 +1,20 @@
import React, {useState} from 'react';
import {View} from 'react-native';
-import Button from '@components/Button';
-import FixedFooter from '@components/FixedFooter';
-import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import Icon from '@components/Icon';
-import Modal from '@components/Modal';
-import type {ModalProps} from '@components/Modal/Global/ModalContext';
-import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback';
-import ScrollView from '@components/ScrollView';
-import Text from '@components/Text';
import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import type {GustoSyncResult} from '@libs/API/GustoSyncResult';
import CONST from '@src/CONST';
+import Button from './Button';
+import FixedFooter from './FixedFooter';
+import HeaderWithBackButton from './HeaderWithBackButton';
+import Icon from './Icon';
+import Modal from './Modal';
+import type {ModalProps} from './Modal/Global/ModalContext';
+import PressableWithoutFeedback from './Pressable/PressableWithoutFeedback';
+import ScrollView from './ScrollView';
+import Text from './Text';
type GustoSyncResultsModalProps = ModalProps & {
/** Sync result returned by the completed Gusto sync job */
@@ -57,12 +57,12 @@ function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps)
title={translate('workspace.hr.gusto.syncResults.title')}
onBackButtonPress={closeResultsModal}
/>
-
-
+
+
{translate('workspace.hr.gusto.syncResults.successTitle')}
@@ -70,6 +70,7 @@ function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps)
{renderResultSummary(translate('workspace.hr.gusto.syncResults.removed'), removedCount)}
setIsSkippedSectionExpanded((isExpanded) => !isExpanded)}
style={[styles.flexRow, styles.justifyContentBetween, styles.alignItemsCenter]}
diff --git a/src/hooks/useGustoSyncResultsModal.ts b/src/hooks/useGustoSyncResultsModal.ts
index 58974071cc5c..9708af2c4f93 100644
--- a/src/hooks/useGustoSyncResultsModal.ts
+++ b/src/hooks/useGustoSyncResultsModal.ts
@@ -11,10 +11,11 @@ function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: Onyx
const previousSyncProgress = usePrevious(connectionSyncProgress);
useEffect(() => {
+ const syncResult = connectionSyncProgress?.result;
const isGustoSyncDoneWithResult =
connectionSyncProgress?.connectionName === CONST.POLICY.CONNECTIONS.NAME.GUSTO &&
connectionSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE &&
- !!connectionSyncProgress?.result;
+ !!syncResult;
const wasSameGustoResultAlreadyHandled =
previousSyncProgress?.connectionName === CONST.POLICY.CONNECTIONS.NAME.GUSTO &&
previousSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE &&
@@ -23,13 +24,13 @@ function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: Onyx
const didGustoSyncComplete =
isFocused && isGustoSyncDoneWithResult && !wasSameGustoResultAlreadyHandled;
- if (!didGustoSyncComplete) {
+ if (!didGustoSyncComplete || !syncResult) {
return;
}
showModal({
component: GustoSyncResultsModal,
- props: {result: connectionSyncProgress.result},
+ props: {result: syncResult},
id: `gusto-sync-results-${policyID}`,
});
}, [
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 75ec3011ae63..3c5f0f001895 100644
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -6434,8 +6434,8 @@ const translations = {
syncResults: {
title: 'Gusto sync results',
successTitle: 'Successfully synced your Gusto connection!',
- added: 'Added to Expensify',
- removed: 'Removed from Expensify',
+ added: 'Added',
+ removed: 'Removed',
skipped: 'Skipped',
employeeCount: ({count}: {count: number}) => `${count} ${count === 1 ? 'employee' : 'employees'}`,
},
diff --git a/src/languages/es.ts b/src/languages/es.ts
index c1d5fa065f9f..3f8b9216ebd3 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -6271,8 +6271,8 @@ ${amount} para ${merchant} - ${date}`,
syncResults: {
title: 'Resultados de sincronización de Gusto',
successTitle: '¡Tu conexión de Gusto se sincronizó correctamente!',
- added: 'Añadidos a Expensify',
- removed: 'Eliminados de Expensify',
+ added: 'Añadidos',
+ removed: 'Eliminados',
skipped: 'Omitidos',
employeeCount: ({count}) => `${count} ${count === 1 ? 'empleado' : 'empleados'}`,
},
From a2ced94da51ea636119d71e58aa10cf50f7f8e01 Mon Sep 17 00:00:00 2001
From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com>
Date: Fri, 15 May 2026 14:20:11 +0530
Subject: [PATCH 5/8] Format Gusto sync results hook
---
src/hooks/useGustoSyncResultsModal.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/hooks/useGustoSyncResultsModal.ts b/src/hooks/useGustoSyncResultsModal.ts
index 9708af2c4f93..fc99f921729d 100644
--- a/src/hooks/useGustoSyncResultsModal.ts
+++ b/src/hooks/useGustoSyncResultsModal.ts
@@ -21,8 +21,7 @@ function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: Onyx
previousSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE &&
previousSyncProgress?.timestamp === connectionSyncProgress?.timestamp &&
!!previousSyncProgress?.result;
- const didGustoSyncComplete =
- isFocused && isGustoSyncDoneWithResult && !wasSameGustoResultAlreadyHandled;
+ const didGustoSyncComplete = isFocused && isGustoSyncDoneWithResult && !wasSameGustoResultAlreadyHandled;
if (!didGustoSyncComplete || !syncResult) {
return;
From eae836ab5cdf156cc46193ae0e2ad9c35684c695 Mon Sep 17 00:00:00 2001
From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com>
Date: Fri, 15 May 2026 14:30:13 +0530
Subject: [PATCH 6/8] Prevent stale Gusto sync result modal
---
src/hooks/useGustoSyncResultsModal.ts | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/hooks/useGustoSyncResultsModal.ts b/src/hooks/useGustoSyncResultsModal.ts
index fc99f921729d..46490f00629b 100644
--- a/src/hooks/useGustoSyncResultsModal.ts
+++ b/src/hooks/useGustoSyncResultsModal.ts
@@ -16,12 +16,10 @@ function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: Onyx
connectionSyncProgress?.connectionName === CONST.POLICY.CONNECTIONS.NAME.GUSTO &&
connectionSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE &&
!!syncResult;
- const wasSameGustoResultAlreadyHandled =
+ const didTransitionToJobDone =
previousSyncProgress?.connectionName === CONST.POLICY.CONNECTIONS.NAME.GUSTO &&
- previousSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE &&
- previousSyncProgress?.timestamp === connectionSyncProgress?.timestamp &&
- !!previousSyncProgress?.result;
- const didGustoSyncComplete = isFocused && isGustoSyncDoneWithResult && !wasSameGustoResultAlreadyHandled;
+ previousSyncProgress?.stageInProgress !== CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE;
+ const didGustoSyncComplete = isFocused && isGustoSyncDoneWithResult && didTransitionToJobDone;
if (!didGustoSyncComplete || !syncResult) {
return;
@@ -40,9 +38,7 @@ function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: Onyx
isFocused,
policyID,
previousSyncProgress?.connectionName,
- previousSyncProgress?.result,
previousSyncProgress?.stageInProgress,
- previousSyncProgress?.timestamp,
showModal,
]);
}
From 36c3ec30c45bd3d3b54afc556e84e74fd442c74e Mon Sep 17 00:00:00 2001
From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com>
Date: Sat, 16 May 2026 00:10:40 +0530
Subject: [PATCH 7/8] Use pluralization for Gusto employee count
---
src/languages/de.ts | 11 +++++++++++
src/languages/en.ts | 5 ++++-
src/languages/es.ts | 31 +++++++++----------------------
src/languages/fr.ts | 12 +++++++++++-
src/languages/it.ts | 12 +++++++++++-
src/languages/ja.ts | 11 +++++++++++
src/languages/nl.ts | 11 +++++++++++
src/languages/pl.ts | 11 +++++++++++
src/languages/pt-BR.ts | 11 +++++++++++
src/languages/zh-hans.ts | 11 +++++++++++
10 files changed, 101 insertions(+), 25 deletions(-)
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 633d39c63376..a4bb0632dae7 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -7079,6 +7079,17 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
syncError: 'Verbindung zu Gusto nicht möglich',
disconnectTitle: 'Gusto trennen',
disconnectPrompt: 'Bist du sicher, dass du Gusto trennen möchtest?',
+ syncResults: {
+ title: 'Gusto-Synchronisierungsergebnisse',
+ successTitle: 'Ihre Gusto-Verbindung wurde erfolgreich synchronisiert!',
+ added: 'Hinzugefügt',
+ removed: 'Entfernt',
+ skipped: 'Übersprungen',
+ employeeCount: () => ({
+ one: '1 Mitarbeiter',
+ other: (count: number) => `${count} Mitarbeitende`,
+ }),
+ },
},
},
},
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 3c5f0f001895..269b3b773380 100644
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -6437,7 +6437,10 @@ const translations = {
added: 'Added',
removed: 'Removed',
skipped: 'Skipped',
- employeeCount: ({count}: {count: number}) => `${count} ${count === 1 ? 'employee' : 'employees'}`,
+ employeeCount: () => ({
+ one: '1 employee',
+ other: (count: number) => `${count} employees`,
+ }),
},
},
},
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 3f8b9216ebd3..219536666a84 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -1687,10 +1687,8 @@ const translations: TranslationDeepObject = {
backdropLabel: 'Fondo del Modal',
},
nextStep: {
- /* eslint-disable @typescript-eslint/no-unused-vars */
message: {
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_ADD_TRANSACTIONS]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tú añadas gastos.`;
@@ -1701,7 +1699,6 @@ const translations: TranslationDeepObject = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_SUBMIT]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tú envíes los gastos.`;
@@ -1713,7 +1710,6 @@ const translations: TranslationDeepObject = {
},
[CONST.NEXT_STEP.MESSAGE_KEY.NO_FURTHER_ACTION]: (_actor, _actorType, _eta, _etaType) => `¡No se requiere ninguna acción adicional!`,
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_FOR_SUBMITTER_ACCOUNT]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tú añadas una cuenta bancaria.`;
@@ -1728,7 +1724,6 @@ const translations: TranslationDeepObject = {
if (eta) {
formattedETA = etaType === CONST.NEXT_STEP.ETA_TYPE.DATE_TIME ? ` el ${eta} de cada mes` : ` ${eta}`;
}
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tus gastos se envíen automáticamente${formattedETA}.`;
@@ -1739,7 +1734,6 @@ const translations: TranslationDeepObject = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_FIX_ISSUES]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tú soluciones ellos problemas.`;
@@ -1750,7 +1744,6 @@ const translations: TranslationDeepObject = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_APPROVE]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tú apruebes los gastos.`;
@@ -1761,7 +1754,6 @@ const translations: TranslationDeepObject = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_EXPORT]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tú exportes este informe.`;
@@ -1772,7 +1764,6 @@ const translations: TranslationDeepObject = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_PAY]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tú pagues los gastos.`;
@@ -1783,7 +1774,6 @@ const translations: TranslationDeepObject = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_FOR_POLICY_BANK_ACCOUNT]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tú termines de configurar una cuenta bancaria de empresa.`;
@@ -1803,7 +1793,6 @@ const translations: TranslationDeepObject = {
[CONST.NEXT_STEP.MESSAGE_KEY.SUBMITTING_TO_SELF]: (_actor, _actorType, _eta, _etaType) =>
`¡Ups! Parece que estás enviando el informe a ti mismo. Aprobar tus propios informes está prohibido por tu espacio de trabajo. Por favor, envía este informe a otra persona o contacta a tu administrador para cambiar la persona a la que lo envías.`,
[CONST.NEXT_STEP.MESSAGE_KEY.REJECTED_REPORT]: (actor, actorType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Este informe fue rechazado. Esperando a que tú corrijas los problemas y lo vuelvas a enviar manualmente.`;
@@ -2458,7 +2447,6 @@ ${amount} para ${merchant} - ${date}`,
two: 'º',
few: 'º',
other: 'º',
- /* eslint-disable @typescript-eslint/naming-convention */
'1': 'Primero',
'2': 'Segundo',
'3': 'Tercero',
@@ -2469,7 +2457,6 @@ ${amount} para ${merchant} - ${date}`,
'8': 'Octavo',
'9': 'Noveno',
'10': 'Décimo',
- /* eslint-enable @typescript-eslint/naming-convention */
},
},
approverInMultipleWorkflows: 'Este miembro ya pertenece a otro flujo de aprobación. Cualquier actualización aquí se reflejará allí también.',
@@ -6269,12 +6256,15 @@ ${amount} para ${merchant} - ${date}`,
},
},
syncResults: {
- title: 'Resultados de sincronización de Gusto',
- successTitle: '¡Tu conexión de Gusto se sincronizó correctamente!',
- added: 'Añadidos',
- removed: 'Eliminados',
- skipped: 'Omitidos',
- employeeCount: ({count}) => `${count} ${count === 1 ? 'empleado' : 'empleados'}`,
+ title: 'Resultados de la sincronización de Gusto',
+ successTitle: '¡Se sincronizó correctamente tu conexión con Gusto!',
+ added: 'Añadido',
+ removed: 'Eliminado',
+ skipped: 'Omitido',
+ employeeCount: () => ({
+ one: '1 empleado',
+ other: (count: number) => `${count} empleados`,
+ }),
},
},
},
@@ -6941,7 +6931,6 @@ ${amount} para ${merchant} - ${date}`,
restrictedDescription: 'Sólo las personas en tu espacio de trabajo pueden encontrar esta sala',
privateDescription: 'Sólo las personas que están invitadas a esta sala pueden encontrarla',
publicDescription: 'Cualquier persona puede unirse a esta sala',
- // eslint-disable-next-line @typescript-eslint/naming-convention
public_announceDescription: 'Cualquier persona puede unirse a esta sala',
createRoom: 'Crea una sala de chat',
roomAlreadyExistsError: 'Ya existe una sala con este nombre',
@@ -6961,7 +6950,6 @@ ${amount} para ${merchant} - ${date}`,
restricted: 'Espacio de trabajo',
private: 'Privada',
public: 'Público',
- // eslint-disable-next-line @typescript-eslint/naming-convention
public_announce: 'Anuncio Público',
},
},
@@ -7276,7 +7264,6 @@ ${amount} para ${merchant} - ${date}`,
updatedDefaultTitle: (newDefaultTitle, oldDefaultTitle) => `cambió la fórmula personalizada del nombre del informe a "${newDefaultTitle}" (previamente "${oldDefaultTitle}")`,
updatedOwnership: (oldOwnerEmail, oldOwnerName, policyName) => `asumió la propiedad del espacio de trabajo ${policyName} de ${oldOwnerName} (${oldOwnerEmail})`,
updatedAutoHarvesting: (enabled) => `${enabled ? 'habilitó' : 'deshabilitó'} el envío programado`,
- // eslint-disable-next-line @typescript-eslint/max-params
updatedIndividualBudgetNotification: (
budgetAmount,
budgetFrequency,
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index d0551c1b1093..c84f46655f64 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -7101,6 +7101,17 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
syncError: 'Impossible de se connecter à Gusto',
disconnectTitle: 'Déconnecter Gusto',
disconnectPrompt: 'Voulez-vous vraiment déconnecter Gusto ?',
+ syncResults: {
+ title: 'Résultats de la synchronisation Gusto',
+ successTitle: 'Connexion Gusto synchronisée avec succès !',
+ added: 'Ajouté',
+ removed: 'Supprimé',
+ skipped: 'Ignoré',
+ employeeCount: () => ({
+ one: '1 employé',
+ other: (count: number) => `${count} employés`,
+ }),
+ },
},
},
},
@@ -9306,7 +9317,6 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`,
restrictDefaultLoginSelection: 'Restreindre la sélection de connexion par défaut',
restrictDefaultLoginSelectionDescription:
'Empêche les membres de modifier leur e-mail de connexion en dehors du domaine de leur entreprise afin d’éviter les restrictions de politique.',
-
expensifyCardPreferredWorkspaceDisabledMessage:
'Pour activer ce paramètre, veuillez d’abord activer un espace de travail préféré et configurer les cartes Expensify sur votre domaine.',
findGroup: 'Trouver un groupe',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 2af8ca2f3fde..3ae5a088a0cb 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -7065,6 +7065,17 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
syncError: 'Impossibile connettersi a Gusto',
disconnectTitle: 'Disconnetti Gusto',
disconnectPrompt: 'Sei sicuro di voler disconnettere Gusto?',
+ syncResults: {
+ title: 'Risultati sincronizzazione Gusto',
+ successTitle: 'Connessione a Gusto sincronizzata con successo!',
+ added: 'Aggiunto',
+ removed: 'Rimosso',
+ skipped: 'Saltato',
+ employeeCount: () => ({
+ one: '1 dipendente',
+ other: (count: number) => `${count} dipendenti`,
+ }),
+ },
},
},
},
@@ -9273,7 +9284,6 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`,
noWorkspacesMessage: 'Non ci sono spazi di lavoro su questo dominio. È necessario uno spazio di lavoro per abilitare questa restrizione.',
restrictDefaultLoginSelection: 'Limita la selezione di accesso predefinita',
restrictDefaultLoginSelectionDescription: 'Impedisce ai membri di modificare l’email di accesso al di fuori del dominio aziendale per eludere le restrizioni delle policy.',
-
expensifyCardPreferredWorkspaceDisabledMessage:
'Per abilitare questa impostazione, abilita prima uno spazio di lavoro preferito e configura le Expensify Card per il tuo dominio.',
findGroup: 'Trova gruppo',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 352e35d6fd3f..c450fcadcd88 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -6986,6 +6986,17 @@ ${reportName}
syncError: 'Gusto に接続できません',
disconnectTitle: 'Gusto の接続を解除',
disconnectPrompt: 'Gusto との接続を本当に解除しますか?',
+ syncResults: {
+ title: 'Gusto 同期結果',
+ successTitle: 'Gusto との連携が正常に同期されました!',
+ added: '追加済み',
+ removed: '削除済み',
+ skipped: 'スキップ済み',
+ employeeCount: () => ({
+ one: '1 従業員',
+ other: (count: number) => `${count} 従業員`,
+ }),
+ },
},
},
},
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index eb071e0152b6..668e5edf1fba 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -7041,6 +7041,17 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
syncError: 'Kan geen verbinding maken met Gusto',
disconnectTitle: 'Verbinding met Gusto verbreken',
disconnectPrompt: 'Weet je zeker dat je de verbinding met Gusto wilt verbreken?',
+ syncResults: {
+ title: 'Gusto-synchronisatieresultaten',
+ successTitle: 'Je Gusto-verbinding is succesvol gesynchroniseerd!',
+ added: 'Toegevoegd',
+ removed: 'Verwijderd',
+ skipped: 'Overgeslagen',
+ employeeCount: () => ({
+ one: '1 werknemer',
+ other: (count: number) => `${count} medewerkers`,
+ }),
+ },
},
},
},
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 9d574d27273e..633c56c79c7a 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -7036,6 +7036,17 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
syncError: 'Nie można połączyć się z Gusto',
disconnectTitle: 'Odłącz Gusto',
disconnectPrompt: 'Czy na pewno chcesz odłączyć Gusto?',
+ syncResults: {
+ title: 'Wyniki synchronizacji Gusto',
+ successTitle: 'Pomyślnie zsynchronizowano Twoje połączenie z Gusto!',
+ added: 'Dodano',
+ removed: 'Usunięto',
+ skipped: 'Pominięto',
+ employeeCount: () => ({
+ one: '1 pracownik',
+ other: (count: number) => `${count} pracownicy`,
+ }),
+ },
},
},
},
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 33fb094d0f8a..f8b4f42dc5da 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -7042,6 +7042,17 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
syncError: 'Não é possível conectar ao Gusto',
disconnectTitle: 'Desconectar Gusto',
disconnectPrompt: 'Tem certeza de que deseja desconectar o Gusto?',
+ syncResults: {
+ title: 'Resultados da sincronização com Gusto',
+ successTitle: 'Sua conexão com o Gusto foi sincronizada com sucesso!',
+ added: 'Adicionado',
+ removed: 'Removido',
+ skipped: 'Ignorado',
+ employeeCount: () => ({
+ one: '1 funcionário',
+ other: (count: number) => `${count} funcionários`,
+ }),
+ },
},
},
},
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 708c543c59cc..53aa2193fcca 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -6868,6 +6868,17 @@ ${reportName}
syncError: '无法连接到 Gusto',
disconnectTitle: '断开 Gusto',
disconnectPrompt: '确定要断开与 Gusto 的连接吗?',
+ syncResults: {
+ title: 'Gusto 同步结果',
+ successTitle: '已成功同步你的 Gusto 连接!',
+ added: '已添加',
+ removed: '已移除',
+ skipped: '已跳过',
+ employeeCount: () => ({
+ one: '1 员工',
+ other: (count: number) => `${count} 员工`,
+ }),
+ },
},
},
},
From de6b005b061b8b8d3948df2dec2bed41d7f426af Mon Sep 17 00:00:00 2001
From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com>
Date: Sat, 16 May 2026 01:05:10 +0530
Subject: [PATCH 8/8] Fix Gusto sync modal lint
---
src/hooks/useGustoSyncResultsModal.ts | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/hooks/useGustoSyncResultsModal.ts b/src/hooks/useGustoSyncResultsModal.ts
index 46490f00629b..35d9fc61b134 100644
--- a/src/hooks/useGustoSyncResultsModal.ts
+++ b/src/hooks/useGustoSyncResultsModal.ts
@@ -7,7 +7,7 @@ import type {PolicyConnectionSyncProgress} from '@src/types/onyx/Policy';
import usePrevious from './usePrevious';
function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: OnyxEntry, isFocused: boolean) {
- const {showModal} = useModal();
+ const modal = useModal();
const previousSyncProgress = usePrevious(connectionSyncProgress);
useEffect(() => {
@@ -17,15 +17,14 @@ function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: Onyx
connectionSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE &&
!!syncResult;
const didTransitionToJobDone =
- previousSyncProgress?.connectionName === CONST.POLICY.CONNECTIONS.NAME.GUSTO &&
- previousSyncProgress?.stageInProgress !== CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE;
+ previousSyncProgress?.connectionName === CONST.POLICY.CONNECTIONS.NAME.GUSTO && previousSyncProgress?.stageInProgress !== CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE;
const didGustoSyncComplete = isFocused && isGustoSyncDoneWithResult && didTransitionToJobDone;
if (!didGustoSyncComplete || !syncResult) {
return;
}
- showModal({
+ modal.showModal({
component: GustoSyncResultsModal,
props: {result: syncResult},
id: `gusto-sync-results-${policyID}`,
@@ -39,7 +38,7 @@ function useGustoSyncResultsModal(policyID: string, connectionSyncProgress: Onyx
policyID,
previousSyncProgress?.connectionName,
previousSyncProgress?.stageInProgress,
- showModal,
+ modal,
]);
}