diff --git a/src/CONST.ts b/src/CONST.ts
index 14adbe9e7b7d1..b4182fc3d3ea9 100755
--- a/src/CONST.ts
+++ b/src/CONST.ts
@@ -113,12 +113,13 @@ const signupQualifiers = {
SMB: 'smb',
} as const;
-const selfGuidedTourTask: OnboardingTask = {
+const getTestDriveTaskName = (testDriveURL?: string) => (testDriveURL ? `Take a [test drive](${testDriveURL})` : 'Take a test drive');
+const testDriveTask: OnboardingTask = {
type: 'viewTour',
autoCompleted: false,
mediaAttributes: {},
- title: ({navatticURL}) => `Take a [2-minute tour](${navatticURL})`,
- description: ({navatticURL}) => `[Take a self-guided product tour](${navatticURL}) and learn about everything Expensify has to offer.`,
+ title: ({testDriveURL}) => getTestDriveTaskName(testDriveURL),
+ description: ({testDriveURL}) => `[Take a quick product tour](${testDriveURL}) to see why Expensify is the fastest way to do your expenses.`,
};
const createWorkspaceTask: OnboardingTask = {
@@ -164,7 +165,7 @@ const setupCategoriesTask: OnboardingTask = {
const onboardingEmployerOrSubmitMessage: OnboardingMessage = {
message: 'Getting paid back is as easy as sending a message. Let’s go over the basics.',
tasks: [
- selfGuidedTourTask,
+ testDriveTask,
{
type: 'submitExpense',
autoCompleted: false,
@@ -188,7 +189,7 @@ const onboardingEmployerOrSubmitMessage: OnboardingMessage = {
const combinedTrackSubmitOnboardingEmployerOrSubmitMessage: OnboardingMessage = {
...onboardingEmployerOrSubmitMessage,
tasks: [
- selfGuidedTourTask,
+ testDriveTask,
{
type: 'submitExpense',
autoCompleted: false,
@@ -213,7 +214,7 @@ const combinedTrackSubmitOnboardingEmployerOrSubmitMessage: OnboardingMessage =
const onboardingPersonalSpendMessage: OnboardingMessage = {
message: 'Here’s how to track your spend in a few clicks.',
tasks: [
- selfGuidedTourTask,
+ testDriveTask,
{
type: 'trackExpense',
autoCompleted: false,
@@ -237,7 +238,7 @@ const onboardingPersonalSpendMessage: OnboardingMessage = {
const combinedTrackSubmitOnboardingPersonalSpendMessage: OnboardingMessage = {
...onboardingPersonalSpendMessage,
tasks: [
- selfGuidedTourTask,
+ testDriveTask,
{
type: 'trackExpense',
autoCompleted: false,
@@ -289,6 +290,7 @@ type OnboardingTaskLinks = Partial<{
workspaceMembersLink: string;
workspaceAccountingLink: string;
navatticURL: string;
+ testDriveURL: string;
}>;
type OnboardingTask = {
@@ -1094,6 +1096,12 @@ const CONST = {
EMPLOYEE_TOUR_STAGING: 'https://expensify.navattic.com/cf15002s',
COMPLETED: 'completed',
},
+ STORYLANE: {
+ ADMIN_TOUR_PRODUCTION: 'https://app.storylane.io/demo/nrkhnm80nbix?embed=inline',
+ ADMIN_TOUR_MOBILE_PRODUCTION: 'https://app.storylane.io/demo/wg7a9qqg6qkf?embed=inline',
+ ADMIN_TOUR_STAGING: 'https://app.storylane.io/demo/nrkhnm80nbix?embed=inline',
+ ADMIN_TOUR_MOBILE_STAGING: 'https://app.storylane.io/demo/wg7a9qqg6qkf?embed=inline',
+ },
OLD_DOT_PUBLIC_URLS: {
TERMS_URL: `${EXPENSIFY_URL}/terms`,
PRIVACY_URL: `${EXPENSIFY_URL}/privacy`,
@@ -1493,6 +1501,7 @@ const CONST = {
BOTTOM_DOCKED: 'bottom_docked',
POPOVER: 'popover',
RIGHT_DOCKED: 'right_docked',
+ FULLSCREEN: 'fullscreen',
},
ANCHOR_ORIGIN_VERTICAL: {
TOP: 'top',
@@ -5376,7 +5385,7 @@ const CONST = {
message: 'Here are some important tasks to help get your team’s expenses under control.',
tasks: [
createWorkspaceTask,
- selfGuidedTourTask,
+ testDriveTask,
{
type: 'setupCategoriesAndTags',
autoCompleted: false,
@@ -5510,7 +5519,7 @@ const CONST = {
[onboardingChoices.CHAT_SPLIT]: {
message: 'Splitting bills with friends is as easy as sending a message. Here’s how.',
tasks: [
- selfGuidedTourTask,
+ testDriveTask,
{
type: 'startChat',
autoCompleted: false,
@@ -6989,6 +6998,10 @@ const CONST = {
BILLING: {
TYPE_FAILED_2018: 'failed_2018',
},
+
+ TEST_DRIVE: {
+ ONBOARDING_TASK_NAME: getTestDriveTaskName(),
+ },
} as const;
type Country = keyof typeof CONST.ALL_COUNTRIES;
@@ -7008,6 +7021,7 @@ export type {
IOUType,
OnboardingPurpose,
OnboardingCompanySize,
+ OnboardingTaskLinks,
IOURequestType,
SubscriptionType,
FeedbackSurveyOptionID,
diff --git a/src/NAVIGATORS.ts b/src/NAVIGATORS.ts
index 0974bcf6904c7..178943ce056fc 100644
--- a/src/NAVIGATORS.ts
+++ b/src/NAVIGATORS.ts
@@ -12,6 +12,7 @@ export default {
EXPLANATION_MODAL_NAVIGATOR: 'ExplanationModalNavigator',
MIGRATED_USER_MODAL_NAVIGATOR: 'MigratedUserModalNavigator',
TEST_DRIVE_MODAL_NAVIGATOR: 'TestDriveModalNavigator',
+ TEST_DRIVE_DEMO_NAVIGATOR: 'TestDriveDemoNavigator',
REPORTS_SPLIT_NAVIGATOR: 'ReportsSplitNavigator',
SETTINGS_SPLIT_NAVIGATOR: 'SettingsSplitNavigator',
WORKSPACE_SPLIT_NAVIGATOR: 'WorkspaceSplitNavigator',
diff --git a/src/ROUTES.ts b/src/ROUTES.ts
index aa3ebeab3049a..04b0c132645b9 100644
--- a/src/ROUTES.ts
+++ b/src/ROUTES.ts
@@ -1894,6 +1894,7 @@ const ROUTES = {
WELCOME_VIDEO_ROOT: 'onboarding/welcome-video',
EXPLANATION_MODAL_ROOT: 'onboarding/explanation',
TEST_DRIVE_MODAL_ROOT: 'onboarding/test-drive',
+ TEST_DRIVE_DEMO_ROOT: 'onboarding/test-drive/demo',
WORKSPACE_CONFIRMATION: {
route: 'workspace/confirmation',
getRoute: (backTo?: string) => getUrlWithBackToParam(`workspace/confirmation`, backTo),
diff --git a/src/SCREENS.ts b/src/SCREENS.ts
index 751589eab1007..6e12ea0af4ae5 100644
--- a/src/SCREENS.ts
+++ b/src/SCREENS.ts
@@ -662,6 +662,10 @@ const SCREENS = {
ROOT: 'TestDrive_Modal_Root',
},
+ TEST_DRIVE_DEMO: {
+ ROOT: 'TestDrive_Demo_Root',
+ },
+
I_KNOW_A_TEACHER: 'I_Know_A_Teacher',
INTRO_SCHOOL_PRINCIPAL: 'Intro_School_Principal',
I_AM_A_TEACHER: 'I_Am_A_Teacher',
diff --git a/src/components/EmbeddedDemo/index.native.tsx b/src/components/EmbeddedDemo/index.native.tsx
new file mode 100644
index 0000000000000..82eca9bcc8af1
--- /dev/null
+++ b/src/components/EmbeddedDemo/index.native.tsx
@@ -0,0 +1,23 @@
+import React from 'react';
+import WebView from 'react-native-webview';
+import type EmbeddedDemoProps from './types';
+
+function EmbeddedDemo({url, webViewProps}: EmbeddedDemoProps) {
+ return (
+
+ );
+}
+
+EmbeddedDemo.displayName = 'EmbeddedDemo';
+
+export default EmbeddedDemo;
diff --git a/src/components/EmbeddedDemo/index.tsx b/src/components/EmbeddedDemo/index.tsx
new file mode 100644
index 0000000000000..0597bdbe12933
--- /dev/null
+++ b/src/components/EmbeddedDemo/index.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+import type EmbeddedDemoProps from './types';
+
+function EmbeddedDemo({url, iframeTitle, iframeProps}: EmbeddedDemoProps) {
+ return (
+
+ );
+}
+
+EmbeddedDemo.displayName = 'EmbeddedDemo';
+
+export default EmbeddedDemo;
diff --git a/src/components/EmbeddedDemo/types.ts b/src/components/EmbeddedDemo/types.ts
new file mode 100644
index 0000000000000..5624378c77ab0
--- /dev/null
+++ b/src/components/EmbeddedDemo/types.ts
@@ -0,0 +1,11 @@
+import type {DetailedHTMLProps, IframeHTMLAttributes} from 'react';
+import type {WebViewProps} from 'react-native-webview';
+
+type EmbeddedDemoProps = {
+ url: string;
+ iframeTitle?: string;
+ iframeProps?: DetailedHTMLProps, HTMLIFrameElement> & Record;
+ webViewProps?: WebViewProps;
+};
+
+export default EmbeddedDemoProps;
diff --git a/src/components/TestDrive/TestDriveBanner.tsx b/src/components/TestDrive/TestDriveBanner.tsx
new file mode 100644
index 0000000000000..cf70356bec034
--- /dev/null
+++ b/src/components/TestDrive/TestDriveBanner.tsx
@@ -0,0 +1,37 @@
+import React from 'react';
+import {View} from 'react-native';
+import Button from '@components/Button';
+import Text from '@components/Text';
+import useLocalize from '@hooks/useLocalize';
+import useResponsiveLayout from '@hooks/useResponsiveLayout';
+import useThemeStyles from '@hooks/useThemeStyles';
+
+type TestDriveBannerProps = {
+ onPress: () => void;
+};
+
+function TestDriveBanner({onPress}: TestDriveBannerProps) {
+ const styles = useThemeStyles();
+ const {shouldUseNarrowLayout} = useResponsiveLayout();
+ const {translate} = useLocalize();
+
+ return (
+
+
+ {shouldUseNarrowLayout
+ ? translate('testDrive.banner.currentlyTestDrivingExpensify')
+ : `${translate('testDrive.banner.currentlyTestDrivingExpensify')}. ${translate('testDrive.banner.readyForTheRealThing')}`}
+
+
+
+ );
+}
+
+TestDriveBanner.displayName = 'TestDriveBanner';
+
+export default TestDriveBanner;
diff --git a/src/components/TestDrive/TestDriveDemo.tsx b/src/components/TestDrive/TestDriveDemo.tsx
new file mode 100644
index 0000000000000..926ca22e05ba7
--- /dev/null
+++ b/src/components/TestDrive/TestDriveDemo.tsx
@@ -0,0 +1,61 @@
+import React, {useCallback, useEffect, useState} from 'react';
+import {InteractionManager} from 'react-native';
+import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
+import EmbeddedDemo from '@components/EmbeddedDemo';
+import Modal from '@components/Modal';
+import SafeAreaConsumer from '@components/SafeAreaConsumer';
+import useEnvironment from '@hooks/useEnvironment';
+import useResponsiveLayout from '@hooks/useResponsiveLayout';
+import {completeTestDriveTask} from '@libs/actions/Task';
+import Navigation from '@libs/Navigation/Navigation';
+import {getTestDriveURL} from '@libs/TourUtils';
+import CONST from '@src/CONST';
+import TestDriveBanner from './TestDriveBanner';
+
+function TestDriveDemo() {
+ const {environment} = useEnvironment();
+ const {shouldUseNarrowLayout} = useResponsiveLayout();
+ const [isVisible, setIsVisible] = useState(false);
+
+ useEffect(() => {
+ InteractionManager.runAfterInteractions(() => {
+ setIsVisible(true);
+ completeTestDriveTask();
+ });
+ }, []);
+
+ const closeModal = useCallback(() => {
+ setIsVisible(false);
+ InteractionManager.runAfterInteractions(() => {
+ Navigation.goBack();
+ });
+ }, []);
+
+ return (
+
+ {({paddingTop, paddingBottom}) => (
+
+
+
+
+
+
+ )}
+
+ );
+}
+
+TestDriveDemo.displayName = 'TestDriveDemo';
+
+export default TestDriveDemo;
diff --git a/src/components/TestDriveModal.tsx b/src/components/TestDriveModal.tsx
index 01aea30fd54bb..c4646bcaa852c 100644
--- a/src/components/TestDriveModal.tsx
+++ b/src/components/TestDriveModal.tsx
@@ -4,6 +4,7 @@ import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import Navigation from '@libs/Navigation/Navigation';
import CONST from '@src/CONST';
+import ROUTES from '@src/ROUTES';
import FeatureTrainingModal from './FeatureTrainingModal';
function TestDriveModal() {
@@ -14,7 +15,11 @@ function TestDriveModal() {
Navigation.dismissModal();
};
- const navigateTestDriveDemo = () => {};
+ const navigateTestDriveDemo = () => {
+ setTimeout(() => {
+ Navigation.navigate(ROUTES.TEST_DRIVE_DEMO_ROOT);
+ }, 1000);
+ };
return (
+
();
+
+function TestDriveDemoNavigator() {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+TestDriveDemoNavigator.displayName = 'TestDriveDemoNavigator';
+
+export default TestDriveDemoNavigator;
diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts
index c8478eeeeead1..88ff8b743943d 100644
--- a/src/libs/Navigation/linkingConfig/config.ts
+++ b/src/libs/Navigation/linkingConfig/config.ts
@@ -92,6 +92,15 @@ const config: LinkingOptions['config'] = {
},
},
+ [NAVIGATORS.TEST_DRIVE_DEMO_NAVIGATOR]: {
+ screens: {
+ [SCREENS.TEST_DRIVE_DEMO.ROOT]: {
+ path: ROUTES.TEST_DRIVE_DEMO_ROOT,
+ exact: true,
+ },
+ },
+ },
+
[NAVIGATORS.ONBOARDING_MODAL_NAVIGATOR]: {
// Don't set the initialRouteName, because when the user continues from the last visited onboarding page,
// the onboarding purpose page will be briefly visible.
diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts
index d200e1d6a5952..df8bdf76a3bd1 100644
--- a/src/libs/Navigation/types.ts
+++ b/src/libs/Navigation/types.ts
@@ -1782,6 +1782,10 @@ type TestDriveModalNavigatorParamList = {
[SCREENS.TEST_DRIVE_MODAL.ROOT]: undefined;
};
+type TestDriveDemoNavigatorParamList = {
+ [SCREENS.TEST_DRIVE_DEMO.ROOT]: undefined;
+};
+
type SharedScreensParamList = {
[NAVIGATORS.REPORTS_SPLIT_NAVIGATOR]: NavigatorScreenParams;
[SCREENS.TRANSITION_BETWEEN_APPS]: {
@@ -1864,6 +1868,7 @@ type AuthScreensParamList = SharedScreensParamList & {
[NAVIGATORS.EXPLANATION_MODAL_NAVIGATOR]: NavigatorScreenParams;
[NAVIGATORS.MIGRATED_USER_MODAL_NAVIGATOR]: NavigatorScreenParams;
[NAVIGATORS.TEST_DRIVE_MODAL_NAVIGATOR]: NavigatorScreenParams;
+ [NAVIGATORS.TEST_DRIVE_DEMO_NAVIGATOR]: NavigatorScreenParams;
[NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR]: NavigatorScreenParams;
[SCREENS.DESKTOP_SIGN_IN_REDIRECT]: undefined;
[SCREENS.TRANSACTION_RECEIPT]: {
@@ -2062,4 +2067,5 @@ export type {
TestDriveModalNavigatorParamList,
WorkspaceScreenName,
SettingsTabScreenName,
+ TestDriveDemoNavigatorParamList,
};
diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts
index 29c59b8dde5e5..5072fd64c65e3 100644
--- a/src/libs/ReportUtils.ts
+++ b/src/libs/ReportUtils.ts
@@ -23,7 +23,7 @@ import {FallbackAvatar, IntacctSquare, NetSuiteSquare, QBOSquare, XeroSquare} fr
import * as defaultGroupAvatars from '@components/Icon/GroupDefaultAvatars';
import * as defaultWorkspaceAvatars from '@components/Icon/WorkspaceDefaultAvatars';
import type {MoneyRequestAmountInputProps} from '@components/MoneyRequestAmountInput';
-import type {IOUAction, IOUType, OnboardingAccounting, OnboardingPurpose} from '@src/CONST';
+import type {IOUAction, IOUType, OnboardingAccounting, OnboardingPurpose, OnboardingTaskLinks} from '@src/CONST';
import CONST from '@src/CONST';
import type {ParentNavigationSummaryParams} from '@src/languages/params';
import type {TranslationPaths} from '@src/languages/types';
@@ -9572,13 +9572,14 @@ function prepareOnboardingOnyxData(
reportComment: textComment.commentText,
};
- const onboardingTaskParams = {
+ const onboardingTaskParams: OnboardingTaskLinks = {
integrationName,
workspaceSettingsLink: `${environmentURL}/${ROUTES.WORKSPACE_INITIAL.getRoute(onboardingPolicyID)}`,
workspaceCategoriesLink: `${environmentURL}/${ROUTES.WORKSPACE_CATEGORIES.getRoute(onboardingPolicyID)}`,
workspaceMembersLink: `${environmentURL}/${ROUTES.WORKSPACE_MEMBERS.getRoute(onboardingPolicyID)}`,
workspaceMoreFeaturesLink: `${environmentURL}/${ROUTES.WORKSPACE_MORE_FEATURES.getRoute(onboardingPolicyID)}`,
navatticURL: getNavatticURL(environment, engagementChoice),
+ testDriveURL: `${environmentURL}/${ROUTES.TEST_DRIVE_DEMO_ROOT}`,
workspaceAccountingLink: `${environmentURL}/${ROUTES.POLICY_ACCOUNTING.getRoute(onboardingPolicyID)}`,
};
diff --git a/src/libs/TourUtils.ts b/src/libs/TourUtils.ts
index 141ed6b23a2bc..372bdcd0d2567 100644
--- a/src/libs/TourUtils.ts
+++ b/src/libs/TourUtils.ts
@@ -8,7 +8,16 @@ function getNavatticURL(environment: ValueOf, introSel
return introSelected === CONST.SELECTABLE_ONBOARDING_CHOICES.MANAGE_TEAM ? adminTourURL : employeeTourURL;
}
+function getTestDriveURL(environment: ValueOf, shouldUseNarrowLayout: boolean) {
+ if (shouldUseNarrowLayout) {
+ return environment === CONST.ENVIRONMENT.PRODUCTION ? CONST.STORYLANE.ADMIN_TOUR_MOBILE_PRODUCTION : CONST.STORYLANE.ADMIN_TOUR_MOBILE_STAGING;
+ }
+
+ return environment === CONST.ENVIRONMENT.PRODUCTION ? CONST.STORYLANE.ADMIN_TOUR_PRODUCTION : CONST.STORYLANE.ADMIN_TOUR_STAGING;
+}
+
export {
// eslint-disable-next-line import/prefer-default-export
getNavatticURL,
+ getTestDriveURL,
};
diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts
index 27234703d04d0..bdc906e621960 100644
--- a/src/libs/actions/Task.ts
+++ b/src/libs/actions/Task.ts
@@ -1282,6 +1282,27 @@ function clearTaskErrors(reportID: string | undefined) {
});
}
+function completeTestDriveTask() {
+ const onboardingReport = ReportUtils.getChatUsedForOnboarding();
+ if (!onboardingReport) {
+ return;
+ }
+
+ const onboardingReportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${onboardingReport.reportID}`];
+ if (!onboardingReportActions) {
+ return;
+ }
+
+ const testDriveTaskParentReport = Object.values(onboardingReportActions).find(
+ (reportAction) => reportAction.childType === CONST.REPORT.TYPE.TASK && reportAction.childReportName === CONST.TEST_DRIVE.ONBOARDING_TASK_NAME,
+ );
+
+ const testDriveTaskReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${testDriveTaskParentReport?.childReportID}`];
+ if (testDriveTaskReport?.stateNum !== CONST.REPORT.STATE_NUM.APPROVED || testDriveTaskReport?.statusNum !== CONST.REPORT.STATUS_NUM.APPROVED) {
+ completeTask(testDriveTaskReport);
+ }
+}
+
export {
createTaskAndNavigate,
editTask,
@@ -1307,6 +1328,7 @@ export {
setNewOptimisticAssignee,
getNavigationUrlOnTaskDelete,
canActionTask,
+ completeTestDriveTask,
};
export type {PolicyValue, Assignee, ShareDestination};
diff --git a/src/libs/navigateAfterOnboarding.ts b/src/libs/navigateAfterOnboarding.ts
index e7e31a5933965..3990f54b5c9aa 100644
--- a/src/libs/navigateAfterOnboarding.ts
+++ b/src/libs/navigateAfterOnboarding.ts
@@ -1,9 +1,12 @@
+import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
+import type {OnboardingPurpose} from '@src/types/onyx';
import shouldOpenOnAdminRoom from './Navigation/helpers/shouldOpenOnAdminRoom';
import Navigation from './Navigation/Navigation';
import {findLastAccessedReport, isConciergeChatReport} from './ReportUtils';
const navigateAfterOnboarding = (
+ onboardingPurposeSelected: OnboardingPurpose,
isSmallScreenWidth: boolean,
canUseDefaultRooms: boolean | undefined,
onboardingPolicyID?: string,
@@ -13,6 +16,13 @@ const navigateAfterOnboarding = (
) => {
Navigation.dismissModal();
+ if (onboardingPurposeSelected === CONST.ONBOARDING_CHOICES.MANAGE_TEAM) {
+ setTimeout(() => {
+ Navigation.isNavigationReady().then(() => Navigation.navigate(ROUTES.TEST_DRIVE_MODAL_ROOT));
+ }, 0);
+ return;
+ }
+
// When hasCompletedGuidedSetupFlow is true, OnboardingModalNavigator in AuthScreen is removed from the navigation stack.
// On small screens, this removal redirects navigation to HOME. Dismissing the modal doesn't work properly,
// so we need to specifically navigate to the last accessed report.
diff --git a/src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx b/src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx
index 5987cf7737271..ef6aac8aa973a 100644
--- a/src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx
+++ b/src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx
@@ -186,6 +186,7 @@ function BaseOnboardingAccounting({shouldUseNativeStyles}: BaseOnboardingAccount
setOnboardingPolicyID();
});
navigateAfterOnboarding(
+ onboardingPurposeSelected,
isSmallScreenWidth,
canUseDefaultRooms,
onboardingPolicyID,
diff --git a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx
index 88d65bf76efb9..0a296b49366b2 100644
--- a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx
+++ b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx
@@ -70,7 +70,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat
setOnboardingAdminsChatReportID();
setOnboardingPolicyID();
- navigateAfterOnboarding(isSmallScreenWidth, canUseDefaultRooms, onboardingPolicyID, activeWorkspaceID);
+ navigateAfterOnboarding(onboardingPurposeSelected, isSmallScreenWidth, canUseDefaultRooms, onboardingPolicyID, activeWorkspaceID);
},
[onboardingPurposeSelected, onboardingAdminsChatReportID, onboardingPolicyID, activeWorkspaceID, canUseDefaultRooms, isSmallScreenWidth],
);
diff --git a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx
index 2137cccf9c868..3eaab08da5da6 100644
--- a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx
+++ b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx
@@ -58,7 +58,7 @@ function BaseOnboardingWorkspaces({shouldUseNativeStyles, route}: BaseOnboarding
setOnboardingAdminsChatReportID();
setOnboardingPolicyID(policyID);
- navigateAfterOnboarding(isSmallScreenWidth, canUseDefaultRooms, policyID, activeWorkspaceID);
+ navigateAfterOnboarding(CONST.ONBOARDING_CHOICES.LOOKING_AROUND, isSmallScreenWidth, canUseDefaultRooms, policyID, activeWorkspaceID);
},
[onboardingPersonalDetails?.firstName, onboardingPersonalDetails?.lastName, isSmallScreenWidth, canUseDefaultRooms, activeWorkspaceID],
);
diff --git a/src/styles/utils/generators/ModalStyleUtils.ts b/src/styles/utils/generators/ModalStyleUtils.ts
index fb1ba8779e637..061c57a204d12 100644
--- a/src/styles/utils/generators/ModalStyleUtils.ts
+++ b/src/styles/utils/generators/ModalStyleUtils.ts
@@ -64,6 +64,12 @@ const createModalStyleUtils: StyleUtilGenerator = ({the
let shouldAddTopSafeAreaPadding = false;
switch (type) {
+ case CONST.MODAL.MODAL_TYPE.FULLSCREEN:
+ modalContainerStyle = {};
+ swipeDirection = 'down';
+ animationIn = 'slideInUp';
+ animationOut = 'slideOutDown';
+ break;
case CONST.MODAL.MODAL_TYPE.CONFIRM:
// A confirm modal is one that has a visible backdrop
// and can be dismissed by clicking outside of the modal.
diff --git a/tests/unit/navigateAfterOnboardingTest.ts b/tests/unit/navigateAfterOnboardingTest.ts
index 97a233e87ce0c..f53e9d52eaab1 100644
--- a/tests/unit/navigateAfterOnboardingTest.ts
+++ b/tests/unit/navigateAfterOnboardingTest.ts
@@ -1,3 +1,4 @@
+import {waitFor} from '@testing-library/react-native';
import type {OnyxEntry} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import navigateAfterOnboarding from '@libs/navigateAfterOnboarding';
@@ -59,12 +60,12 @@ describe('navigateAfterOnboarding', () => {
const navigate = jest.spyOn(Navigation, 'navigate');
const testSession = {email: 'realaccount@gmail.com'};
- navigateAfterOnboarding(false, true, undefined, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+'));
+ navigateAfterOnboarding(CONST.ONBOARDING_CHOICES.LOOKING_AROUND, false, true, undefined, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+'));
expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(ONBOARDING_ADMINS_CHAT_REPORT_ID));
});
it('should not navigate if onboardingAdminsChatReportID is not provided', () => {
- navigateAfterOnboarding(false, true, undefined, undefined);
+ navigateAfterOnboarding(CONST.ONBOARDING_CHOICES.LOOKING_AROUND, false, true, undefined, undefined);
expect(Navigation.navigate).not.toHaveBeenCalled();
});
@@ -83,7 +84,7 @@ describe('navigateAfterOnboarding', () => {
mockFindLastAccessedReport.mockReturnValue(lastAccessedReport);
mockShouldOpenOnAdminRoom.mockReturnValue(false);
- navigateAfterOnboarding(true, true, ONBOARDING_POLICY_ID, ACTIVE_WORKSPACE_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID);
+ navigateAfterOnboarding(CONST.ONBOARDING_CHOICES.LOOKING_AROUND, true, true, ONBOARDING_POLICY_ID, ACTIVE_WORKSPACE_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID);
expect(navigate).not.toHaveBeenCalled();
});
@@ -92,7 +93,7 @@ describe('navigateAfterOnboarding', () => {
mockFindLastAccessedReport.mockReturnValue(lastAccessedReport);
mockShouldOpenOnAdminRoom.mockReturnValue(false);
- navigateAfterOnboarding(true, true, ONBOARDING_POLICY_ID, ACTIVE_WORKSPACE_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID);
+ navigateAfterOnboarding(CONST.ONBOARDING_CHOICES.LOOKING_AROUND, true, true, ONBOARDING_POLICY_ID, ACTIVE_WORKSPACE_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID);
expect(Navigation.navigate).not.toHaveBeenCalled();
});
@@ -102,7 +103,7 @@ describe('navigateAfterOnboarding', () => {
mockFindLastAccessedReport.mockReturnValue(lastAccessedReport);
mockShouldOpenOnAdminRoom.mockReturnValue(true);
- navigateAfterOnboarding(true, true, ONBOARDING_POLICY_ID, ACTIVE_WORKSPACE_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID);
+ navigateAfterOnboarding(CONST.ONBOARDING_CHOICES.LOOKING_AROUND, true, true, ONBOARDING_POLICY_ID, ACTIVE_WORKSPACE_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID);
expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID));
});
@@ -113,7 +114,23 @@ describe('navigateAfterOnboarding', () => {
mockShouldOpenOnAdminRoom.mockReturnValue(true);
const testSession = {email: 'test+account@gmail.com'};
- navigateAfterOnboarding(true, true, ONBOARDING_POLICY_ID, ACTIVE_WORKSPACE_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+'));
+ navigateAfterOnboarding(
+ CONST.ONBOARDING_CHOICES.LOOKING_AROUND,
+ true,
+ true,
+ ONBOARDING_POLICY_ID,
+ ACTIVE_WORKSPACE_ID,
+ ONBOARDING_ADMINS_CHAT_REPORT_ID,
+ (testSession?.email ?? '').includes('+'),
+ );
expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID));
});
+
+ it('should navigate to Test Drive Modal if user wants to manage a small team', async () => {
+ const navigate = jest.spyOn(Navigation, 'navigate');
+ jest.spyOn(Navigation, 'isNavigationReady').mockReturnValue(Promise.resolve());
+
+ navigateAfterOnboarding(CONST.ONBOARDING_CHOICES.MANAGE_TEAM, true, true);
+ await waitFor(() => expect(navigate).toHaveBeenCalledWith(ROUTES.TEST_DRIVE_MODAL_ROOT));
+ });
});