Skip to content

Commit

Permalink
adjust create expense flow
Browse files Browse the repository at this point in the history
  • Loading branch information
JKobrynski committed Jan 9, 2025
1 parent 5fb81d6 commit 96037d4
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 64 deletions.
11 changes: 7 additions & 4 deletions src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -429,16 +429,19 @@ function MoneyRequestConfirmationList({
text = translate('common.next');
}
} else if (isTypeTrackExpense) {
text = translate('iou.trackExpense');
text = translate('iou.createExpense');
if (iouAmount !== 0) {
text = translate('iou.createExpenseWithAmount', {amount: formattedAmount});
}
} else if (isTypeSplit && iouAmount === 0) {
text = translate('iou.splitExpense');
} else if ((receiptPath && isTypeRequest) || isDistanceRequestWithPendingRoute || isPerDiemRequest) {
text = translate('iou.submitExpense');
text = translate('iou.createExpense');
if (iouAmount !== 0) {
text = translate('iou.submitAmount', {amount: formattedAmount});
text = translate('iou.createExpenseWithAmount', {amount: formattedAmount});
}
} else {
const translationKey = isTypeSplit ? 'iou.splitAmount' : 'iou.submitAmount';
const translationKey = isTypeSplit ? 'iou.splitAmount' : 'iou.createExpenseWithAmount';
text = translate(translationKey, {amount: formattedAmount});
}
return [
Expand Down
1 change: 1 addition & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -870,6 +870,7 @@ const translations = {
createExpense: 'Create expense',
trackExpense: 'Track expense',
chooseRecipient: 'Choose recipient',
createExpenseWithAmount: ({amount}: {amount: string}) => `Create ${amount} expense`,
confirmDetails: 'Confirm details',
pay: 'Pay',
cancelPayment: 'Cancel payment',
Expand Down
1 change: 1 addition & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -865,6 +865,7 @@ const translations = {
paySomeone: ({name}: PaySomeoneParams = {}) => `Pagar a ${name ?? 'alguien'}`,
trackExpense: 'Seguimiento de gastos',
chooseRecipient: 'Elige destinatario',
createExpenseWithAmount: ({amount}: {amount: string}) => `Crear un gasto de ${amount}`,
confirmDetails: 'Confirma los detalles',
pay: 'Pagar',
cancelPayment: 'Cancelar el pago',
Expand Down
98 changes: 96 additions & 2 deletions src/libs/OptionsListUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ type GetOptionsConfig = {
action?: IOUAction;
recentAttendees?: Attendee[];
shouldBoldTitleByDefault?: boolean;
shouldSeparateWorkspaceChat?: boolean;
shouldSeparateSelfDMChat?: boolean;
};

type GetUserToInviteConfig = {
Expand Down Expand Up @@ -138,6 +140,8 @@ type Options = {
personalDetails: ReportUtils.OptionData[];
userToInvite: ReportUtils.OptionData | null;
currentUserOption: ReportUtils.OptionData | null | undefined;
workspaceChats?: ReportUtils.OptionData[];
selfDMChat?: ReportUtils.OptionData | undefined;
};

type PreviewConfig = {showChatPreviewLine?: boolean; forcePolicyNamePreview?: boolean; showPersonalDetails?: boolean};
Expand Down Expand Up @@ -165,7 +169,7 @@ type OrderReportOptionsConfig = {
preferRecentExpenseReports?: boolean;
};

type ReportAndPersonalDetailOptions = Pick<Options, 'recentReports' | 'personalDetails'>;
type ReportAndPersonalDetailOptions = Pick<Options, 'recentReports' | 'personalDetails' | 'workspaceChats'>;

/**
* OptionsListUtils is used to build a list options passed to the OptionsList component. Several different UI views can
Expand Down Expand Up @@ -1009,6 +1013,23 @@ function orderReportOptionsWithSearch(
);
}

function orderWorkspaceOptions(options: ReportUtils.OptionData[]): ReportUtils.OptionData[] {
return lodashOrderBy(
options,
[
(option) => {
// Put default workspace on top
if (option.isPolicyExpenseChat && option.policyID === activePolicyID) {
return 0;
}

return 1;
},
],
['asc'],
);
}

function sortComparatorReportOptionByArchivedStatus(option: ReportUtils.OptionData) {
return option.private_isArchived ? 1 : 0;
}
Expand Down Expand Up @@ -1036,10 +1057,12 @@ function orderOptions(options: ReportAndPersonalDetailOptions, searchValue?: str
orderedReportOptions = orderReportOptions(options.recentReports);
}
const orderedPersonalDetailsOptions = orderPersonalDetailsOptions(options.personalDetails);
const orderedWorkspaceChats = orderWorkspaceOptions(options?.workspaceChats ?? []);

return {
recentReports: orderedReportOptions,
personalDetails: orderedPersonalDetailsOptions,
workspaceChats: orderedWorkspaceChats,
};
}

Expand Down Expand Up @@ -1148,6 +1171,8 @@ function getValidOptions(
action,
recentAttendees,
shouldBoldTitleByDefault = true,
shouldSeparateSelfDMChat = false,
shouldSeparateWorkspaceChat = false,
}: GetOptionsConfig = {},
): Options {
const topmostReportId = Navigation.getTopmostReportId();
Expand Down Expand Up @@ -1223,6 +1248,12 @@ function getValidOptions(
return true;
});

let workspaceChats: ReportUtils.OptionData[] = [];

if (shouldSeparateWorkspaceChat) {
workspaceChats = allReportOptions.filter((option) => option.isOwnPolicyExpenseChat && !option.private_isArchived);
}

const allPersonalDetailsOptions = includeP2P
? options.personalDetails.filter((detail) => !!detail?.login && !!detail.accountID && !detail?.isOptimisticPersonalDetail && (includeDomainEmail || !Str.isDomainEmail(detail.login)))
: [];
Expand Down Expand Up @@ -1341,6 +1372,15 @@ function getValidOptions(
}

const currentUserOption = allPersonalDetailsOptions.find((personalDetailsOption) => personalDetailsOption.login === currentUserLogin);
let selfDMChat: ReportUtils.OptionData | undefined;

if (shouldSeparateWorkspaceChat) {
recentReportOptions = recentReportOptions.filter((option) => !option.isPolicyExpenseChat);
}
if (shouldSeparateSelfDMChat) {
selfDMChat = recentReportOptions.find((option) => option.isSelfDM);
recentReportOptions = recentReportOptions.filter((option) => !option.isSelfDM);
}

return {
personalDetails: personalDetailsOptions,
Expand All @@ -1349,6 +1389,8 @@ function getValidOptions(
// User to invite is generated by the search input of a user.
// As this function isn't concerned with any search input yet, this is null (will be set when using filterOptions).
userToInvite: null,
workspaceChats,
selfDMChat,
};
}

Expand Down Expand Up @@ -1588,6 +1630,7 @@ function formatSectionsFromSearchTerm(
filteredPersonalDetails: ReportUtils.OptionData[],
personalDetails: OnyxEntry<PersonalDetailsList> = {},
shouldGetOptionDetails = false,
filteredWorkspaceChats: ReportUtils.OptionData[] = [],
): SectionForSearchTerm {
// We show the selected participants at the top of the list when there is no search term or maximum number of participants has already been selected
// However, if there is a search term we remove the selected participants from the top of the list unless they are part of the search results
Expand All @@ -1613,8 +1656,9 @@ function formatSectionsFromSearchTerm(
const selectedParticipantsWithoutDetails = selectedOptions.filter((participant) => {
const accountID = participant.accountID ?? null;
const isPartOfSearchTerm = getPersonalDetailSearchTerms(participant).join(' ').toLowerCase().includes(cleanSearchTerm);
const isReportInRecentReports = filteredRecentReports.some((report) => report.accountID === accountID);
const isReportInRecentReports = filteredRecentReports.some((report) => report.accountID === accountID) || filteredWorkspaceChats.some((report) => report.accountID === accountID);
const isReportInPersonalDetails = filteredPersonalDetails.some((personalDetail) => personalDetail.accountID === accountID);

return isPartOfSearchTerm && !isReportInRecentReports && !isReportInPersonalDetails;
});

Expand Down Expand Up @@ -1700,6 +1744,23 @@ function filterReports(reports: ReportUtils.OptionData[], searchTerms: string[])
return filteredReports;
}

function filterWorkspaceChats(reports: ReportUtils.OptionData[], searchTerms: string[]): ReportUtils.OptionData[] {
const filteredReports = searchTerms.reduceRight(
(items, term) =>
filterArrayByMatch(items, term, (item) => {
const values: string[] = [];
if (item.text) {
values.push(item.text);
}
return uniqFast(values);
}),
// We start from all unfiltered reports:
reports,
);

return filteredReports;
}

function filterPersonalDetails(personalDetails: ReportUtils.OptionData[], searchTerms: string[]): ReportUtils.OptionData[] {
return searchTerms.reduceRight(
(items, term) =>
Expand Down Expand Up @@ -1751,6 +1812,34 @@ function filterUserToInvite(options: Omit<Options, 'userToInvite'>, searchValue:
});
}

function filterSelfDMChat(report: ReportUtils.OptionData, searchTerms: string[]): ReportUtils.OptionData | undefined {
const isMatch = searchTerms.every((term) => {
const values: string[] = [];

if (report.text) {
values.push(report.text);
}
if (report.login) {
values.push(report.login);
values.push(report.login.replace(CONST.EMAIL_SEARCH_REGEX, ''));
}
if (report.isThread) {
if (report.alternateText) {
values.push(report.alternateText);
}
} else if (!!report.isChatRoom || !!report.isPolicyExpenseChat) {
if (report.subtitle) {
values.push(report.subtitle);
}
}

// Remove duplicate values and check if the term matches any value
return uniqFast(values).some((value) => value.includes(term));
});

return isMatch ? report : undefined;
}

function filterOptions(options: Options, searchInputValue: string, config?: FilterUserToInviteConfig): Options {
const parsedPhoneNumber = PhoneNumber.parsePhoneNumber(LoginUtils.appendCountryCode(Str.removeSMSDomain(searchInputValue)));
const searchValue = parsedPhoneNumber.possible && parsedPhoneNumber.number?.e164 ? parsedPhoneNumber.number.e164 : searchInputValue.toLowerCase();
Expand All @@ -1768,12 +1857,17 @@ function filterOptions(options: Options, searchInputValue: string, config?: Filt
searchValue,
config,
);
const workspaceChats = filterWorkspaceChats(options.workspaceChats ?? [], searchTerms);

const selfDMChat = options.selfDMChat ? filterSelfDMChat(options.selfDMChat, searchTerms) : undefined;

return {
personalDetails,
recentReports,
userToInvite,
currentUserOption,
workspaceChats,
selfDMChat,
};
}

Expand Down
Loading

0 comments on commit 96037d4

Please sign in to comment.