forked from Expensify/App
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Welcome.js
158 lines (135 loc) · 5.28 KB
/
Welcome.js
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
import Onyx from 'react-native-onyx';
import _ from 'underscore';
import lodashGet from 'lodash/get';
import Navigation from '../Navigation/Navigation';
import * as ReportUtils from '../ReportUtils';
import ROUTES from '../../ROUTES';
import * as Policy from './Policy';
import ONYXKEYS from '../../ONYXKEYS';
import SCREENS from '../../SCREENS';
import CONST from '../../CONST';
let resolveIsReadyPromise;
let isReadyPromise = new Promise((resolve) => {
resolveIsReadyPromise = resolve;
});
let isFirstTimeNewExpensifyUser;
let isLoadingReportData = true;
let email = '';
/**
* Check that a few requests have completed so that the welcome action can proceed:
*
* - Whether we are a first time new expensify user
* - Whether we have loaded all policies the server knows about
* - Whether we have loaded all reports the server knows about
*/
function checkOnReady() {
if (!_.isBoolean(isFirstTimeNewExpensifyUser) || isLoadingReportData) {
return;
}
resolveIsReadyPromise();
}
Onyx.connect({
key: ONYXKEYS.NVP_IS_FIRST_TIME_NEW_EXPENSIFY_USER,
initWithStoredValues: false,
callback: (val) => {
// If isFirstTimeNewExpensifyUser was true do not update it to false. We update it to false inside the Welcome.show logic
// More context here https://github.com/Expensify/App/pull/16962#discussion_r1167351359
if (!isFirstTimeNewExpensifyUser) {
isFirstTimeNewExpensifyUser = val;
}
checkOnReady();
},
});
Onyx.connect({
key: ONYXKEYS.IS_LOADING_REPORT_DATA,
initWithStoredValues: false,
callback: (val) => {
isLoadingReportData = val;
checkOnReady();
},
});
const allReports = {};
Onyx.connect({
key: ONYXKEYS.COLLECTION.REPORT,
initWithStoredValues: false,
callback: (val, key) => {
if (!val || !key) {
return;
}
allReports[key] = {...allReports[key], ...val};
},
});
const allPolicies = {};
Onyx.connect({
key: ONYXKEYS.COLLECTION.POLICY,
callback: (val, key) => {
if (!key) {
return;
}
if (val === null || val === undefined) {
delete allPolicies[key];
return;
}
allPolicies[key] = {...allPolicies[key], ...val};
},
});
Onyx.connect({
key: ONYXKEYS.SESSION,
callback: (val, key) => {
if (!val || !key) {
return;
}
email = val.email;
},
});
/**
* Shows a welcome action on first login
*
* @param {Object} params
* @param {Object} params.routes
* @param {Function} [params.showCreateMenu]
* @param {Function} [params.showPopoverMenu]
*/
function show({routes, showCreateMenu = () => {}, showPopoverMenu = () => {}}) {
isReadyPromise.then(() => {
if (!isFirstTimeNewExpensifyUser) {
return;
}
// If we are rendering the SidebarScreen at the same time as a workspace route that means we've already created a workspace via workspace/new and should not open the global
// create menu right now. We should also stay on the workspace page if that is our destination.
const topRoute = _.last(routes);
const isWorkspaceRoute = topRoute.name === 'Settings' && topRoute.params.path.includes('workspace');
const transitionRoute = _.find(routes, (route) => route.name === SCREENS.TRANSITION_FROM_OLD_DOT);
const exitingToWorkspaceRoute = lodashGet(transitionRoute, 'params.exitTo', '') === 'workspace/new';
const isDisplayingWorkspaceRoute = isWorkspaceRoute || exitingToWorkspaceRoute;
// We want to display the Workspace chat first since that means a user is already in a Workspace and doesn't need to create another one
const workspaceChatReport = _.find(allReports, (report) => ReportUtils.isPolicyExpenseChat(report) && report.ownerEmail === email && report.statusNum !== CONST.REPORT.STATUS.CLOSED);
if (workspaceChatReport && !isDisplayingWorkspaceRoute) {
// This key is only updated when we call ReconnectApp, setting it to false now allows the user to navigate normally instead of always redirecting to the workspace chat
Onyx.set(ONYXKEYS.NVP_IS_FIRST_TIME_NEW_EXPENSIFY_USER, false);
Navigation.navigate(ROUTES.getReportRoute(workspaceChatReport.reportID));
// If showPopoverMenu exists and returns true then it opened the Popover Menu successfully, and we can update isFirstTimeNewExpensifyUser
// so the Welcome logic doesn't run again
if (showPopoverMenu()) {
isFirstTimeNewExpensifyUser = false;
}
return;
}
// If user is not already an admin of a free policy and we are not navigating them to their workspace or creating a new workspace via workspace/new then
// we will show the create menu.
if (!Policy.isAdminOfFreePolicy(allPolicies) && !isDisplayingWorkspaceRoute) {
showCreateMenu();
}
// Update isFirstTimeNewExpensifyUser so the Welcome logic doesn't run again
isFirstTimeNewExpensifyUser = false;
});
}
function resetReadyCheck() {
isReadyPromise = new Promise((resolve) => {
resolveIsReadyPromise = resolve;
});
}
function serverDataIsReadyPromise() {
return isReadyPromise;
}
export {show, serverDataIsReadyPromise, resetReadyCheck};