Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
41c2688
First batch of UI consistency changes
zfurtak Feb 28, 2026
23752c8
Merge
zfurtak Feb 28, 2026
e5c6d8e
Merge branch 'main' into @zfurtak/change-select-icons
zfurtak Feb 28, 2026
dee9301
Merge branch 'main' into @zfurtak/change-select-icons
zfurtak Mar 9, 2026
a8b7ac3
Fix lint errors
zfurtak Mar 10, 2026
e6f08e3
Moved SingleSelectItem to SelectionScreen
zfurtak Mar 16, 2026
89cb97c
Merge branch '@zfurtak/clean-after-migration' into @zfurtak/change-se…
zfurtak Mar 16, 2026
1f1b110
Prettier
zfurtak Mar 16, 2026
e2aa2b8
Fi ts
zfurtak Mar 16, 2026
8f301ee
Prettier
zfurtak Mar 16, 2026
4a19970
Add sentry label
zfurtak Mar 18, 2026
c0d0859
Merge branch '@zfurtak/clean-after-migration' into @zfurtak/change-se…
zfurtak Mar 18, 2026
87e6a36
Fix test
zfurtak Mar 18, 2026
a4e1dfd
Merge branch 'main' into @zfurtak/change-select-icons
zfurtak Mar 18, 2026
103f6e1
Fix test
zfurtak Mar 18, 2026
a51291e
Merge branch '@zfurtak/clean-after-migration' into @zfurtak/change-se…
zfurtak Mar 18, 2026
f4ba0af
Adjust InviteMemberListItem
zfurtak Mar 18, 2026
d0ce3e6
Adjust SingleSelectItem
zfurtak Mar 18, 2026
08f4a2a
Adjust SingleSelectListItem
zfurtak Mar 19, 2026
b4bd719
Fix styles and remaining lists
zfurtak Mar 19, 2026
96cfe2f
Merge branch '@zfurtak/clean-after-migration' into @zfurtak/change-se…
zfurtak Mar 19, 2026
f539ff7
Merge branch 'revert/revert/migrate-NewChatPage' into @zfurtak/change…
zfurtak Mar 19, 2026
d983351
Merge branch '@zfurtak/clean-after-migration' into @zfurtak/change-se…
zfurtak Mar 20, 2026
ce29c1c
Revert Mobile-Expensify change
zfurtak Mar 20, 2026
8af6f2a
Fix eslint warnings
zfurtak Mar 20, 2026
3a2c9e1
Merge branch 'main' into @zfurtak/change-select-icons
zfurtak Mar 20, 2026
6086119
Fix ts
zfurtak Mar 20, 2026
fcc5f94
Adjust tests
zfurtak Mar 20, 2026
827f40d
Merge branch 'main' into @zfurtak/change-select-icons
zfurtak Mar 24, 2026
fd84c64
Revert some changes
zfurtak Mar 24, 2026
ac71781
Adjustments after review
zfurtak Mar 24, 2026
3fada80
Revert file change
zfurtak Mar 24, 2026
408dee7
Fix files issue
zfurtak Mar 24, 2026
dbb9098
Merge branch 'main' into @zfurtak/change-select-icons
zfurtak Mar 25, 2026
e99c4aa
Remove manual memoization from BaseOnboardingAccounting
zfurtak Mar 25, 2026
4cef6d2
Adjust OptionItem and CardListItem
zfurtak Mar 25, 2026
e56e16c
Adjustments after review
zfurtak Mar 26, 2026
827491d
Fix hover when using arrows
zfurtak Mar 26, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import InputWrapper from '@components/Form/InputWrapper';
import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
import SelectionList from '@components/SelectionList';
import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
import TextInput from '@components/TextInput';
import useLocalize from '@hooks/useLocalize';
import usePermissions from '@hooks/usePermissions';
Expand Down Expand Up @@ -132,14 +132,12 @@ function PaymentCardChangeCurrencyForm({changeBillingCurrency, isSecurityCodeReq
<View style={[styles.mh5, styles.flexGrow1]}>
<SelectionList
data={currencyOptions}
ListItem={RadioListItem}
ListItem={SingleSelectListItem}
onSelectRow={(option) => {
selectCurrency(option.value);
}}
style={{containerStyle: styles.mhn5}}
initiallyFocusedItemKey={currency}
customListHeader={<PaymentCardCurrencyHeader isSectionList />}
shouldStopPropagation
/>
</View>
);
Expand Down
5 changes: 2 additions & 3 deletions src/components/AddPaymentCard/PaymentCardCurrencyModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
import Modal from '@components/Modal';
import ScreenWrapper from '@components/ScreenWrapper';
import SelectionList from '@components/SelectionList';
import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import Navigation from '@libs/Navigation/Navigation';
Expand Down Expand Up @@ -67,11 +67,10 @@ function PaymentCardCurrencyModal({isVisible, currencies, currentCurrency = CONS
/>
<SelectionList
data={currencyOptions}
ListItem={RadioListItem}
ListItem={SingleSelectListItem}
onSelectRow={(option) => {
onCurrencyChange(option.value);
}}
initiallyFocusedItemKey={currentCurrency}
showScrollIndicator
/>
</ScreenWrapper>
Expand Down
12 changes: 7 additions & 5 deletions src/components/AddPlaidBankAccount.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -251,9 +251,11 @@ function AddPlaidBankAccount({

return (
<FullPageOfflineBlockingView>
<Text style={[styles.mb3, styles.textHeadlineLineHeightXXL]}>{translate(isDisplayedInWalletFlow ? 'walletPage.chooseYourBankAccount' : 'bankAccount.chooseAnAccount')}</Text>
{!!text && <Text style={[styles.mb6, styles.textSupporting]}>{text}</Text>}
<View style={[styles.flexRow, styles.alignItemsCenter, styles.mb6]}>
<Text style={[styles.mh5, styles.mb3, styles.textHeadlineLineHeightXXL]}>
{translate(isDisplayedInWalletFlow ? 'walletPage.chooseYourBankAccount' : 'bankAccount.chooseAnAccount')}
</Text>
{!!text && <Text style={[styles.mh5, styles.mb6, styles.textSupporting]}>{text}</Text>}
<View style={[styles.mh5, styles.flexRow, styles.alignItemsCenter, styles.mb6]}>
<Icon
src={icon}
height={iconSize}
Expand All @@ -267,12 +269,12 @@ function AddPlaidBankAccount({
)}
</View>
</View>
<Text style={[styles.textLabelSupporting]}>{`${translate('bankAccount.chooseAnAccountBelow')}:`}</Text>
<Text style={[styles.textLabelSupporting, styles.mh5]}>{`${translate('bankAccount.chooseAnAccountBelow')}:`}</Text>
<RadioButtons
items={options}
defaultCheckedValue={defaultSelectedPlaidAccountID}
onPress={handleSelectingPlaidAccount}
radioButtonStyle={[styles.mb6]}
radioButtonStyle={[styles.optionRowCompact, styles.ph5]}
/>
<FormHelpMessage message={errorText} />
</FullPageOfflineBlockingView>
Expand Down
1 change: 1 addition & 0 deletions src/components/ApproverSelectionList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ function ApproverSelectionList({
shouldUpdateFocusedIndex={shouldUpdateFocusedIndex}
showScrollIndicator
isRowMultilineSupported
shouldShowRadioButton
/>
</FullPageNotFoundView>
</ScreenWrapper>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ function BaseVacationDelegateSelectionComponent({
onEndReached={onListEndReached}
shouldSingleExecuteRowSelect
shouldShowTextInput
shouldShowRadioButton
/>
</View>
)}
Expand Down
4 changes: 2 additions & 2 deletions src/components/CategoryPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {getHeaderMessageForNonUserList} from '@libs/OptionsListUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import RadioListItem from './SelectionList/ListItem/RadioListItem';
import SingleSelectListItem from './SelectionList/ListItem/SingleSelectListItem';
import SelectionListWithSections from './SelectionList/SelectionListWithSections';
import type {ListItem} from './SelectionList/types';

Expand Down Expand Up @@ -80,7 +80,7 @@ function CategoryPicker({selectedCategory, policyID, onSubmit, addBottomSafeArea
<SelectionListWithSections
sections={sections}
onSelectRow={onSubmit}
ListItem={RadioListItem}
ListItem={SingleSelectListItem}
shouldShowTextInput={categoriesCount >= CONST.STANDARD_LIST_ITEM_LIMIT}
textInputOptions={textInputOptions}
initiallyFocusedItemKey={selectedOptionKey}
Expand Down
4 changes: 2 additions & 2 deletions src/components/CountryPicker/CountrySelectorModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
import Modal from '@components/Modal';
import ScreenWrapper from '@components/ScreenWrapper';
import SelectionList from '@components/SelectionList';
import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
import useDebouncedState from '@hooks/useDebouncedState';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
Expand Down Expand Up @@ -90,7 +90,7 @@ function CountrySelectorModal({isVisible, currentCountry, onCountrySelected, onC
data={searchResults}
textInputOptions={textInputOptions}
onSelectRow={onCountrySelected}
ListItem={RadioListItem}
ListItem={SingleSelectListItem}
initiallyFocusedItemKey={currentCountry}
shouldSingleExecuteRowSelect
shouldStopPropagation
Expand Down
9 changes: 7 additions & 2 deletions src/components/CurrencySelectionList/index.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import {Str} from 'expensify-common';
import React, {useState} from 'react';
import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
import SelectionListWithSections from '@components/SelectionList/SelectionListWithSections';
import {useCurrencyListActions, useCurrencyListState} from '@hooks/useCurrencyList';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import getMatchScore from '@libs/getMatchScore';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import type {CurrencyListItem, CurrencySelectionListProps} from './types';
Expand All @@ -22,6 +23,7 @@ function CurrencySelectionList({
const {getCurrencySymbol} = useCurrencyListActions();
const [searchValue, setSearchValue] = useState('');
const {translate} = useLocalize();
const styles = useThemeStyles();
const getUnselectedOptions = (options: CurrencyListItem[]) => options.filter((option) => !option.isSelected);

const currencyOptions: CurrencyListItem[] = Object.entries(currencyList).reduce((acc, [currencyCode, currencyInfo]) => {
Expand Down Expand Up @@ -101,8 +103,11 @@ function CurrencySelectionList({
// eslint-disable-next-line react/jsx-props-no-spreading
{...restProps}
sections={sections}
ListItem={RadioListItem}
ListItem={SingleSelectListItem}
onSelectRow={onSelect}
style={{
listItemWrapperStyle: styles.optionRow,
}}
textInputOptions={textInputOptions}
shouldShowTextInput={!!searchInputLabel}
shouldSingleExecuteRowSelect
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
import Modal from '@components/Modal';
import ScreenWrapper from '@components/ScreenWrapper';
import SelectionList from '@components/SelectionList';
import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import CONST from '@src/CONST';
Expand Down Expand Up @@ -81,7 +81,7 @@ function YearPickerModal({isVisible, years, currentYear = new Date().getFullYear
/>
<SelectionList
data={data}
ListItem={RadioListItem}
ListItem={SingleSelectListItem}
onSelectRow={(option) => {
Keyboard.dismiss();
onYearChange?.(option.value);
Expand Down
4 changes: 2 additions & 2 deletions src/components/DestinationPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import type {Destination} from '@libs/PerDiemRequestUtils';
import {getPerDiemCustomUnit} from '@libs/PolicyUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import RadioListItem from './SelectionList/ListItem/RadioListItem';
import SingleSelectListItem from './SelectionList/ListItem/SingleSelectListItem';
import SelectionListWithSections from './SelectionList/SelectionListWithSections';
import type {ListItem, SelectionListWithSectionsHandle} from './SelectionList/types';

Expand Down Expand Up @@ -80,7 +80,7 @@ function DestinationPicker({selectedDestination, policyID, onSubmit, ref}: Desti
shouldShowTextInput={shouldShowTextInput}
textInputOptions={textInputOptions}
onSelectRow={onSubmit}
ListItem={RadioListItem}
ListItem={SingleSelectListItem}
initiallyFocusedItemKey={selectedOptionKey}
shouldHideKeyboardOnScroll={false}
shouldUpdateFocusedIndex
Expand Down
14 changes: 8 additions & 6 deletions src/components/FeedbackSurvey.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -108,19 +108,21 @@ function FeedbackSurvey({title, description, onSubmit, optionRowStyles, footerTe
isSubmitButtonVisible={false}
enabledWhenOffline={enabledWhenOffline}
>
<View style={styles.mh5}>
<Text style={styles.textHeadline}>{title}</Text>
<Text style={[styles.mt1, styles.mb3, styles.textNormalThemeText]}>{description}</Text>
<View>
<View style={styles.mh5}>
<Text style={styles.textHeadline}>{title}</Text>
<Text style={[styles.mt1, styles.textNormalThemeText]}>{description}</Text>
</View>
<InputWrapper
InputComponent={RadioButtons}
inputID={INPUT_IDS.REASON}
items={options}
radioButtonStyle={[styles.mb7, optionRowStyles]}
radioButtonStyle={[styles.optionRowCompact, styles.ph5, optionRowStyles]}
onPress={handleOptionSelect}
shouldSaveDraft
/>
{!!reason && (
<>
<View style={[styles.mh5, styles.mt4]}>
<Text style={[styles.textNormalThemeText, styles.mb3]}>{translate('feedbackSurvey.additionalInfoTitle')}</Text>
<InputWrapper
InputComponent={TextInput}
Expand All @@ -131,7 +133,7 @@ function FeedbackSurvey({title, description, onSubmit, optionRowStyles, footerTe
onChangeText={handleSetNote}
shouldSaveDraft
/>
</>
</View>
)}
</View>
<FixedFooter style={styles.pb0}>
Expand Down
4 changes: 2 additions & 2 deletions src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@
import MoneyRequestConfirmationListFooter from './MoneyRequestConfirmationListFooter';
import {PressableWithFeedback} from './Pressable';
import {useProductTrainingContext} from './ProductTrainingContext';
import UserListItem from './SelectionList/ListItem/UserListItem';
import NewChatListItem from './Search/NewChatListItem';
import SelectionListWithSections from './SelectionList/SelectionListWithSections';
import type {Section} from './SelectionList/SelectionListWithSections/types';
import SettlementButton from './SettlementButton';
Expand Down Expand Up @@ -1148,7 +1148,7 @@
iouType,
policy,
policyTagLists,
selectedParticipants,

Check warning on line 1151 in src/components/MoneyRequestConfirmationList.tsx

View workflow job for this annotation

GitHub Actions / ESLint check

React Hook useCallback has a missing dependency: 'isNewManualExpenseFlowEnabled'. Either include it or remove the dependency array

Check warning on line 1151 in src/components/MoneyRequestConfirmationList.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

React Hook useCallback has a missing dependency: 'isNewManualExpenseFlowEnabled'. Either include it or remove the dependency array
isEditingSplitBill,
isMerchantRequired,
isMerchantEmpty,
Expand Down Expand Up @@ -1392,7 +1392,7 @@
<MouseProvider>
<SelectionListWithSections<MoneyRequestConfirmationListItem>
sections={sections}
ListItem={UserListItem}
ListItem={NewChatListItem}
onSelectRow={navigateToParticipantPage}
shouldSingleExecuteRowSelect
shouldPreventDefaultFocusOnSelectRow
Expand Down
14 changes: 10 additions & 4 deletions src/components/OptionsPicker/OptionItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type {StyleProp, ViewStyle} from 'react-native';
import {View} from 'react-native';
import Icon from '@components/Icon';
import {PressableWithFeedback} from '@components/Pressable';
import SelectCircle from '@components/SelectCircle';
import SelectionCheckbox from '@components/SelectionList/components/SelectionCheckbox';
import Text from '@components/Text';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
Expand Down Expand Up @@ -55,9 +55,15 @@ function OptionItem({title, icon, onPress, isSelected = false, isDisabled, style
/>
{(isSelected || !isDisabled) && (
<View>
<SelectCircle
isChecked={isSelected}
selectCircleStyles={styles.sectionSelectCircle}
<SelectionCheckbox
item={{
isSelected,
text: translate(title),
keyForList: title,
}}
isCircular
onSelectRow={() => onPress?.()}
accessibilityLabel={translate(title)}
/>
</View>
)}
Expand Down
4 changes: 2 additions & 2 deletions src/components/PushRowWithModal/PushRowModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton';
import Modal from '@components/Modal';
import ScreenWrapper from '@components/ScreenWrapper';
import SelectionList from '@components/SelectionList';
import RadioListItem from '@components/SelectionList/ListItem/RadioListItem';
import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
import useDebouncedState from '@hooks/useDebouncedState';
import useLocalize from '@hooks/useLocalize';
import searchOptions from '@libs/searchOptions';
Expand Down Expand Up @@ -99,7 +99,7 @@ function PushRowModal({isVisible, selectedOption, onOptionChange, onClose, optio
/>
<SelectionList
data={searchResults}
ListItem={RadioListItem}
ListItem={SingleSelectListItem}
onSelectRow={handleSelectRow}
textInputOptions={textInputOptions}
initiallyFocusedItemKey={selectedOption}
Expand Down
2 changes: 1 addition & 1 deletion src/components/RadioButtons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ function RadioButtons({items, onPress, defaultCheckedValue = '', radioButtonStyl
<RadioButtonWithLabel
key={item.value}
isChecked={item.value === checkedValue}
style={[styles.mb4, radioButtonStyle]}
style={[radioButtonStyle]}
onPress={() => {
setLocalValue(item.value);
onInputChange(item.value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ function DatePresetFilterBase({
}}
onSelectRow={() => setDateValue(CONST.SEARCH.DATE_MODIFIERS.ON, preset)}
keyForList={preset}
wrapperStyle={styles.flexReset}
wrapperStyle={(styles.flexReset, styles.optionRowCompact)}
/>
))}
{shouldShowHorizontalRule && (
Expand Down
Loading
Loading