diff --git a/src/components/GustoSyncResultsModal.tsx b/src/components/HRSyncResultsModal.tsx similarity index 71% rename from src/components/GustoSyncResultsModal.tsx rename to src/components/HRSyncResultsModal.tsx index 7f771b4bdb3c..74f4de488d0b 100644 --- a/src/components/GustoSyncResultsModal.tsx +++ b/src/components/HRSyncResultsModal.tsx @@ -2,10 +2,13 @@ import React, {useState} from 'react'; import {View} from 'react-native'; import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; +import useOnyx from '@hooks/useOnyx'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; -import type {GustoSyncResult} from '@libs/API/GustoSyncResult'; +import type {HrSyncResult} from '@libs/API/HrSyncResult'; +import {getConnectedHRProvider} from '@libs/PolicyUtils'; import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; import Button from './Button'; import FixedFooter from './FixedFooter'; import HeaderWithBackButton from './HeaderWithBackButton'; @@ -16,46 +19,55 @@ 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 */ - result: GustoSyncResult; +type HRSyncResultsModalProps = ModalProps & { + /** Sync result returned by the completed HR sync job */ + result: HrSyncResult; + + /** ID of the policy associated with this sync */ + policyID: string; }; -function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps) { +function HRSyncResultsModal({result, policyID, closeModal}: HRSyncResultsModalProps) { const {translate} = useLocalize(); const theme = useTheme(); const styles = useThemeStyles(); const icons = useMemoizedLazyExpensifyIcons(['DownArrow']); const illustrations = useMemoizedLazyIllustrations(['SyncUsers']); const [isSkippedSectionExpanded, setIsSkippedSectionExpanded] = useState(false); + const [isVisible, setIsVisible] = useState(true); + const [providerDisplayName = ''] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, { + selector: (policy) => getConnectedHRProvider(policy)?.displayName ?? '', + }); const addedCount = result.addedEmployeesCount ?? 0; const removedCount = result.removedEmployeesCount ?? 0; const skippedCount = result.skippedEmployees?.length ?? 0; - const closeResultsModal = () => closeModal(); + + const hideModal = () => setIsVisible(false); const renderResultSummary = (label: string, count: number) => ( {label} - {translate('workspace.hr.gusto.syncResults.employeeCount', {count})} + {translate('workspace.hr.syncResults.employeeCount', {count})} ); return ( @@ -65,19 +77,19 @@ function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps) height={68} /> - {translate('workspace.hr.gusto.syncResults.successTitle')} - {renderResultSummary(translate('workspace.hr.gusto.syncResults.added'), addedCount)} - {renderResultSummary(translate('workspace.hr.gusto.syncResults.removed'), removedCount)} + {translate('workspace.hr.syncResults.successTitle', providerDisplayName)} + {renderResultSummary(translate('workspace.hr.syncResults.added'), addedCount)} + {renderResultSummary(translate('workspace.hr.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})} + {translate('workspace.hr.syncResults.skipped')} + {translate('workspace.hr.syncResults.employeeCount', {count: skippedCount})} @@ -109,4 +121,4 @@ function GustoSyncResultsModal({result, closeModal}: GustoSyncResultsModalProps) ); } -export default GustoSyncResultsModal; +export default HRSyncResultsModal; diff --git a/src/hooks/useGustoSyncResultsModal.ts b/src/hooks/useGustoSyncResultsModal.ts deleted file mode 100644 index 35d9fc61b134..000000000000 --- a/src/hooks/useGustoSyncResultsModal.ts +++ /dev/null @@ -1,45 +0,0 @@ -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 modal = useModal(); - 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 && - !!syncResult; - const didTransitionToJobDone = - 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; - } - - modal.showModal({ - component: GustoSyncResultsModal, - props: {result: syncResult}, - id: `gusto-sync-results-${policyID}`, - }); - }, [ - connectionSyncProgress?.connectionName, - connectionSyncProgress?.result, - connectionSyncProgress?.stageInProgress, - connectionSyncProgress?.timestamp, - isFocused, - policyID, - previousSyncProgress?.connectionName, - previousSyncProgress?.stageInProgress, - modal, - ]); -} - -export default useGustoSyncResultsModal; diff --git a/src/hooks/useHRSyncResultsModal.ts b/src/hooks/useHRSyncResultsModal.ts new file mode 100644 index 000000000000..8a45dff48a74 --- /dev/null +++ b/src/hooks/useHRSyncResultsModal.ts @@ -0,0 +1,51 @@ +import {useEffect} from 'react'; +import type {OnyxEntry} from 'react-native-onyx'; +import type {TupleToUnion} from 'type-fest'; +import HRSyncResultsModal from '@components/HRSyncResultsModal'; +import {useModal} from '@components/Modal/Global/ModalContext'; +import CONST from '@src/CONST'; +import type {PolicyConnectionSyncProgress} from '@src/types/onyx/Policy'; +import usePrevious from './usePrevious'; + +/** + * Watches an HR provider's sync progress and automatically opens the `HRSyncResultsModal` + * when the sync transitions to the `JOB_DONE` stage with a result payload. + */ +function useHRSyncResultsModal(policyID: string, connectionSyncProgress: OnyxEntry, isFocused: boolean) { + const modal = useModal(); + const previousSyncProgress = usePrevious(connectionSyncProgress); + + const connectionName = connectionSyncProgress?.connectionName; + + useEffect(() => { + const syncResult = connectionSyncProgress?.result; + const isHRSyncDoneWithResult = + CONST.POLICY.CONNECTIONS.HR_CONNECTION_NAMES.includes(connectionName as TupleToUnion) && + connectionSyncProgress?.stageInProgress === CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE && + !!syncResult; + const didTransitionToJobDone = previousSyncProgress?.connectionName === connectionName && previousSyncProgress?.stageInProgress !== CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.JOB_DONE; + const didHRSyncComplete = isFocused && isHRSyncDoneWithResult && didTransitionToJobDone; + + if (!didHRSyncComplete || !syncResult || !connectionName) { + return; + } + + modal.showModal({ + component: HRSyncResultsModal, + props: {result: syncResult, policyID}, + id: `${connectionName}-sync-results-${policyID}`, + }); + }, [ + connectionName, + connectionSyncProgress?.result, + connectionSyncProgress?.stageInProgress, + connectionSyncProgress?.timestamp, + isFocused, + policyID, + previousSyncProgress?.connectionName, + previousSyncProgress?.stageInProgress, + modal, + ]); +} + +export default useHRSyncResultsModal; diff --git a/src/languages/de.ts b/src/languages/de.ts index c77a6ba1bd60..1fa7829881b8 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -7189,19 +7189,19 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc } } }, + syncResults: { + title: (provider: string) => `${provider}-Synchronisierung abgeschlossen`, + successTitle: (provider: string) => `Ihre ${provider}-Verbindung wurde erfolgreich synchronisiert!`, + added: 'Hinzugefügt', + removed: 'Entfernt', + skipped: 'Übersprungen', + employeeCount: () => ({ + one: '1 Mitarbeiter', + other: (count: number) => `${count} Mitarbeitende`, + }), + }, gusto: { title: 'Gusto', - 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`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/en.ts b/src/languages/en.ts index 23d4be8a5b88..9b790669cd7b 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -6493,19 +6493,19 @@ const translations = { } } }, + syncResults: { + title: (provider: string) => `${provider} sync complete`, + successTitle: (provider: string) => `Successfully synced your ${provider} connection!`, + added: 'Added', + removed: 'Removed', + skipped: 'Skipped', + employeeCount: () => ({ + one: '1 employee', + other: (count: number) => `${count} employees`, + }), + }, gusto: { title: 'Gusto', - syncResults: { - title: 'Gusto sync results', - successTitle: 'Successfully synced your Gusto connection!', - added: 'Added', - removed: 'Removed', - skipped: 'Skipped', - employeeCount: () => ({ - one: '1 employee', - other: (count: number) => `${count} employees`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/es.ts b/src/languages/es.ts index cfcfe238925c..c4134f6b60c7 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -6306,19 +6306,19 @@ ${amount} para ${merchant} - ${date}`, } } }, + syncResults: { + title: (provider: string) => `Sincronización de ${provider} completada`, + successTitle: (provider: string) => `¡Se sincronizó correctamente tu conexión de ${provider}!`, + added: 'Añadido', + removed: 'Eliminado', + skipped: 'Omitido', + employeeCount: () => ({ + one: '1 empleado', + other: (count: number) => `${count} empleados`, + }), + }, gusto: { title: 'Gusto', - syncResults: { - 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`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index f217296b269d..1d793a5b61f2 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -7218,19 +7218,19 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e } } }, + syncResults: { + title: (provider: string) => `Synchronisation ${provider} terminée`, + successTitle: (provider: string) => `Connexion ${provider} synchronisée avec succès !`, + added: 'Ajouté', + removed: 'Supprimé', + skipped: 'Ignoré', + employeeCount: () => ({ + one: '1 employé', + other: (count: number) => `${count} employés`, + }), + }, gusto: { title: '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`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/it.ts b/src/languages/it.ts index 04714349e740..0f519070ca42 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -7176,19 +7176,19 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, } } }, + syncResults: { + title: (provider: string) => `Sincronizzazione ${provider} completata`, + successTitle: (provider: string) => `Connessione ${provider} sincronizzata correttamente!`, + added: 'Aggiunto', + removed: 'Rimosso', + skipped: 'Saltato', + employeeCount: () => ({ + one: '1 dipendente', + other: (count: number) => `${count} dipendenti`, + }), + }, gusto: { title: '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`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index c6ee83df7138..b68ea7fbc6a9 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -7095,19 +7095,19 @@ ${reportName} } } }, + syncResults: { + title: (provider: string) => `${provider} の同期が完了しました`, + successTitle: (provider: string) => `${provider} との接続が正常に同期されました!`, + added: '追加済み', + removed: '削除済み', + skipped: 'スキップ済み', + employeeCount: () => ({ + one: '1 従業員', + other: (count: number) => `${count} 従業員`, + }), + }, gusto: { title: 'Gusto', - syncResults: { - title: 'Gusto 同期結果', - successTitle: 'Gusto との連携が正常に同期されました!', - added: '追加済み', - removed: '削除済み', - skipped: 'スキップ済み', - employeeCount: () => ({ - one: '1 従業員', - other: (count: number) => `${count} 従業員`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 891386fd47b8..9cee24168e26 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -7151,19 +7151,19 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, } } }, + syncResults: { + title: (provider: string) => `Synchronisatie met ${provider} voltooid`, + successTitle: (provider: string) => `Je ${provider}-verbinding is succesvol gesynchroniseerd!`, + added: 'Toegevoegd', + removed: 'Verwijderd', + skipped: 'Overgeslagen', + employeeCount: () => ({ + one: '1 werknemer', + other: (count: number) => `${count} medewerkers`, + }), + }, gusto: { title: 'Gusto', - 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`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 91459e089731..df2b5e0eae25 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -7146,19 +7146,19 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, } } }, + syncResults: { + title: (provider: string) => `Synchronizacja z ${provider} zakończona`, + successTitle: (provider: string) => `Pomyślnie zsynchronizowano twoje połączenie z ${provider}!`, + added: 'Dodano', + removed: 'Usunięto', + skipped: 'Pominięto', + employeeCount: () => ({ + one: '1 pracownik', + other: (count: number) => `${count} pracownicy`, + }), + }, gusto: { title: '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`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 535659f23f58..ddb23a1d5b55 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -7151,19 +7151,19 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, } } }, + syncResults: { + title: (provider: string) => `Sincronização com ${provider} concluída`, + successTitle: (provider: string) => `Conexão com ${provider} sincronizada com sucesso!`, + added: 'Adicionado', + removed: 'Removido', + skipped: 'Ignorado', + employeeCount: () => ({ + one: '1 funcionário', + other: (count: number) => `${count} funcionários`, + }), + }, gusto: { title: '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`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 3c9e8607e50e..e27cc801569b 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -6968,19 +6968,19 @@ ${reportName} } } }, + syncResults: { + title: (provider: string) => `${provider} 同步完成`, + successTitle: (provider: string) => `已成功同步您的 ${provider} 连接!`, + added: '已添加', + removed: '已移除', + skipped: '已跳过', + employeeCount: () => ({ + one: '1 员工', + other: (count: number) => `${count} 员工`, + }), + }, gusto: { title: 'Gusto', - syncResults: { - title: 'Gusto 同步结果', - successTitle: '已成功同步你的 Gusto 连接!', - added: '已添加', - removed: '已移除', - skipped: '已跳过', - employeeCount: () => ({ - one: '1 员工', - other: (count: number) => `${count} 员工`, - }), - }, }, zenefits: { title: 'TriNet', diff --git a/src/libs/API/GustoSyncResult.ts b/src/libs/API/GustoSyncResult.ts deleted file mode 100644 index 79c497f0fcc9..000000000000 --- a/src/libs/API/GustoSyncResult.ts +++ /dev/null @@ -1,13 +0,0 @@ -type GustoSyncSkippedEmployee = { - name: string; - id: string; - reason: string; -}; - -type GustoSyncResult = { - addedEmployeesCount?: number; - removedEmployeesCount?: number; - skippedEmployees?: GustoSyncSkippedEmployee[]; -}; - -export type {GustoSyncResult, GustoSyncSkippedEmployee}; diff --git a/src/libs/API/HrSyncResult.ts b/src/libs/API/HrSyncResult.ts new file mode 100644 index 000000000000..3795653ea647 --- /dev/null +++ b/src/libs/API/HrSyncResult.ts @@ -0,0 +1,23 @@ +type HrSyncSkippedEmployee = { + /** Full name of the employee */ + name: string; + + /** Unique identifier of the employee */ + id: string; + + /** Human-readable explanation of why the employee was skipped */ + reason: string; +}; + +type HrSyncResult = { + /** Number of employees added during the sync */ + addedEmployeesCount?: number; + + /** Number of employees removed during the sync */ + removedEmployeesCount?: number; + + /** Employees that were skipped during the sync */ + skippedEmployees?: HrSyncSkippedEmployee[]; +}; + +export type {HrSyncResult, HrSyncSkippedEmployee}; diff --git a/src/pages/workspace/WorkspaceMembersPage.tsx b/src/pages/workspace/WorkspaceMembersPage.tsx index d5fea3a0ad46..a961812e6f75 100644 --- a/src/pages/workspace/WorkspaceMembersPage.tsx +++ b/src/pages/workspace/WorkspaceMembersPage.tsx @@ -28,7 +28,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 useHRSyncResultsModal from '@hooks/useHRSyncResultsModal'; import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useMobileSelectionMode from '@hooks/useMobileSelectionMode'; @@ -617,7 +617,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers clearInviteDraft(route.params.policyID); }, [invitedEmailsToAccountIDsDraft, isFocused, accountIDs, prevAccountIDs, route.params.policyID]); - useGustoSyncResultsModal(policyID, connectionSyncProgress, isFocused); + useHRSyncResultsModal(policyID, connectionSyncProgress, isFocused); const headerMessage = useMemo(() => { if (isOfflineAndNoMemberDataAvailable) { diff --git a/src/pages/workspace/hr/WorkspaceHRPage.tsx b/src/pages/workspace/hr/WorkspaceHRPage.tsx index 41f750e55eca..55924cd2c35c 100644 --- a/src/pages/workspace/hr/WorkspaceHRPage.tsx +++ b/src/pages/workspace/hr/WorkspaceHRPage.tsx @@ -8,7 +8,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Section from '@components/Section'; import Text from '@components/Text'; -import useGustoSyncResultsModal from '@hooks/useGustoSyncResultsModal'; +import useHRSyncResultsModal from '@hooks/useHRSyncResultsModal'; import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; @@ -58,7 +58,7 @@ function WorkspaceHRPage({ openPolicyHRPage(policyID); }, [policyID]); - useGustoSyncResultsModal(policyID, connectionSyncProgress, isFocused); + useHRSyncResultsModal(policyID, connectionSyncProgress, isFocused); const cards = getHRCards({ policy, diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index cae582bc766f..6bfe2f4ba067 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -1,6 +1,6 @@ import type {CONST as COMMON_CONST} from 'expensify-common'; import type {ValueOf} from 'type-fest'; -import type {GustoSyncResult} from '@libs/API/GustoSyncResult'; +import type {HrSyncResult} from '@libs/API/HrSyncResult'; import type CONST from '@src/CONST'; import type {Country} from '@src/CONST'; import type {MergeHRProviderSlug} from '@src/CONST/MERGE_HR_PROVIDERS'; @@ -2372,7 +2372,7 @@ type PolicyConnectionSyncProgress = { timestamp: string; /** Optional result payload shown after a completed sync */ - result?: GustoSyncResult; + result?: HrSyncResult; }; export default Policy;