diff --git a/src/languages/en.ts b/src/languages/en.ts index 962bc00a2e86..84f368dd6df7 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2194,6 +2194,8 @@ export default { return 'Checking QuickBooks Online connection'; case 'quickbooksOnlineImportMain': return 'Importing your QuickBooks Online data'; + case 'startingImport': + return 'Importing your QuickBooks Online data'; default: { return `Translation missing for stage: ${stage}`; } diff --git a/src/languages/es.ts b/src/languages/es.ts index da61506f9a70..f3aedb75690d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2189,6 +2189,8 @@ export default { return 'Revisando conexión a QuickBooks Online'; case 'quickbooksOnlineImportMain': return 'Importando datos desde QuickBooks Online'; + case 'startingImport': + return 'Importando datos desde QuickBooks Online'; default: { return `Translation missing for stage: ${stage}`; } diff --git a/src/libs/API/parameters/SyncPolicyToQuickbooksOnlineParams.ts b/src/libs/API/parameters/SyncPolicyToQuickbooksOnlineParams.ts new file mode 100644 index 000000000000..b5782c150b9f --- /dev/null +++ b/src/libs/API/parameters/SyncPolicyToQuickbooksOnlineParams.ts @@ -0,0 +1,6 @@ +type SyncPolicyToQuickbooksOnlineParams = { + policyID: string; + idempotencyKey: string; +}; + +export default SyncPolicyToQuickbooksOnlineParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 2d7948076548..d7af1fadee2d 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -12,6 +12,7 @@ export type {default as BeginSignInParams} from './BeginSignInParams'; export type {default as CloseAccountParams} from './CloseAccountParams'; export type {default as ConnectBankAccountParams} from './ConnectBankAccountParams'; export type {default as ConnectPolicyToQuickbooksOnlineParams} from './ConnectPolicyToQuickbooksOnlineParams'; +export type {default as SyncPolicyToQuickbooksOnlineParams} from './SyncPolicyToQuickbooksOnlineParams'; export type {default as DeleteContactMethodParams} from './DeleteContactMethodParams'; export type {default as DeletePaymentBankAccountParams} from './DeletePaymentBankAccountParams'; export type {default as DeletePaymentCardParams} from './DeletePaymentCardParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 572c1eac76d3..7bb012ef8cd9 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -428,6 +428,7 @@ type WriteCommandParameters = { const READ_COMMANDS = { CONNECT_POLICY_TO_QUICKBOOKS_ONLINE: 'ConnectPolicyToQuickbooksOnline', + SYNC_POLICY_TO_QUICKBOOKS_ONLINE: 'SyncPolicyToQuickbooksOnline', OPEN_REIMBURSEMENT_ACCOUNT_PAGE: 'OpenReimbursementAccountPage', OPEN_WORKSPACE_VIEW: 'OpenWorkspaceView', GET_MAPBOX_ACCESS_TOKEN: 'GetMapboxAccessToken', @@ -471,6 +472,7 @@ type ReadCommand = ValueOf; type ReadCommandParameters = { [READ_COMMANDS.CONNECT_POLICY_TO_QUICKBOOKS_ONLINE]: Parameters.ConnectPolicyToQuickbooksOnlineParams; + [READ_COMMANDS.SYNC_POLICY_TO_QUICKBOOKS_ONLINE]: Parameters.SyncPolicyToQuickbooksOnlineParams; [READ_COMMANDS.OPEN_REIMBURSEMENT_ACCOUNT_PAGE]: Parameters.OpenReimbursementAccountPageParams; [READ_COMMANDS.OPEN_WORKSPACE_VIEW]: Parameters.OpenWorkspaceViewParams; [READ_COMMANDS.GET_MAPBOX_ACCESS_TOKEN]: EmptyObject; diff --git a/src/libs/actions/connections/QuickBooksOnline.ts b/src/libs/actions/connections/QuickBooksOnline.ts index a774aced0112..0486f5ea14db 100644 --- a/src/libs/actions/connections/QuickBooksOnline.ts +++ b/src/libs/actions/connections/QuickBooksOnline.ts @@ -1,6 +1,11 @@ -import type {ConnectPolicyToQuickbooksOnlineParams} from '@libs/API/parameters'; +import type {OnyxUpdate} from 'react-native-onyx'; +import Onyx from 'react-native-onyx'; +import * as API from '@libs/API'; +import type {ConnectPolicyToQuickbooksOnlineParams, SyncPolicyToQuickbooksOnlineParams} from '@libs/API/parameters'; import {READ_COMMANDS} from '@libs/API/types'; import {getCommandURL} from '@libs/ApiUtils'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; function getQuickBooksOnlineSetupLink(policyID: string) { const params: ConnectPolicyToQuickbooksOnlineParams = {policyID}; @@ -8,6 +13,29 @@ function getQuickBooksOnlineSetupLink(policyID: string) { return commandURL + new URLSearchParams(params).toString(); } -// More action functions will be added later -// eslint-disable-next-line import/prefer-default-export -export {getQuickBooksOnlineSetupLink}; +function syncConnection(policyID: string) { + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policyID}`, + value: { + stageInProgress: CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.STARTING_IMPORT, + connectionName: CONST.POLICY.CONNECTIONS.NAME.QBO, + }, + }, + ]; + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policyID}`, + value: null, + }, + ]; + const parameters: SyncPolicyToQuickbooksOnlineParams = { + policyID, + idempotencyKey: policyID, + }; + API.read(READ_COMMANDS.SYNC_POLICY_TO_QUICKBOOKS_ONLINE, parameters, {optimisticData, failureData}); +} + +export {getQuickBooksOnlineSetupLink, syncConnection}; diff --git a/src/pages/workspace/accounting/PolicyAccountingPage.tsx b/src/pages/workspace/accounting/PolicyAccountingPage.tsx index 773339cbf0d1..00b65f871fc8 100644 --- a/src/pages/workspace/accounting/PolicyAccountingPage.tsx +++ b/src/pages/workspace/accounting/PolicyAccountingPage.tsx @@ -15,10 +15,12 @@ import Section from '@components/Section'; import ThreeDotsMenu from '@components/ThreeDotsMenu'; import type ThreeDotsMenuProps from '@components/ThreeDotsMenu/types'; import useLocalize from '@hooks/useLocalize'; +import useNetwork from '@hooks/useNetwork'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import {removePolicyConnection} from '@libs/actions/connections'; +import {syncConnection} from '@libs/actions/connections/QuickBooksOnline'; import Navigation from '@navigation/Navigation'; import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; import FeatureEnabledAccessOrNotFoundWrapper from '@pages/workspace/FeatureEnabledAccessOrNotFoundWrapper'; @@ -45,6 +47,7 @@ function PolicyAccountingPage({policy, connectionSyncProgress}: PolicyAccounting const theme = useTheme(); const styles = useThemeStyles(); const {translate} = useLocalize(); + const {isOffline} = useNetwork(); const {isSmallScreenWidth, windowWidth} = useWindowDimensions(); const [threeDotsMenuPosition, setThreeDotsMenuPosition] = useState({horizontal: 0, vertical: 0}); const [isDisconnectModalOpen, setIsDisconnectModalOpen] = useState(false); @@ -58,7 +61,8 @@ function PolicyAccountingPage({policy, connectionSyncProgress}: PolicyAccounting { icon: Expensicons.Sync, text: translate('workspace.accounting.syncNow'), - onSelected: () => {}, + onSelected: () => syncConnection(policyID), + disabled: isOffline, }, { icon: Expensicons.Trashcan, @@ -66,7 +70,7 @@ function PolicyAccountingPage({policy, connectionSyncProgress}: PolicyAccounting onSelected: () => setIsDisconnectModalOpen(true), }, ], - [translate], + [translate, policyID, isOffline], ); const menuItems: MenuItemProps[] = useMemo(() => {