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

[TS migration] Remove 'OptionsSelector' component #41077

Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
e3e9e7b
wip
war-in Apr 23, 2024
0ab6923
wip....
war-in Apr 23, 2024
3f1c13c
show tick next to payee
war-in Apr 23, 2024
7cd7718
show amount
war-in Apr 26, 2024
0eff692
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in Apr 26, 2024
b05192b
align items
war-in Apr 26, 2024
1e65a85
remove optionsSelector
war-in Apr 26, 2024
affc169
fix typecheck
war-in Apr 26, 2024
1ad6d78
styling
war-in Apr 26, 2024
3db3fb4
add correct styling
war-in Apr 26, 2024
f5148ed
use ScrollView
war-in Apr 29, 2024
115be37
add second ScrollView to get rid of error
war-in Apr 29, 2024
01840ca
styling
war-in Apr 29, 2024
04b9907
use SelectionList as main component
war-in Apr 29, 2024
dadec41
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in Apr 29, 2024
b34b47e
fix lint
war-in Apr 29, 2024
08b162e
move children to `listFooterContent`
war-in Apr 29, 2024
1259b8d
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in Apr 29, 2024
3eb6751
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in Apr 30, 2024
eb8d61e
prettier
war-in Apr 30, 2024
830d71c
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in May 6, 2024
48d9fdd
review suggestions
war-in May 7, 2024
3d36eb2
add styles and do not show ✅
war-in May 7, 2024
838ebdf
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in May 7, 2024
6adda9c
wip
war-in May 7, 2024
fbb7b60
almost done (there are still some bugs)
war-in May 7, 2024
f2ba6c4
fix errors
war-in May 10, 2024
0ad9d3a
fix typecheck
war-in May 10, 2024
d673fc0
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in May 13, 2024
492ea96
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in May 13, 2024
c274163
remove ArrowKeyFocusManager.js
war-in May 13, 2024
d9a5d2f
show non-editable amount when needed
war-in May 13, 2024
de9138d
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in May 13, 2024
dcc0582
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in May 14, 2024
929d7f1
fix padding
war-in May 14, 2024
720900d
Merge branch 'refs/heads/main' into war-in/options-selector-removal
war-in May 14, 2024
8cc152c
padding -> margin
war-in May 14, 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
4 changes: 2 additions & 2 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3509,10 +3509,10 @@ const CONST = {
BACK_BUTTON_NATIVE_ID: 'backButton',

/**
* The maximum count of items per page for OptionsSelector.
* The maximum count of items per page for SelectionList.
* When paginate, it multiplies by page number.
*/
MAX_OPTIONS_SELECTOR_PAGE_LENGTH: 500,
MAX_SELECTION_LIST_PAGE_LENGTH: 500,

/**
* Bank account names
Expand Down
182 changes: 89 additions & 93 deletions src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import {format} from 'date-fns';
import Str from 'expensify-common/lib/str';
import React, {useCallback, useEffect, useMemo, useReducer, useState} from 'react';
import {View} from 'react-native';
import type {StyleProp, ViewStyle} from 'react-native';
import {withOnyx} from 'react-native-onyx';
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
Expand Down Expand Up @@ -47,10 +46,11 @@ import FormHelpMessage from './FormHelpMessage';
import MenuItem from './MenuItem';
import MenuItemWithTopDescription from './MenuItemWithTopDescription';
import {usePersonalDetails} from './OnyxProvider';
import OptionsSelector from './OptionsSelector';
import PDFThumbnail from './PDFThumbnail';
import ReceiptEmptyState from './ReceiptEmptyState';
import ReceiptImage from './ReceiptImage';
import SelectionList from './SelectionList';
import InviteMemberListItem from './SelectionList/InviteMemberListItem';
import SettlementButton from './SettlementButton';
import ShowMoreButton from './ShowMoreButton';
import Switch from './Switch';
Expand Down Expand Up @@ -149,9 +149,6 @@ type MoneyRequestConfirmationListProps = MoneyRequestConfirmationListOnyxProps &
/** File name of the receipt */
receiptFilename?: string;

/** List styles for OptionsSelector */
listStyles?: StyleProp<ViewStyle>;

/** Transaction that represents the expense */
transaction?: OnyxEntry<OnyxTypes.Transaction>;

Expand Down Expand Up @@ -216,7 +213,6 @@ function MoneyRequestConfirmationList({
receiptPath = '',
iouComment,
receiptFilename = '',
listStyles,
iouCreated,
iouIsBillable = false,
onToggleBillable,
Expand Down Expand Up @@ -432,11 +428,14 @@ function MoneyRequestConfirmationList({
];
const canModifyParticipants = !isReadOnly && canModifyParticipantsProp && hasMultipleParticipants;
const shouldDisablePaidBySection = canModifyParticipants;
const optionSelectorSections = useMemo(() => {
const selectionListSections = useMemo(() => {
const sections = [];
const unselectedParticipants = selectedParticipantsProp.filter((participant) => !participant.selected);
if (hasMultipleParticipants) {
const formattedSelectedParticipants = getParticipantsWithAmount(selectedParticipants);
const formattedSelectedParticipants = getParticipantsWithAmount(selectedParticipants).map((participant) => ({
...participant,
rightElement: 'descriptiveText' in participant && <Text>{participant.descriptiveText}</Text>,
}));
war-in marked this conversation as resolved.
Show resolved Hide resolved
let formattedParticipantsList = [...new Set([...formattedSelectedParticipants, ...unselectedParticipants])];

if (!canModifyParticipants) {
Expand All @@ -456,14 +455,15 @@ function MoneyRequestConfirmationList({
sections.push(
{
title: translate('moneyRequestConfirmationList.paidBy'),
data: [formattedPayeeOption],
data: [{...formattedPayeeOption, isSelected: true, rightElement: <Text>{formattedPayeeOption.descriptiveText}</Text>}],
war-in marked this conversation as resolved.
Show resolved Hide resolved
shouldShow: true,
isDisabled: shouldDisablePaidBySection,
},
{
title: translate('moneyRequestConfirmationList.splitWith'),
data: formattedParticipantsList,
shouldShow: true,
isDisabled: !canModifyParticipants,
},
);
} else {
Expand All @@ -475,6 +475,7 @@ function MoneyRequestConfirmationList({
title: translate('common.to'),
data: formattedSelectedParticipants,
shouldShow: true,
isDisabled: false,
});
}
return sections;
Expand All @@ -491,13 +492,6 @@ function MoneyRequestConfirmationList({
canModifyParticipants,
]);

const selectedOptions = useMemo(() => {
if (!hasMultipleParticipants) {
return [];
}
return [...selectedParticipants, OptionsListUtils.getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails)];
}, [selectedParticipants, hasMultipleParticipants, payeePersonalDetails]);

useEffect(() => {
if (!isDistanceRequest || isMovingTransactionFromTrackExpense) {
return;
Expand Down Expand Up @@ -570,7 +564,7 @@ function MoneyRequestConfirmationList({
/**
* Navigate to report details or profile of selected user
*/
const navigateToReportOrUserDetail = (option: ReportUtils.OptionData) => {
const navigateToReportOrUserDetail = (option: Participant) => {
const activeRoute = Navigation.getActiveRouteWithoutParams();

if (option.isSelfDM) {
Expand Down Expand Up @@ -1011,84 +1005,86 @@ function MoneyRequestConfirmationList({
titleWithTooltips={payeePersonalDetails?.isOptimisticPersonalDetail ? undefined : payeeTooltipDetails}
/>
)}
{/** @ts-expect-error This component is deprecated and will not be migrated to TypeScript (context: https://expensify.slack.com/archives/C01GTK53T8Q/p1709232289899589?thread_ts=1709156803.359359&cid=C01GTK53T8Q) */}
<OptionsSelector
sections={optionSelectorSections}
<SelectionList
canSelectMultiple={canModifyParticipants}
sections={selectionListSections}
ListItem={InviteMemberListItem}
onSelectRow={canModifyParticipants ? selectParticipant : navigateToReportOrUserDetail}
onAddToSelection={selectParticipant}
onConfirmSelection={confirm}
selectedOptions={selectedOptions}
canSelectMultipleOptions={canModifyParticipants}
disableArrowKeysActions={!canModifyParticipants}
boldStyle
showTitleTooltip
shouldTextInputAppearBelowOptions
shouldShowTextInput={false}
shouldUseStyleForChildren={false}
optionHoveredStyle={canModifyParticipants ? styles.hoveredComponentBG : {}}
shouldShowTooltips
sectionTitleStyles={styles.sidebarLinkTextBold}
showScrollIndicator
footerContent={footerContent}
listStyles={listStyles}
shouldAllowScrollingChildren
>
{isDistanceRequest && (
<View style={styles.confirmationListMapItem}>
<ConfirmedRoute transaction={transaction ?? ({} as OnyxTypes.Transaction)} />
</View>
)}
{isTypeInvoice && (
<MenuItem
key={translate('workspace.invoices.sendFrom')}
shouldShowRightIcon={!isReadOnly && canUpdateSenderWorkspace}
title={senderWorkspace?.name}
icon={senderWorkspace?.avatar ? senderWorkspace?.avatar : getDefaultWorkspaceAvatar(senderWorkspace?.name)}
iconType={CONST.ICON_TYPE_WORKSPACE}
description={translate('workspace.common.workspace')}
label={translate('workspace.invoices.sendFrom')}
isLabelHoverable={false}
interactive={!isReadOnly && canUpdateSenderWorkspace}
onPress={() => {
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_SEND_FROM.getRoute(iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()));
}}
style={styles.moneyRequestMenuItem}
labelStyle={styles.mt2}
titleStyle={styles.flex1}
disabled={didConfirm || !canUpdateSenderWorkspace}
/>
)}
{!isDistanceRequest &&
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
(receiptImage || receiptThumbnail
? receiptThumbnailContent
: // The empty receipt component should only show for IOU Requests of a paid policy ("Team" or "Corporate")
PolicyUtils.isPaidGroupPolicy(policy) &&
!isDistanceRequest &&
iouType === CONST.IOU.TYPE.SUBMIT && (
<ReceiptEmptyState
onPress={() =>
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_SCAN.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams()),
)
}
/>
))}
{primaryFields}
{!shouldShowAllFields && (
<ShowMoreButton
containerStyle={[styles.mt1, styles.mb2]}
onPress={toggleShouldExpandFields}
/>
)}
{shouldShowAllFields && supplementaryFields}
<ConfirmModal
title={translate('attachmentPicker.wrongFileType')}
onConfirm={navigateBack}
onCancel={navigateBack}
isVisible={isAttachmentInvalid}
prompt={translate('attachmentPicker.protectedPDFNotSupported')}
confirmText={translate('common.close')}
shouldShowCancelButton={false}
/>
</OptionsSelector>
listFooterContent={
<>
{isDistanceRequest && (
<View style={styles.confirmationListMapItem}>
<ConfirmedRoute transaction={transaction ?? ({} as OnyxTypes.Transaction)} />
</View>
)}
{isTypeInvoice && (
<MenuItem
key={translate('workspace.invoices.sendFrom')}
shouldShowRightIcon={!isReadOnly && canUpdateSenderWorkspace}
title={senderWorkspace?.name}
icon={senderWorkspace?.avatar ? senderWorkspace?.avatar : getDefaultWorkspaceAvatar(senderWorkspace?.name)}
iconType={CONST.ICON_TYPE_WORKSPACE}
description={translate('workspace.common.workspace')}
label={translate('workspace.invoices.sendFrom')}
isLabelHoverable={false}
interactive={!isReadOnly && canUpdateSenderWorkspace}
onPress={() => {
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_SEND_FROM.getRoute(iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
);
}}
style={styles.moneyRequestMenuItem}
labelStyle={styles.mt2}
titleStyle={styles.flex1}
disabled={didConfirm || !canUpdateSenderWorkspace}
/>
)}
{!isDistanceRequest &&
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
(receiptImage || receiptThumbnail
? receiptThumbnailContent
: // The empty receipt component should only show for IOU Requests of a paid policy ("Team" or "Corporate")
PolicyUtils.isPaidGroupPolicy(policy) &&
!isDistanceRequest &&
iouType === CONST.IOU.TYPE.SUBMIT && (
<ReceiptEmptyState
onPress={() =>
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_SCAN.getRoute(
CONST.IOU.ACTION.CREATE,
iouType,
transactionID,
reportID,
Navigation.getActiveRouteWithoutParams(),
),
)
}
/>
))}
{primaryFields}
{!shouldShowAllFields && (
<ShowMoreButton
containerStyle={[styles.mt1, styles.mb2]}
onPress={toggleShouldExpandFields}
/>
)}
{shouldShowAllFields && supplementaryFields}
<ConfirmModal
title={translate('attachmentPicker.wrongFileType')}
onConfirm={navigateBack}
onCancel={navigateBack}
isVisible={isAttachmentInvalid}
prompt={translate('attachmentPicker.protectedPDFNotSupported')}
confirmText={translate('common.close')}
shouldShowCancelButton={false}
/>
</>
}
/>
</>
);
}
Expand Down
Loading
Loading