Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add full screen engagement modal to NewDot #32154

Merged
merged 108 commits into from
Jan 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
71aaa5a
Create new component
stitesExpensify Nov 28, 2023
38f9c59
Fix imports
stitesExpensify Nov 28, 2023
d387417
Fix header
stitesExpensify Nov 28, 2023
94aa8f8
Add english copy and fix key errors
stitesExpensify Nov 28, 2023
01629a2
Switch to IllustratedHeaderPageLayout
stitesExpensify Nov 28, 2023
96dc71e
Use text instead of the header component for better styling
stitesExpensify Nov 28, 2023
2e6ab73
Fix imports
stitesExpensify Nov 28, 2023
39b3593
Change illustration
stitesExpensify Nov 28, 2023
2c21559
add scan asset and update row
stitesExpensify Nov 29, 2023
cc9aead
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Nov 29, 2023
7f32222
ReplaceillustratedHeaderPageLayout with views to make it work on mobile
stitesExpensify Dec 4, 2023
1d2ff01
Add new method for completing engagement modal
stitesExpensify Dec 5, 2023
5fb78b8
Add new nvp keys and add to the optimistic data
stitesExpensify Dec 5, 2023
877efb9
Add copy that concierge will send
stitesExpensify Dec 5, 2023
5f921af
Update copy and send message
stitesExpensify Dec 5, 2023
cfad7cc
Aso close the modal when submitting an option
stitesExpensify Dec 5, 2023
0ef6e32
Re-order elements, add overlay param, and rename poorly named prop
stitesExpensify Dec 5, 2023
d31d697
Add padding and remove unnecessary view
stitesExpensify Dec 5, 2023
6ac457b
Fix copy
stitesExpensify Dec 6, 2023
91120f9
Always get the conciergeChatReport because sometimes it won't be set
stitesExpensify Dec 6, 2023
0def96f
Fix coloring
stitesExpensify Dec 6, 2023
e5ef2b4
Fix x color
stitesExpensify Dec 6, 2023
9e49cee
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Dec 6, 2023
73fb919
Lint
stitesExpensify Dec 6, 2023
01ce5e3
fix background color after merge
stitesExpensify Dec 6, 2023
e8296c4
add modal to set dismissed NVP
stitesExpensify Dec 6, 2023
60c13dc
Use the concierge accountID so that the message comes from them
stitesExpensify Dec 6, 2023
6855f21
Remove auto-show for create menu
stitesExpensify Dec 7, 2023
bb36f6e
Move the engagement modal to the sidebarScreen so that it is in the s…
stitesExpensify Dec 7, 2023
f7dcb5e
Update modal to use welcome.ts
stitesExpensify Dec 7, 2023
9abcb6d
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Dec 7, 2023
dabb866
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Dec 12, 2023
a1e53cc
Fix import of style utils
stitesExpensify Dec 13, 2023
0a81573
Update for typescript
stitesExpensify Dec 14, 2023
0773d9e
Create new type and fix welcome.ts
stitesExpensify Dec 14, 2023
e52c81e
Don't check for isLoading and default to hidden
stitesExpensify Dec 14, 2023
08e8843
Also check for nvps before showing modal
stitesExpensify Dec 14, 2023
14f532a
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Dec 15, 2023
4d70303
fix import order
stitesExpensify Dec 19, 2023
c68d728
Check for number of policies
stitesExpensify Dec 19, 2023
17dbbe6
Style
stitesExpensify Dec 19, 2023
7b31ef9
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Dec 19, 2023
356db31
import order
stitesExpensify Dec 19, 2023
2ba2966
Prettier
stitesExpensify Dec 19, 2023
1f3420c
Remove unnecessary file
stitesExpensify Dec 19, 2023
874543f
Add prop type
stitesExpensify Dec 19, 2023
728e215
Fix typescript
stitesExpensify Dec 19, 2023
30ea7b5
Remove white padding
stitesExpensify Dec 20, 2023
ca904e0
Redirect to concierge chat after completing modal
stitesExpensify Dec 20, 2023
489b148
Add new param to show backdrop for modals
stitesExpensify Dec 20, 2023
4de8c5b
Allow all options to be on 2 lines
stitesExpensify Dec 20, 2023
d6d06ce
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Dec 20, 2023
cf1a9ec
Revert background changes
stitesExpensify Dec 20, 2023
82b26ad
Fix name
stitesExpensify Dec 20, 2023
30f88f8
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Dec 20, 2023
4e0eb0d
Re-add backdrop
stitesExpensify Dec 20, 2023
37e1e78
Add custom backdrop
stitesExpensify Dec 21, 2023
fdf8429
Add proper spanish translations
stitesExpensify Dec 21, 2023
23b3f89
only use custom backdrop for large screens
stitesExpensify Dec 21, 2023
6176876
Shrink image when screen is small
stitesExpensify Dec 21, 2023
9adf07d
Revert resizing changes
stitesExpensify Dec 21, 2023
daf05b6
Scrollview
stitesExpensify Dec 21, 2023
998c2e9
Style
stitesExpensify Dec 21, 2023
8f15ee3
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Dec 21, 2023
eb0d5cc
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Jan 4, 2024
3ca872a
Change keys'
stitesExpensify Jan 5, 2024
5bdc2c6
Style
stitesExpensify Jan 5, 2024
cf23709
Fix props
stitesExpensify Jan 5, 2024
4df4d3a
Fix import error
stitesExpensify Jan 5, 2024
8ac48cb
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Jan 9, 2024
6cc3f5c
Move message copy outside of component lifecycle
stitesExpensify Jan 9, 2024
aa6398a
Add view for max height
stitesExpensify Jan 10, 2024
37ff12a
Prettier
stitesExpensify Jan 10, 2024
c0a737b
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Jan 10, 2024
cbd3db5
Convert to ts
stitesExpensify Jan 11, 2024
69ccc51
Remove old file and fix menuitem type
stitesExpensify Jan 11, 2024
a02c8ae
More typescript chages
stitesExpensify Jan 11, 2024
a248b46
remove unused imports
stitesExpensify Jan 11, 2024
6d260df
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Jan 11, 2024
1569ef6
Fix background on mobile web
stitesExpensify Jan 11, 2024
d571914
Fix typing
stitesExpensify Jan 11, 2024
50ce52a
Add undefined link to fix types
stitesExpensify Jan 11, 2024
f216232
More types
stitesExpensify Jan 12, 2024
6f8ccf0
Style
stitesExpensify Jan 12, 2024
bca21af
Style
stitesExpensify Jan 12, 2024
0055dee
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Jan 12, 2024
8c59d64
Fix types
stitesExpensify Jan 13, 2024
6ca99b0
Remove bad routing logic
stitesExpensify Jan 13, 2024
58a4e52
Fix typing and consolidate logic
stitesExpensify Jan 15, 2024
4e9d290
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Jan 15, 2024
b41489d
Merge branch 'stites-purposeForExpensify' of github.com:Expensify/App…
stitesExpensify Jan 15, 2024
fe2625e
Fix merge
stitesExpensify Jan 15, 2024
189bae9
Comments
stitesExpensify Jan 15, 2024
9e86e8e
Fix copy pasta
stitesExpensify Jan 15, 2024
7edb569
Style
stitesExpensify Jan 15, 2024
9ec0c2a
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Jan 17, 2024
0b6bf56
Call the name directly after checking for currentRoute so that we don…
stitesExpensify Jan 18, 2024
eda0fe7
Merge branch 'main' of github.com:Expensify/App into stites-purposeFo…
stitesExpensify Jan 18, 2024
47c32f4
Fix types
stitesExpensify Jan 19, 2024
82b5552
Remove unnecessary type change and fix copy
stitesExpensify Jan 19, 2024
a526027
Memoize and callback
stitesExpensify Jan 19, 2024
cf5f181
Use const and condense menuitem logic
stitesExpensify Jan 19, 2024
2502778
Style
stitesExpensify Jan 19, 2024
49b6915
Fix type
stitesExpensify Jan 19, 2024
9bd6e2e
More types
stitesExpensify Jan 19, 2024
5fa2403
More style
stitesExpensify Jan 19, 2024
a313c40
Fix type
stitesExpensify Jan 19, 2024
da884be
Remove bad comments and copy/pasted code
stitesExpensify Jan 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions assets/images/scan.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3131,6 +3131,13 @@ const CONST = {
REPORT: 'REPORT',
},

INTRO_CHOICES: {
TRACK: 'newDotTrack',
SUBMIT: 'newDotSubmit',
MANAGE_TEAM: 'newDotManageTeam',
CHAT_SPLIT: 'newDotSplitChat',
},

MINI_CONTEXT_MENU_MAX_ITEMS: 4,
} as const;

Expand Down
8 changes: 8 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ const ONYXKEYS = {
/** This NVP holds to most recent waypoints that a person has used when creating a distance request */
NVP_RECENT_WAYPOINTS: 'expensify_recentWaypoints',

/** This NVP will be `true` if the user has ever dismissed the engagement modal on either OldDot or NewDot. If it becomes true it should stay true forever. */
NVP_HAS_DISMISSED_IDLE_PANEL: 'hasDismissedIdlePanel',

/** This NVP contains the choice that the user made on the engagement modal */
NVP_INTRO_SELECTED: 'introSelected',
stitesExpensify marked this conversation as resolved.
Show resolved Hide resolved

/** Does this user have push notifications enabled for this device? */
PUSH_NOTIFICATIONS_ENABLED: 'pushNotificationsEnabled',

Expand Down Expand Up @@ -393,6 +399,8 @@ type OnyxValues = {
[ONYXKEYS.FOCUS_MODE_NOTIFICATION]: boolean;
[ONYXKEYS.NVP_LAST_PAYMENT_METHOD]: Record<string, string>;
[ONYXKEYS.NVP_RECENT_WAYPOINTS]: OnyxTypes.RecentWaypoint[];
[ONYXKEYS.NVP_HAS_DISMISSED_IDLE_PANEL]: boolean;
[ONYXKEYS.NVP_INTRO_SELECTED]: OnyxTypes.IntroSelected;
[ONYXKEYS.PUSH_NOTIFICATIONS_ENABLED]: boolean;
[ONYXKEYS.PLAID_DATA]: OnyxTypes.PlaidData;
[ONYXKEYS.IS_PLAID_DISABLED]: boolean;
Expand Down
2 changes: 1 addition & 1 deletion src/components/AttachmentModal.js
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,7 @@ function AttachmentModal(props) {
shouldShowThreeDotsButton={shouldShowThreeDotsButton}
threeDotsAnchorPosition={styles.threeDotsPopoverOffsetAttachmentModal(windowWidth)}
threeDotsMenuItems={threeDotsMenuItems}
shouldOverlay
shouldOverlayDots
/>
<View style={styles.imageModalImageCenterContainer}>
{!_.isEmpty(props.report) && !props.isReceiptAttachment ? (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ const propTypes = {

/** Whether we should navigate to report page when the route have a topMostReport */
shouldNavigateToTopMostReport: PropTypes.bool,

/** Whether we should overlay the 3 dots menu */
shouldOverlayDots: PropTypes.bool,
stitesExpensify marked this conversation as resolved.
Show resolved Hide resolved
};

export default propTypes;
7 changes: 4 additions & 3 deletions src/components/HeaderWithBackButton/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react';
import {Keyboard, View} from 'react-native';
import {Keyboard, StyleSheet, View} from 'react-native';
import AvatarWithDisplayName from '@components/AvatarWithDisplayName';
import Header from '@components/Header';
import Icon from '@components/Icon';
Expand Down Expand Up @@ -52,6 +52,7 @@ function HeaderWithBackButton({
threeDotsMenuItems = [],
shouldEnableDetailPageNavigation = false,
children = null,
shouldOverlayDots = false,
shouldOverlay = false,
singleExecution = (func) => func,
shouldNavigateToTopMostReport = false,
Expand All @@ -69,7 +70,7 @@ function HeaderWithBackButton({
// Hover on some part of close icons will not work on Electron if dragArea is true
// https://github.com/Expensify/App/issues/29598
dataSet={{dragArea: false}}
style={[styles.headerBar, shouldShowBorderBottom && styles.borderBottom, shouldShowBackButton && styles.pl2]}
style={[styles.headerBar, shouldShowBorderBottom && styles.borderBottom, shouldShowBackButton && styles.pl2, shouldOverlay && StyleSheet.absoluteFillObject]}
>
<View style={[styles.dFlex, styles.flexRow, styles.alignItemsCenter, styles.flexGrow1, styles.justifyContentBetween, styles.overflowHidden]}>
{shouldShowBackButton && (
Expand Down Expand Up @@ -163,7 +164,7 @@ function HeaderWithBackButton({
menuItems={threeDotsMenuItems}
onIconPress={onThreeDotsButtonPress}
anchorPosition={threeDotsAnchorPosition}
shouldOverlay={shouldOverlay}
shouldOverlay={shouldOverlayDots}
/>
)}
{shouldShowCloseButton && (
Expand Down
3 changes: 3 additions & 0 deletions src/components/HeaderWithBackButton/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ type HeaderWithBackButtonProps = Partial<ChildrenProps> & {

/** Whether we should enable detail page navigation */
shouldEnableDetailPageNavigation?: boolean;

/** Whether we should overlay the 3 dots menu */
shouldOverlayDots?: boolean;
};

export type {ThreeDotsMenuItem};
Expand Down
2 changes: 2 additions & 0 deletions src/components/Icon/Expensicons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ import ReceiptSearch from '@assets/images/receipt-search.svg';
import Receipt from '@assets/images/receipt.svg';
import Rotate from '@assets/images/rotate-image.svg';
import RotateLeft from '@assets/images/rotate-left.svg';
import Scan from '@assets/images/scan.svg';
import Send from '@assets/images/send.svg';
import Shield from '@assets/images/shield.svg';
import AppleLogo from '@assets/images/signIn/apple-logo.svg';
Expand Down Expand Up @@ -243,6 +244,7 @@ export {
ReceiptSearch,
Rotate,
RotateLeft,
Scan,
Send,
Shield,
Sync,
Expand Down
5 changes: 4 additions & 1 deletion src/components/Modal/BaseModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import ComposerFocusManager from '@libs/ComposerFocusManager';
import Overlay from '@libs/Navigation/AppNavigator/Navigators/Overlay';
import useNativeDriver from '@libs/useNativeDriver';
import variables from '@styles/variables';
import * as Modal from '@userActions/Modal';
Expand Down Expand Up @@ -38,6 +39,7 @@ function BaseModal(
onLayout,
avoidKeyboard = false,
children,
shouldUseCustomBackdrop = false,
}: BaseModalProps,
ref: React.ForwardedRef<View>,
) {
Expand Down Expand Up @@ -185,7 +187,7 @@ function BaseModal(
swipeDirection={swipeDirection}
isVisible={isVisible}
backdropColor={theme.overlay}
backdropOpacity={hideBackdrop ? 0 : variables.overlayOpacity}
backdropOpacity={!shouldUseCustomBackdrop && hideBackdrop ? 0 : variables.overlayOpacity}
backdropTransitionOutTiming={0}
hasBackdrop={fullscreen}
coverScreen={fullscreen}
Expand All @@ -201,6 +203,7 @@ function BaseModal(
statusBarTranslucent={statusBarTranslucent}
onLayout={onLayout}
avoidKeyboard={avoidKeyboard}
customBackdrop={shouldUseCustomBackdrop ? <Overlay onPress={handleBackdropPress} /> : undefined}
>
<View
style={[styles.defaultModalContainer, modalContainerStyle, modalPaddingStyles, !isVisible && styles.pointerEventsNone]}
Expand Down
3 changes: 3 additions & 0 deletions src/components/Modal/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ type BaseModalProps = Partial<ModalProps> & {
* See: https://github.com/react-native-modal/react-native-modal/pull/116
* */
hideModalContentWhileAnimating?: boolean;

/** Should we use a custom backdrop for the modal? (This prevents focus issues on desktop) */
shouldUseCustomBackdrop?: boolean;
};

export default BaseModalProps;
Expand Down
178 changes: 178 additions & 0 deletions src/components/PurposeForUsingExpensifyModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
import {useNavigation} from '@react-navigation/native';
import React, {useCallback, useEffect, useMemo, useState} from 'react';
import {ScrollView, View} from 'react-native';
import type {ValueOf} from 'type-fest';
import useLocalize from '@hooks/useLocalize';
import useStyleUtils from '@hooks/useStyleUtils';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import * as Report from '@userActions/Report';
import * as Welcome from '@userActions/Welcome';
import CONST from '@src/CONST';
import NAVIGATORS from '@src/NAVIGATORS';
import SCREENS from '@src/SCREENS';
import HeaderWithBackButton from './HeaderWithBackButton';
import * as Expensicons from './Icon/Expensicons';
import Lottie from './Lottie';
import LottieAnimations from './LottieAnimations';
import type {MenuItemProps} from './MenuItem';
import MenuItemList from './MenuItemList';
import Modal from './Modal';
import Text from './Text';

// This is not translated because it is a message coming from concierge, which only supports english
const messageCopy = {
[CONST.INTRO_CHOICES.TRACK]:
'Great! To track your expenses, I suggest you create a workspace to keep everything contained:\n' +
'\n' +
'1. Press your avatar icon\n' +
'2. Choose Workspaces\n' +
'3. Choose New Workspace\n' +
'4. Name your workspace something meaningful (eg, "My Business Expenses")\n' +
'\n' +
'Once you have your workspace set up, you can add expenses to it as follows:\n' +
'\n' +
'1. Choose My Business Expenses (or whatever you named it) in the list of chat rooms\n' +
'2. Choose the + button in the chat compose window\n' +
'3. Choose Request money\n' +
"4. Choose what kind of expense you'd like to log, whether a manual expense, scanned receipt, or tracked distance.\n" +
'\n' +
"That'll be stored in your My Business Expenses room for your later access. Thanks for asking, and let me know how it goes!",
[CONST.INTRO_CHOICES.SUBMIT]:
'Hi there, to submit expenses for reimbursement, please:\n' +
'\n' +
'1. Press the big green + button\n' +
'2. Choose Request money\n' +
'3. Indicate how much to request, either manually, by scanning a receipt, or by tracking distance\n' +
'4. Enter the email address or phone number of your boss\n' +
'\n' +
"And we'll take it from there to get you paid back. Please give it a shot and let me know how it goes!",
[CONST.INTRO_CHOICES.MANAGE_TEAM]:
"Great! To manage your team's expenses, create a workspace to keep everything contained:\n" +
'\n' +
'1. Press your avatar icon\n' +
'2. Choose Workspaces\n' +
'3. Choose New Workspace\n' +
'4. Name your workspace something meaningful (eg, "Galaxy Food Inc.")\n' +
'\n' +
'Once you have your workspace set up, you can invite your team to it via the Members pane and connect a business bank account to reimburse them!',
[CONST.INTRO_CHOICES.CHAT_SPLIT]:
'Hi there, to split an expense such as with a friend, please:\n' +
'\n' +
'Press the big green + button\n' +
'Choose *Request money*\n' +
'Indicate how much was spent, either manually, by scanning a receipt, or by tracking distance\n' +
'Enter the email address or phone number of your friend\n' +
'Press *Split* next to their name\n' +
'Repeat as many times as you like for each of your friends\n' +
'Press *Add to split* when done adding friends\n' +
'Press Split to split the bill\n' +
'\n' +
"This will send a money request to each of your friends for however much they owe you, and we'll take care of getting you paid back. Thanks for asking, and let me know how it goes!",
};

const menuIcons = {
[CONST.INTRO_CHOICES.TRACK]: Expensicons.ReceiptSearch,
[CONST.INTRO_CHOICES.SUBMIT]: Expensicons.Scan,
[CONST.INTRO_CHOICES.MANAGE_TEAM]: Expensicons.MoneyBag,
[CONST.INTRO_CHOICES.CHAT_SPLIT]: Expensicons.Briefcase,
};

function PurposeForUsingExpensifyModal() {
const {translate} = useLocalize();
const StyleUtils = useStyleUtils();
const styles = useThemeStyles();
const {isSmallScreenWidth, windowHeight} = useWindowDimensions();
const navigation = useNavigation();
const [isModalOpen, setIsModalOpen] = useState(false);
const theme = useTheme();

useEffect(() => {
const navigationState = navigation.getState();
const routes = navigationState.routes;
const currentRoute = routes[navigationState.index];
if (currentRoute && NAVIGATORS.CENTRAL_PANE_NAVIGATOR !== currentRoute.name && currentRoute.name !== SCREENS.HOME) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please add context behind this logic?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there is a route, we don't want to show the modal unless the page we're on is home or the central pane navigator

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok so #32154 (review) is correct. Just wanted to confirm 🙂

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep that's correct! Thanks for double checking :)

return;
}

Welcome.show(routes, () => setIsModalOpen(true));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

const closeModal = useCallback(() => {
Report.dismissEngagementModal();
setIsModalOpen(false);
}, []);

const completeModalAndClose = useCallback((message: string, choice: ValueOf<typeof CONST.INTRO_CHOICES>) => {
Report.completeEngagementModal(message, choice);
setIsModalOpen(false);
Report.navigateToConciergeChat();
}, []);

const menuItems: MenuItemProps[] = useMemo(
() =>
Object.values(CONST.INTRO_CHOICES).map((choice) => {
const translationKey = `purposeForExpensify.${choice}` as const;
return {
key: translationKey,
title: translate(translationKey),
icon: menuIcons[choice],
iconRight: Expensicons.ArrowRight,
onPress: () => completeModalAndClose(messageCopy[choice], choice),
shouldShowRightIcon: true,
numberOfLinesTitle: 2,
};
}),
[completeModalAndClose, translate],
);

return (
<Modal
type={isSmallScreenWidth ? CONST.MODAL.MODAL_TYPE.BOTTOM_DOCKED : CONST.MODAL.MODAL_TYPE.RIGHT_DOCKED}
isVisible={isModalOpen}
onClose={closeModal}
innerContainerStyle={styles.pt0}
shouldUseCustomBackdrop
>
<View style={{maxHeight: windowHeight}}>
<ScrollView>
<View style={StyleUtils.getBackgroundColorStyle(theme.PAGE_THEMES[SCREENS.SETTINGS.WORKSPACES].backgroundColor)}>
<Lottie
source={LottieAnimations.Hands}
style={styles.w100}
webStyle={styles.w100}
autoPlay
loop
/>
<HeaderWithBackButton
shouldShowCloseButton
shouldShowBackButton={false}
onCloseButtonPress={closeModal}
shouldOverlay
iconFill={theme.iconColorfulBackground}
/>
</View>
<View style={[styles.w100, styles.ph5, styles.pv5]}>
<Text
style={[styles.textHeadline, styles.preWrap, styles.mb2]}
numberOfLines={2}
>
{translate('purposeForExpensify.welcomeMessage')}
</Text>
<Text>{translate('purposeForExpensify.welcomeSubtitle')}</Text>
</View>
<MenuItemList
menuItems={menuItems}
shouldUseSingleExecution
stitesExpensify marked this conversation as resolved.
Show resolved Hide resolved
/>
</ScrollView>
</View>
</Modal>
);
}

PurposeForUsingExpensifyModal.displayName = 'PurposeForUsingExpensifyModal';

export default PurposeForUsingExpensifyModal;
8 changes: 8 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2073,6 +2073,14 @@ export default {
},
copyReferralLink: 'Copy invite link',
},
purposeForExpensify: {
[CONST.INTRO_CHOICES.TRACK]: 'Track business spend for taxes',
[CONST.INTRO_CHOICES.SUBMIT]: 'Get paid back by my employer',
[CONST.INTRO_CHOICES.MANAGE_TEAM]: "Manage my team's expenses",
[CONST.INTRO_CHOICES.CHAT_SPLIT]: 'Chat and split bills with friends',
welcomeMessage: 'Welcome to Expensify',
welcomeSubtitle: 'What would you like to do?',
},
violations: {
allTagLevelsRequired: 'All tags required',
autoReportedRejectedExpense: ({rejectReason, rejectedBy}: ViolationsAutoReportedRejectedExpenseParams) => `${rejectedBy} rejected this expense with the comment "${rejectReason}"`,
Expand Down
8 changes: 8 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2561,6 +2561,14 @@ export default {
},
copyReferralLink: 'Copiar enlace de invitación',
},
purposeForExpensify: {
[CONST.INTRO_CHOICES.TRACK]: 'Seguimiento de los gastos de empresa para fines fiscales',
[CONST.INTRO_CHOICES.SUBMIT]: 'Reclamar gastos a mi empleador',
[CONST.INTRO_CHOICES.MANAGE_TEAM]: 'Gestionar los gastos de mi equipo',
[CONST.INTRO_CHOICES.CHAT_SPLIT]: 'Chatea y divide gastos con tus amigos',
welcomeMessage: 'Bienvenido a Expensify',
welcomeSubtitle: '¿Qué te gustaría hacer?',
},
violations: {
allTagLevelsRequired: 'Todas las etiquetas son obligatorias',
autoReportedRejectedExpense: ({rejectedBy, rejectReason}: ViolationsAutoReportedRejectedExpenseParams) => `${rejectedBy} rechazó la solicitud y comentó "${rejectReason}"`,
Expand Down
Loading
Loading