Skip to content

Commit 3ad9461

Browse files
authored
Merge pull request #56090 from nkdengineer/fix/55717
feat: skip participant step in create flow
2 parents 153e884 + 17be045 commit 3ad9461

File tree

8 files changed

+115
-42
lines changed

8 files changed

+115
-42
lines changed

src/ROUTES.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ const ROUTES = {
506506
},
507507
MONEY_REQUEST_STEP_CONFIRMATION: {
508508
route: ':action/:iouType/confirmation/:transactionID/:reportID',
509-
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, participantsAutoAssigned?: boolean) =>
509+
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string | undefined, participantsAutoAssigned?: boolean) =>
510510
`${action as string}/${iouType as string}/confirmation/${transactionID}/${reportID}${participantsAutoAssigned ? '?participantsAutoAssigned=true' : ''}` as const,
511511
},
512512
MONEY_REQUEST_STEP_AMOUNT: {
@@ -692,7 +692,7 @@ const ROUTES = {
692692
},
693693
MONEY_REQUEST_STEP_PARTICIPANTS: {
694694
route: ':action/:iouType/participants/:transactionID/:reportID',
695-
getRoute: (iouType: IOUType, transactionID: string, reportID: string, backTo = '', action: IOUAction = 'create') =>
695+
getRoute: (iouType: IOUType, transactionID: string | undefined, reportID: string, backTo = '', action: IOUAction = 'create') =>
696696
getUrlWithBackToParam(`${action as string}/${iouType as string}/participants/${transactionID}/${reportID}`, backTo),
697697
},
698698
MONEY_REQUEST_STEP_SPLIT_PAYER: {

src/components/MoneyRequestConfirmationList.tsx

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,8 @@ function MoneyRequestConfirmationList({
719719
const formattedSelectedParticipants = selectedParticipants.map((participant) => ({
720720
...participant,
721721
isSelected: false,
722-
isInteractive: !shouldDisableParticipant(participant),
722+
isInteractive: transaction?.isFromGlobalCreate,
723+
shouldShowRightIcon: transaction?.isFromGlobalCreate,
723724
}));
724725
options.push({
725726
title: translate('common.to'),
@@ -729,7 +730,7 @@ function MoneyRequestConfirmationList({
729730
}
730731

731732
return options;
732-
}, [isTypeSplit, translate, payeePersonalDetails, getSplitSectionHeader, splitParticipants, selectedParticipants]);
733+
}, [isTypeSplit, translate, payeePersonalDetails, getSplitSectionHeader, splitParticipants, selectedParticipants, transaction?.isFromGlobalCreate]);
733734

734735
useEffect(() => {
735736
if (!isDistanceRequest || (isMovingTransactionFromTrackExpense && !isPolicyExpenseChat) || !transactionID) {
@@ -801,21 +802,14 @@ function MoneyRequestConfirmationList({
801802
}, [transactionID, policyTagLists, policyTags]);
802803

803804
/**
804-
* Navigate to report details or profile of selected user
805+
* Navigate to the participant step
805806
*/
806-
const navigateToReportOrUserDetail = (option: MoneyRequestConfirmationListItem) => {
807-
const activeRoute = Navigation.getActiveRoute();
808-
809-
if (option.isSelfDM) {
810-
Navigation.navigate(ROUTES.PROFILE.getRoute(currentUserPersonalDetails.accountID, activeRoute), CONST.NAVIGATION.ACTION_TYPE.PUSH);
807+
const navigateToParticipantPage = () => {
808+
if (!transaction?.isFromGlobalCreate) {
811809
return;
812810
}
813811

814-
if (option.accountID) {
815-
Navigation.navigate(ROUTES.PROFILE.getRoute(option.accountID, activeRoute), CONST.NAVIGATION.ACTION_TYPE.PUSH);
816-
} else if (option.reportID) {
817-
Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(option.reportID, activeRoute), CONST.NAVIGATION.ACTION_TYPE.PUSH);
818-
}
812+
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(iouType, transactionID, reportID));
819813
};
820814

821815
/**
@@ -1042,7 +1036,7 @@ function MoneyRequestConfirmationList({
10421036
<SelectionList<MoneyRequestConfirmationListItem>
10431037
sections={sections}
10441038
ListItem={UserListItem}
1045-
onSelectRow={navigateToReportOrUserDetail}
1039+
onSelectRow={navigateToParticipantPage}
10461040
shouldSingleExecuteRowSelect
10471041
canSelectMultiple={false}
10481042
shouldPreventDefaultFocusOnSelectRow

src/components/SelectionList/UserListItem.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import useLocalize from '@hooks/useLocalize';
1313
import useStyleUtils from '@hooks/useStyleUtils';
1414
import useTheme from '@hooks/useTheme';
1515
import useThemeStyles from '@hooks/useThemeStyles';
16+
import getButtonState from '@libs/getButtonState';
1617
import CONST from '@src/CONST';
1718
import type {Icon as IconType} from '@src/types/onyx/OnyxCommon';
1819
import BaseListItem from './BaseListItem';
@@ -147,6 +148,14 @@ function UserListItem<TItem extends ListItem>({
147148
)}
148149
</View>
149150
{!!item.rightElement && item.rightElement}
151+
{!!item.shouldShowRightIcon && (
152+
<View style={[styles.popoverMenuIcon, styles.pointerEventsAuto, isDisabled && styles.cursorDisabled]}>
153+
<Icon
154+
src={Expensicons.ArrowRight}
155+
fill={StyleUtils.getIconFillColor(getButtonState(hovered, false, false, !!isDisabled, item.isInteractive !== false))}
156+
/>
157+
</View>
158+
)}
150159
</>
151160
)}
152161
</BaseListItem>

src/components/SelectionList/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,9 @@ type ListItem = {
200200

201201
/** The style to override the default appearance */
202202
itemStyle?: StyleProp<ViewStyle>;
203+
204+
/** Boolean whether to display the right icon */
205+
shouldShowRightIcon?: boolean;
203206
};
204207

205208
type TransactionListItemType = ListItem &

src/pages/iou/request/step/IOURequestStepAmount.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {createDraftTransaction, removeDraftTransaction} from '@libs/actions/Tran
1010
import {convertToBackendAmount, isValidCurrencyCode} from '@libs/CurrencyUtils';
1111
import Navigation from '@libs/Navigation/Navigation';
1212
import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
13-
import {getBankAccountRoute, getTransactionDetails, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
13+
import {isPaidGroupPolicy} from '@libs/PolicyUtils';
14+
import {getBankAccountRoute, getPolicyExpenseChat, getTransactionDetails, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
1415
import playSound, {SOUNDS} from '@libs/Sound';
1516
import {calculateTaxAmount, getAmount, getCurrency, getDefaultTaxCode, getRequestType, getTaxValue} from '@libs/TransactionUtils';
1617
import MoneyRequestAmountForm from '@pages/iou/MoneyRequestAmountForm';
@@ -76,6 +77,8 @@ function IOURequestStepAmount({
7677
const [draftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`);
7778
const [splitDraftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`);
7879
const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`);
80+
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
81+
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`);
7982

8083
const isEditing = action === CONST.IOU.ACTION.EDIT;
8184
const isSplitBill = iouType === CONST.IOU.TYPE.SPLIT;
@@ -249,7 +252,20 @@ function IOURequestStepAmount({
249252

250253
// If there was no reportID, then that means the user started this flow from the global + menu
251254
// and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
252-
navigateToParticipantPage();
255+
if (iouType === CONST.IOU.TYPE.CREATE && isPaidGroupPolicy(activePolicy) && activePolicy?.isPolicyExpenseChatEnabled) {
256+
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
257+
setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat);
258+
Navigation.navigate(
259+
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
260+
CONST.IOU.ACTION.CREATE,
261+
iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
262+
transactionID,
263+
activePolicyExpenseChat?.reportID,
264+
),
265+
);
266+
} else {
267+
navigateToParticipantPage();
268+
}
253269
};
254270

255271
const saveAmountAndCurrency = ({amount, paymentMethod}: AmountParams) => {

src/pages/iou/request/step/IOURequestStepDistance.tsx

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ import {getLatestErrorField} from '@libs/ErrorUtils';
4242
import {shouldUseTransactionDraft} from '@libs/IOUUtils';
4343
import Navigation from '@libs/Navigation/Navigation';
4444
import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
45-
import {getPersonalPolicy, getPolicy} from '@libs/PolicyUtils';
46-
import {isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtil} from '@libs/ReportUtils';
45+
import {getPersonalPolicy, getPolicy, isPaidGroupPolicy} from '@libs/PolicyUtils';
46+
import {getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtil} from '@libs/ReportUtils';
4747
import playSound, {SOUNDS} from '@libs/Sound';
4848
import {getDistanceInMeters, getRateID, getRequestType, getValidWaypoints, isCustomUnitRateIDForP2P} from '@libs/TransactionUtils';
4949
import CONST from '@src/CONST';
@@ -81,6 +81,8 @@ function IOURequestStepDistance({
8181
const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${transactionID}`);
8282
const policy = usePolicy(report?.policyID);
8383
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
84+
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
85+
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`);
8486
const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`);
8587
const [optimisticWaypoints, setOptimisticWaypoints] = useState<WaypointCollection | null>(null);
8688
const waypoints = useMemo(
@@ -374,24 +376,39 @@ function IOURequestStepDistance({
374376

375377
// If there was no reportID, then that means the user started this flow from the global menu
376378
// and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
377-
navigateToParticipantPage();
379+
if (iouType === CONST.IOU.TYPE.CREATE && isPaidGroupPolicy(activePolicy) && activePolicy?.isPolicyExpenseChatEnabled) {
380+
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
381+
setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat);
382+
Navigation.navigate(
383+
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
384+
CONST.IOU.ACTION.CREATE,
385+
iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
386+
transactionID,
387+
activePolicyExpenseChat?.reportID,
388+
),
389+
);
390+
} else {
391+
navigateToParticipantPage();
392+
}
378393
}, [
394+
transaction,
395+
backTo,
379396
report,
380-
iouType,
397+
reportNameValuePairs,
398+
activePolicy,
381399
transactionID,
382-
backTo,
383-
waypoints,
384-
currentUserPersonalDetails,
385-
personalDetails,
400+
setDistanceRequestData,
386401
shouldSkipConfirmation,
387-
transaction,
388-
translate,
389-
navigateToParticipantPage,
390402
navigateToConfirmationPage,
403+
personalDetails,
404+
translate,
405+
iouType,
406+
currentUserPersonalDetails.login,
407+
currentUserPersonalDetails.accountID,
391408
policy,
392-
reportNameValuePairs,
409+
waypoints,
393410
customUnitRateID,
394-
setDistanceRequestData,
411+
navigateToParticipantPage,
395412
]);
396413

397414
const getError = () => {

src/pages/iou/request/step/IOURequestStepScan/index.native.tsx

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ import {shouldStartLocationPermissionFlow} from '@libs/IOUUtils';
3737
import Log from '@libs/Log';
3838
import Navigation from '@libs/Navigation/Navigation';
3939
import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
40-
import {isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
40+
import {isPaidGroupPolicy} from '@libs/PolicyUtils';
41+
import {getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
4142
import playSound, {SOUNDS} from '@libs/Sound';
4243
import {getDefaultTaxCode} from '@libs/TransactionUtils';
4344
import StepScreenWrapper from '@pages/iou/request/step/StepScreenWrapper';
@@ -86,6 +87,8 @@ function IOURequestStepScan({
8687
const policy = usePolicy(report?.policyID);
8788
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
8889
const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`);
90+
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
91+
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`);
8992
const platform = getPlatform(true);
9093
const [mutedPlatforms = {}] = useOnyx(ONYXKEYS.NVP_MUTED_PLATFORMS);
9194
const isPlatformMuted = mutedPlatforms[platform];
@@ -298,7 +301,20 @@ function IOURequestStepScan({
298301
// If the user started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page.
299302
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
300303
if ((transaction?.isFromGlobalCreate && iouType !== CONST.IOU.TYPE.TRACK && !report?.reportID) || iouType === CONST.IOU.TYPE.CREATE) {
301-
navigateToParticipantPage();
304+
if (isPaidGroupPolicy(activePolicy)) {
305+
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
306+
setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat);
307+
Navigation.navigate(
308+
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
309+
CONST.IOU.ACTION.CREATE,
310+
iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
311+
transactionID,
312+
activePolicyExpenseChat?.reportID,
313+
),
314+
);
315+
} else {
316+
navigateToParticipantPage();
317+
}
302318
return;
303319
}
304320

@@ -413,19 +429,20 @@ function IOURequestStepScan({
413429
[
414430
backTo,
415431
transaction?.isFromGlobalCreate,
416-
transaction?.attendees,
417432
transaction?.currency,
418433
transaction?.created,
434+
transaction?.attendees,
419435
iouType,
420436
report,
421437
transactionID,
422438
shouldSkipConfirmation,
423439
navigateToConfirmationPage,
440+
activePolicy,
441+
currentUserPersonalDetails.accountID,
442+
currentUserPersonalDetails.login,
424443
navigateToParticipantPage,
425444
personalDetails,
426445
createTransaction,
427-
currentUserPersonalDetails.login,
428-
currentUserPersonalDetails.accountID,
429446
reportID,
430447
transactionTaxCode,
431448
transactionTaxAmount,

src/pages/iou/request/step/IOURequestStepScan/index.tsx

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ import {shouldStartLocationPermissionFlow} from '@libs/IOUUtils';
3535
import Log from '@libs/Log';
3636
import Navigation from '@libs/Navigation/Navigation';
3737
import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
38-
import {isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
38+
import {isPaidGroupPolicy} from '@libs/PolicyUtils';
39+
import {getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
3940
import playSound, {SOUNDS} from '@libs/Sound';
4041
import {getDefaultTaxCode} from '@libs/TransactionUtils';
4142
import ReceiptDropUI from '@pages/iou/ReceiptDropUI';
@@ -98,6 +99,8 @@ function IOURequestStepScan({
9899
const policy = usePolicy(report?.policyID);
99100
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
100101
const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`);
102+
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
103+
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`);
101104
const [isLoadingReceipt, setIsLoadingReceipt] = useState(false);
102105

103106
const [videoConstraints, setVideoConstraints] = useState<MediaTrackConstraints>();
@@ -324,7 +327,20 @@ function IOURequestStepScan({
324327
// If the user started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page.
325328
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
326329
if ((transaction?.isFromGlobalCreate && iouType !== CONST.IOU.TYPE.TRACK && !report?.reportID) || iouType === CONST.IOU.TYPE.CREATE) {
327-
navigateToParticipantPage();
330+
if (isPaidGroupPolicy(activePolicy)) {
331+
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
332+
setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat);
333+
Navigation.navigate(
334+
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
335+
CONST.IOU.ACTION.CREATE,
336+
iouType === CONST.IOU.TYPE.CREATE ? CONST.IOU.TYPE.SUBMIT : iouType,
337+
transactionID,
338+
activePolicyExpenseChat?.reportID,
339+
),
340+
);
341+
} else {
342+
navigateToParticipantPage();
343+
}
328344
return;
329345
}
330346

@@ -439,23 +455,24 @@ function IOURequestStepScan({
439455
[
440456
backTo,
441457
transaction?.isFromGlobalCreate,
442-
transaction?.attendees,
443458
transaction?.currency,
444459
transaction?.created,
460+
transaction?.attendees,
445461
iouType,
446462
report,
447463
transactionID,
448464
shouldSkipConfirmation,
449465
navigateToConfirmationPage,
466+
activePolicy,
467+
currentUserPersonalDetails.accountID,
468+
currentUserPersonalDetails.login,
450469
navigateToParticipantPage,
451470
personalDetails,
452-
currentUserPersonalDetails.login,
453-
currentUserPersonalDetails.accountID,
471+
createTransaction,
454472
reportID,
455473
transactionTaxCode,
456474
transactionTaxAmount,
457475
policy,
458-
createTransaction,
459476
],
460477
);
461478

0 commit comments

Comments
 (0)