-
Notifications
You must be signed in to change notification settings - Fork 2.9k
/
PurposeForUsingExpensifyModal.tsx
178 lines (167 loc) · 7.94 KB
/
PurposeForUsingExpensifyModal.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
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) {
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
/>
</ScrollView>
</View>
</Modal>
);
}
PurposeForUsingExpensifyModal.displayName = 'PurposeForUsingExpensifyModal';
export default PurposeForUsingExpensifyModal;