diff --git a/src/CONST.ts b/src/CONST.ts index 4ca9b45f13d..795c497e3d9 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -130,12 +130,24 @@ const onboardingEmployerOrSubmitMessage: OnboardingMessageType = { type OnboardingPurposeType = ValueOf; +type OnboardingCompanySizeType = ValueOf; + +type OnboardingAccountingType = ValueOf | null; + const onboardingInviteTypes = { IOU: 'iou', INVOICE: 'invoice', CHAT: 'chat', } as const; +const onboardingCompanySize = { + MICRO: '1-10', + SMALL: '11-50', + MEDIUM_SMALL: '51-100', + MEDIUM: '101-1000', + LARGE: '1001+', +} as const; + type OnboardingInviteType = ValueOf; type OnboardingTaskType = { @@ -4463,6 +4475,7 @@ const CONST = { ONBOARDING_CHOICES: {...onboardingChoices}, SELECTABLE_ONBOARDING_CHOICES: {...selectableOnboardingChoices}, ONBOARDING_INVITE_TYPES: {...onboardingInviteTypes}, + ONBOARDING_COMPANY_SIZE: {...onboardingCompanySize}, ACTIONABLE_TRACK_EXPENSE_WHISPER_MESSAGE: 'What would you like to do with this expense?', ONBOARDING_CONCIERGE: { [onboardingChoices.EMPLOYER]: @@ -5792,6 +5805,19 @@ type FeedbackSurveyOptionID = ValueOf; type CancellationType = ValueOf; -export type {Country, IOUAction, IOUType, RateAndUnit, OnboardingPurposeType, IOURequestType, SubscriptionType, FeedbackSurveyOptionID, CancellationType, OnboardingInviteType}; +export type { + Country, + IOUAction, + IOUType, + RateAndUnit, + OnboardingPurposeType, + OnboardingCompanySizeType, + IOURequestType, + SubscriptionType, + FeedbackSurveyOptionID, + CancellationType, + OnboardingInviteType, + OnboardingAccountingType, +}; export default CONST; diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 7fcb675dc19..79bf807a660 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -1,6 +1,6 @@ import type {ValueOf} from 'type-fest'; import type CONST from './CONST'; -import type {OnboardingPurposeType} from './CONST'; +import type {OnboardingCompanySizeType, OnboardingPurposeType} from './CONST'; import type * as FormTypes from './types/form'; import type * as OnyxTypes from './types/onyx'; import type Onboarding from './types/onyx/Onboarding'; @@ -335,6 +335,9 @@ const ONYXKEYS = { /** Onboarding policyID selected by the user during Onboarding flow */ ONBOARDING_POLICY_ID: 'onboardingPolicyID', + /** Onboarding company size selected by the user during Onboarding flow */ + ONBOARDING_COMPANY_SIZE: 'onboardingCompanySize', + /** Onboarding Purpose selected by the user during Onboarding flow */ ONBOARDING_ADMINS_CHAT_REPORT_ID: 'onboardingAdminsChatReportID', @@ -944,6 +947,7 @@ type OnyxValuesMapping = { [ONYXKEYS.MAX_CANVAS_HEIGHT]: number; [ONYXKEYS.MAX_CANVAS_WIDTH]: number; [ONYXKEYS.ONBOARDING_PURPOSE_SELECTED]: OnboardingPurposeType; + [ONYXKEYS.ONBOARDING_COMPANY_SIZE]: OnboardingCompanySizeType; [ONYXKEYS.ONBOARDING_ERROR_MESSAGE]: string; [ONYXKEYS.ONBOARDING_POLICY_ID]: string; [ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID]: string; diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 51d05870da2..ff9f08724ce 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1140,6 +1140,14 @@ const ROUTES = { route: 'onboarding/work', getRoute: (backTo?: string) => getUrlWithBackToParam(`onboarding/work`, backTo), }, + ONBOARDING_EMPLOYEES: { + route: 'onboarding/employees', + getRoute: (backTo?: string) => getUrlWithBackToParam(`onboarding/employees`, backTo), + }, + ONBOARDING_ACCOUNTING: { + route: 'onboarding/accounting', + getRoute: (backTo?: string) => getUrlWithBackToParam(`onboarding/accounting`, backTo), + }, ONBOARDING_PURPOSE: { route: 'onboarding/purpose', getRoute: (backTo?: string) => getUrlWithBackToParam(`onboarding/purpose`, backTo), diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 395f1c4d5fb..5f22c54cb4b 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -511,6 +511,8 @@ const SCREENS = { PERSONAL_DETAILS: 'Onboarding_Personal_Details', PURPOSE: 'Onboarding_Purpose', WORK: 'Onboarding_Work', + EMPLOYEES: 'Onboarding_Employees', + ACCOUNTING: 'Onboarding_Accounting', }, WELCOME_VIDEO: { diff --git a/src/components/ContextMenuItem.tsx b/src/components/ContextMenuItem.tsx index fe7be45e1b5..c57c10e2c2b 100644 --- a/src/components/ContextMenuItem.tsx +++ b/src/components/ContextMenuItem.tsx @@ -133,7 +133,7 @@ function ContextMenuItem( title={itemText} icon={itemIcon} onPress={triggerPressAndUpdateSuccess} - wrapperStyle={[styles.pr9, wrapperStyle]} + wrapperStyle={[styles.pr8, wrapperStyle]} success={!isThrottledButtonActive} description={description} descriptionTextStyle={styles.breakWord} diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index 197c64b99a2..165ceebd942 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -101,6 +101,7 @@ function BaseSelectionList( onLongPressRow, shouldShowTextInput = !!textInputLabel || !!textInputIconLeft, shouldShowListEmptyContent = true, + listItemWrapperStyle, }: BaseSelectionListProps, ref: ForwardedRef, ) { @@ -472,6 +473,7 @@ function BaseSelectionList( setFocusedIndex(normalizedIndex); }} shouldSyncFocus={!isTextInputFocusedRef.current} + wrapperStyle={listItemWrapperStyle} /> {item.footerContent && item.footerContent} diff --git a/src/components/SelectionList/RadioListItem.tsx b/src/components/SelectionList/RadioListItem.tsx index 067c2341ef6..1f0e174d474 100644 --- a/src/components/SelectionList/RadioListItem.tsx +++ b/src/components/SelectionList/RadioListItem.tsx @@ -21,6 +21,7 @@ function RadioListItem({ alternateTextNumberOfLines = 2, onFocus, shouldSyncFocus, + wrapperStyle, }: RadioListItemProps) { const styles = useThemeStyles(); const fullTitle = isMultilineSupported ? item.text?.trimStart() : item.text; @@ -31,7 +32,7 @@ function RadioListItem({ return ( = Partial & { /** Whether to show the empty list content */ shouldShowListEmptyContent?: boolean; + + /** The style is applied for the wrap component of list item */ + listItemWrapperStyle?: StyleProp; } & TRightHandSideComponent; type SelectionListHandle = { diff --git a/src/languages/en.ts b/src/languages/en.ts index 6a90b1f8302..58de144ab5d 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1709,6 +1709,19 @@ const translations = { [CONST.ONBOARDING_CHOICES.CHAT_SPLIT]: 'Chat and split expenses with friends', [CONST.ONBOARDING_CHOICES.LOOKING_AROUND]: 'Something else', }, + employees: { + title: 'How many employees do you have?', + [CONST.ONBOARDING_COMPANY_SIZE.MICRO]: '1-10 employees', + [CONST.ONBOARDING_COMPANY_SIZE.SMALL]: '11-50 employees', + [CONST.ONBOARDING_COMPANY_SIZE.MEDIUM_SMALL]: '51-100 employees', + [CONST.ONBOARDING_COMPANY_SIZE.MEDIUM]: '101-1,000 employees', + [CONST.ONBOARDING_COMPANY_SIZE.LARGE]: 'More than 1,000 employees', + }, + accounting: { + title: 'Do you use any accounting software?', + description: 'Connect your accounting software directly to Expensify', + noneOfAbove: 'None of the above', + }, error: { requiredFirstName: 'Please input your first name to continue.', }, diff --git a/src/languages/es.ts b/src/languages/es.ts index 8d8b33ca57d..434dc5db487 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1717,6 +1717,19 @@ const translations = { [CONST.ONBOARDING_CHOICES.CHAT_SPLIT]: 'Chatea y divide gastos con tus amigos', [CONST.ONBOARDING_CHOICES.LOOKING_AROUND]: 'Algo más', }, + employees: { + title: 'How many empleados do you have?', + [CONST.ONBOARDING_COMPANY_SIZE.MICRO]: '1-10 empleados', + [CONST.ONBOARDING_COMPANY_SIZE.SMALL]: '11-50 empleados', + [CONST.ONBOARDING_COMPANY_SIZE.MEDIUM_SMALL]: '51-100 empleados', + [CONST.ONBOARDING_COMPANY_SIZE.MEDIUM]: '101-1,000 empleados', + [CONST.ONBOARDING_COMPANY_SIZE.LARGE]: 'More than 1,000 empleados', + }, + accounting: { + title: 'Do you use any accounting software?', + description: 'Connect your accounting software directly to Expensify', + noneOfAbove: 'None of the above', + }, error: { requiredFirstName: 'Introduce tu nombre para continuar.', }, diff --git a/src/libs/API/parameters/CompleteGuidedSetupParams.ts b/src/libs/API/parameters/CompleteGuidedSetupParams.ts index 0b2c0b66ef0..1242b9285de 100644 --- a/src/libs/API/parameters/CompleteGuidedSetupParams.ts +++ b/src/libs/API/parameters/CompleteGuidedSetupParams.ts @@ -1,4 +1,4 @@ -import type {OnboardingPurposeType} from '@src/CONST'; +import type {OnboardingAccountingType, OnboardingCompanySizeType, OnboardingPurposeType} from '@src/CONST'; type CompleteGuidedSetupParams = { firstName: string; @@ -7,6 +7,8 @@ type CompleteGuidedSetupParams = { guidedSetupData: string; engagementChoice: OnboardingPurposeType; paymentSelected?: string; + companySize?: OnboardingCompanySizeType; + userReportedIntegration?: OnboardingAccountingType; }; export default CompleteGuidedSetupParams; diff --git a/src/libs/Navigation/AppNavigator/Navigators/OnboardingModalNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/OnboardingModalNavigator.tsx index 4eb1409f192..eb852eb6a10 100644 --- a/src/libs/Navigation/AppNavigator/Navigators/OnboardingModalNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/Navigators/OnboardingModalNavigator.tsx @@ -12,6 +12,8 @@ import OnboardingModalNavigatorScreenOptions from '@libs/Navigation/AppNavigator import Navigation from '@libs/Navigation/Navigation'; import type {OnboardingModalNavigatorParamList} from '@libs/Navigation/types'; import OnboardingRefManager from '@libs/OnboardingRefManager'; +import OnboardingAccounting from '@pages/OnboardingAccounting'; +import OnboardingEmployees from '@pages/OnboardingEmployees'; import OnboardingPersonalDetails from '@pages/OnboardingPersonalDetails'; import OnboardingPurpose from '@pages/OnboardingPurpose'; import OnboardingWork from '@pages/OnboardingWork'; @@ -87,6 +89,14 @@ function OnboardingModalNavigator() { name={SCREENS.ONBOARDING.WORK} component={OnboardingWork} /> + + diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 319ec60d143..9b424db52f1 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -123,6 +123,14 @@ const config: LinkingOptions['config'] = { path: ROUTES.ONBOARDING_WORK.route, exact: true, }, + [SCREENS.ONBOARDING.EMPLOYEES]: { + path: ROUTES.ONBOARDING_EMPLOYEES.route, + exact: true, + }, + [SCREENS.ONBOARDING.ACCOUNTING]: { + path: ROUTES.ONBOARDING_ACCOUNTING.route, + exact: true, + }, }, }, [NAVIGATORS.RIGHT_MODAL_NAVIGATOR]: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 39053de521d..15823232819 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1382,6 +1382,12 @@ type OnboardingModalNavigatorParamList = { [SCREENS.ONBOARDING.WORK]: { backTo?: string; }; + [SCREENS.ONBOARDING.EMPLOYEES]: { + backTo?: string; + }; + [SCREENS.ONBOARDING.ACCOUNTING]: { + backTo?: string; + }; }; type WelcomeVideoModalNavigatorParamList = { diff --git a/src/libs/NavigationUtils.ts b/src/libs/NavigationUtils.ts index ea1710b9931..f4ce80ac3a4 100644 --- a/src/libs/NavigationUtils.ts +++ b/src/libs/NavigationUtils.ts @@ -17,7 +17,14 @@ const CENTRAL_PANE_SCREEN_NAMES = new Set([ SCREENS.REPORT, ]); -const ONBOARDING_SCREEN_NAMES = new Set([SCREENS.ONBOARDING.PERSONAL_DETAILS, SCREENS.ONBOARDING.PURPOSE, SCREENS.ONBOARDING.WORK, SCREENS.ONBOARDING_MODAL.ONBOARDING]); +const ONBOARDING_SCREEN_NAMES = new Set([ + SCREENS.ONBOARDING.PERSONAL_DETAILS, + SCREENS.ONBOARDING.PURPOSE, + SCREENS.ONBOARDING.WORK, + SCREENS.ONBOARDING_MODAL.ONBOARDING, + SCREENS.ONBOARDING.EMPLOYEES, + SCREENS.ONBOARDING.ACCOUNTING, +]); const removePolicyIDParamFromState = (state: State) => { const stateCopy = cloneDeep(state); diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index bc553ea86d7..37a12bb068b 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -7542,15 +7542,7 @@ function completePaymentOnboarding(paymentSelected: ValueOf, full = true) { diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index e53cac804b9..f60a9f60fd7 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -81,7 +81,7 @@ import {doesReportBelongToWorkspace} from '@libs/ReportUtils'; import shouldSkipDeepLinkNavigation from '@libs/shouldSkipDeepLinkNavigation'; import Visibility from '@libs/Visibility'; import CONFIG from '@src/CONFIG'; -import type {OnboardingPurposeType} from '@src/CONST'; +import type {OnboardingAccountingType, OnboardingCompanySizeType, OnboardingPurposeType} from '@src/CONST'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Route} from '@src/ROUTES'; @@ -3321,16 +3321,13 @@ function getReportPrivateNote(reportID: string | undefined) { function completeOnboarding( engagementChoice: OnboardingPurposeType, data: ValueOf, - { - firstName, - lastName, - }: { - firstName: string; - lastName: string; - }, + firstName = '', + lastName = '', adminsChatReportID?: string, onboardingPolicyID?: string, paymentSelected?: string, + companySize?: OnboardingCompanySizeType, + userReportedIntegration?: OnboardingAccountingType, ) { const actorAccountID = CONST.ACCOUNT_ID.CONCIERGE; const targetChatReport = ReportUtils.getChatByParticipants([actorAccountID, currentUserAccountID]); @@ -3633,6 +3630,38 @@ function completeOnboarding( }, ); + if (userReportedIntegration) { + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${onboardingPolicyID}`, + value: { + areConnectionsEnabled: true, + pendingFields: { + areConnectionsEnabled: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + }, + }); + successData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${onboardingPolicyID}`, + value: { + pendingFields: { + areConnectionsEnabled: null, + }, + }, + }); + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${onboardingPolicyID}`, + value: { + areConnectionsEnabled: false, + pendingFields: { + areConnectionsEnabled: null, + }, + }, + }); + } + const guidedSetupData: GuidedSetupData = [ {type: 'message', ...introductionMessage}, {type: 'message', ...textMessage}, @@ -3677,6 +3706,8 @@ function completeOnboarding( actorAccountID, guidedSetupData: JSON.stringify(guidedSetupData), paymentSelected, + companySize, + userReportedIntegration, }; API.write(WRITE_COMMANDS.COMPLETE_GUIDED_SETUP, parameters, {optimisticData, successData, failureData}); diff --git a/src/libs/actions/Welcome/OnboardingFlow.ts b/src/libs/actions/Welcome/OnboardingFlow.ts index 4e780090299..d58dc151add 100644 --- a/src/libs/actions/Welcome/OnboardingFlow.ts +++ b/src/libs/actions/Welcome/OnboardingFlow.ts @@ -52,7 +52,7 @@ function adaptOnboardingRouteState() { } let adaptedOnboardingModalNavigatorState = {} as Readonly>; - if (currentRoute?.name === SCREENS.ONBOARDING.PERSONAL_DETAILS && selectedPurpose === CONST.ONBOARDING_CHOICES.MANAGE_TEAM) { + if (currentRoute?.name === SCREENS.ONBOARDING.ACCOUNTING && selectedPurpose === CONST.ONBOARDING_CHOICES.MANAGE_TEAM) { adaptedOnboardingModalNavigatorState = { index: 2, routes: [ @@ -61,7 +61,7 @@ function adaptOnboardingRouteState() { params: currentRoute?.params, }, { - name: SCREENS.ONBOARDING.WORK, + name: SCREENS.ONBOARDING.EMPLOYEES, params: currentRoute?.params, }, {...currentRoute}, diff --git a/src/libs/actions/Welcome/index.ts b/src/libs/actions/Welcome/index.ts index 75529a87910..f1a8f28314b 100644 --- a/src/libs/actions/Welcome/index.ts +++ b/src/libs/actions/Welcome/index.ts @@ -6,7 +6,7 @@ import {SIDE_EFFECT_REQUEST_COMMANDS} from '@libs/API/types'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; import variables from '@styles/variables'; -import type {OnboardingPurposeType} from '@src/CONST'; +import type {OnboardingCompanySizeType, OnboardingPurposeType} from '@src/CONST'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -146,6 +146,10 @@ function setOnboardingPurposeSelected(value: OnboardingPurposeType) { Onyx.set(ONYXKEYS.ONBOARDING_PURPOSE_SELECTED, value ?? null); } +function setOnboardingCompanySize(value: OnboardingCompanySizeType) { + Onyx.set(ONYXKEYS.ONBOARDING_COMPANY_SIZE, value); +} + function setOnboardingErrorMessage(value: string) { Onyx.set(ONYXKEYS.ONBOARDING_ERROR_MESSAGE, value ?? null); } @@ -247,4 +251,5 @@ export { completeHybridAppOnboarding, handleHybridAppOnboarding, setOnboardingErrorMessage, + setOnboardingCompanySize, }; diff --git a/src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx b/src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx new file mode 100644 index 00000000000..46ff3834114 --- /dev/null +++ b/src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx @@ -0,0 +1,191 @@ +import React, {useMemo, useState} from 'react'; +import {View} from 'react-native'; +import {useOnyx} from 'react-native-onyx'; +import Button from '@components/Button'; +import FormHelpMessage from '@components/FormHelpMessage'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import Icon from '@components/Icon'; +import * as Expensicons from '@components/Icon/Expensicons'; +import OfflineIndicator from '@components/OfflineIndicator'; +import ScreenWrapper from '@components/ScreenWrapper'; +import SelectionList from '@components/SelectionList'; +import RadioListItem from '@components/SelectionList/RadioListItem'; +import type {ListItem} from '@components/SelectionList/types'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useResponsiveLayout from '@hooks/useResponsiveLayout'; +import useStyleUtils from '@hooks/useStyleUtils'; +import useTheme from '@hooks/useTheme'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@libs/Navigation/Navigation'; +import variables from '@styles/variables'; +import * as Report from '@userActions/Report'; +import * as Welcome from '@userActions/Welcome'; +import * as OnboardingFlow from '@userActions/Welcome/OnboardingFlow'; +import CONST from '@src/CONST'; +import type {OnboardingAccountingType} from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type {} from '@src/types/onyx/Bank'; +import type {BaseOnboardingAccountingProps} from './types'; + +type OnboardingListItem = ListItem & { + keyForList: OnboardingAccountingType; +}; + +function BaseOnboardingAccounting({shouldUseNativeStyles, route}: BaseOnboardingAccountingProps) { + const styles = useThemeStyles(); + const theme = useTheme(); + const StyleUtils = useStyleUtils(); + const {translate} = useLocalize(); + const {onboardingIsMediumOrLargerScreenWidth, shouldUseNarrowLayout} = useResponsiveLayout(); + const [onboardingPurposeSelected] = useOnyx(ONYXKEYS.ONBOARDING_PURPOSE_SELECTED); + const [onboardingPolicyID] = useOnyx(ONYXKEYS.ONBOARDING_POLICY_ID); + const [onboardingAdminsChatReportID] = useOnyx(ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID); + const [onboardingCompanySize] = useOnyx(ONYXKEYS.ONBOARDING_COMPANY_SIZE); + + const [userReportedIntegration, setUserReportedIntegration] = useState(undefined); + const [error, setError] = useState(''); + + const accountingOptions: OnboardingListItem[] = useMemo(() => { + const policyAccountingOptions = Object.values(CONST.POLICY.CONNECTIONS.NAME).map((connectionName): OnboardingListItem => { + let text; + let accountingIcon; + switch (connectionName) { + case CONST.POLICY.CONNECTIONS.NAME.QBO: { + text = translate('workspace.accounting.qbo'); + accountingIcon = Expensicons.QBOCircle; + break; + } + case CONST.POLICY.CONNECTIONS.NAME.XERO: { + text = translate('workspace.accounting.xero'); + accountingIcon = Expensicons.XeroCircle; + break; + } + case CONST.POLICY.CONNECTIONS.NAME.NETSUITE: { + text = translate('workspace.accounting.netsuite'); + accountingIcon = Expensicons.NetSuiteSquare; + break; + } + default: { + text = translate('workspace.accounting.intacct'); + accountingIcon = Expensicons.IntacctSquare; + break; + } + } + return { + keyForList: connectionName, + text, + leftElement: ( + + ), + isSelected: userReportedIntegration === connectionName, + }; + }); + const noneAccountingOption: OnboardingListItem = { + keyForList: null, + text: translate('onboarding.accounting.noneOfAbove'), + leftElement: ( + + ), + isSelected: userReportedIntegration === null, + }; + return [...policyAccountingOptions, noneAccountingOption]; + }, [StyleUtils, styles.mr3, styles.onboardingSmallIcon, theme.success, translate, userReportedIntegration]); + + const footerContent = ( + <> + {!!error && ( + + )} +