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

Limit tag list to 500 items #31447

Merged
merged 32 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
c570773
add a limit const
rezkiy37 Nov 14, 2023
8e0ab70
implement a limit
rezkiy37 Nov 14, 2023
f12d261
Merge branch 'main' of https://github.com/rezkiy37/Expensify into fea…
rezkiy37 Nov 15, 2023
a5c9de5
Revert "implement a limit"
rezkiy37 Nov 15, 2023
5d07521
Create ShowMore component
rezkiy37 Nov 16, 2023
c8928e7
add strings
rezkiy37 Nov 16, 2023
653deac
add ability to pass footer to OptionsList
rezkiy37 Nov 16, 2023
b95cf0e
integrate pagination for OptionsSelector
rezkiy37 Nov 16, 2023
a820d4e
rename a const
rezkiy37 Nov 16, 2023
ffd144e
integrate inserts for TagPicker and enable pagination
rezkiy37 Nov 16, 2023
82c9f1c
reuse ShowMore
rezkiy37 Nov 16, 2023
a1a62c7
allow pass container style for ShowMore
rezkiy37 Nov 16, 2023
0bcc5a9
Merge branch 'main' of https://github.com/rezkiy37/Expensify into fea…
rezkiy37 Nov 17, 2023
09e72c7
add periods
rezkiy37 Nov 17, 2023
e2d780d
remove empty lines
rezkiy37 Nov 17, 2023
19ca4ac
calculate all visible options
rezkiy37 Nov 17, 2023
2cde176
Merge branch 'main' of https://github.com/rezkiy37/Expensify into fea…
rezkiy37 Nov 17, 2023
c29740a
Merge branch 'main' of https://github.com/rezkiy37/Expensify into fea…
rezkiy37 Nov 20, 2023
19ff8d8
describe prop better
rezkiy37 Nov 20, 2023
059a302
convert getter to methods
rezkiy37 Nov 20, 2023
8f952bc
increase bottom spacing
rezkiy37 Nov 20, 2023
1de984d
Merge branch 'main' of https://github.com/rezkiy37/Expensify into fea…
rezkiy37 Nov 21, 2023
0f794ec
Merge branch 'main' of https://github.com/rezkiy37/Expensify into fea…
rezkiy37 Nov 22, 2023
b08423a
integrate limitation generally
rezkiy37 Nov 22, 2023
9520db9
fix component did update
rezkiy37 Nov 22, 2023
3234a9b
Merge branch 'main' of https://github.com/rezkiy37/Expensify into fea…
rezkiy37 Nov 22, 2023
96c23a4
convert to built in feature
rezkiy37 Nov 22, 2023
f99086a
rename const
rezkiy37 Nov 25, 2023
49154ff
minor updates BaseOptionsSelector
rezkiy37 Nov 25, 2023
b4d1537
rename ShowMoreButton
rezkiy37 Nov 25, 2023
1080ca0
clarify comments
rezkiy37 Nov 25, 2023
c4f1f63
clarify comment
rezkiy37 Nov 27, 2023
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
2 changes: 2 additions & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2900,6 +2900,8 @@ const CONST = {
LEARN_MORE_LINK: 'https://help.expensify.com/articles/new-expensify/getting-started/Referral-Program',
LINK: 'https://join.my.expensify.com',
},

MAX_COUNT_OF_TAGS: 500,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should set this max for anything that uses this optionList component - categories, tags, etc. Not just tags.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, you mean to set this limit by default? Right now it works like a property we can pass.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's what I was thinking yeah. Though I'm not sure all the places this component is used, so it'd be good to sanity-check that it makes sense.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can find all places and will post it here.

Copy link
Contributor Author

@rezkiy37 rezkiy37 Nov 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, @puneetlath, the component is BaseOptionsSelector and being used for 8 cases: Category Picker, Tag Picker, Money Request participant, Split Bill participant, Search, Start Chat. Task Assign, Task Share.

Screenshoots Screenshot 2023-11-22 at 17 08 31 Category Picker Money Request:Split Bill Search Start Chat Tag Picker Task Assign Task Share

Obviously, I've tried to test the limitation. Actually, I like how it works for all cases.
Note: for this video I've changed the limitation to 10 items per page. You can also set any value.

Example.mp4

Added a commit - b08423a.

cc @rushatgabhane

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And it'll be nice that any field that uses the options selector in the future, will automatically have this "show more" button built in. I don't even think we need to make it a prop. We could just make it a feature of that component. If in the future someone wants to make it configurable, then they can add it as a prop.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exactly, agree.

So, updating... Thank you for quick feedback 😉

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done - 96c23a4.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I love the consistency in behavior across all these screens! 🙌

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like we are all aligned, so waiting on the review. @rushatgabhane, your turn 😉

} as const;

export default CONST;
21 changes: 5 additions & 16 deletions src/components/MoneyRequestConfirmationList.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,16 @@ import * as IOU from '@userActions/IOU';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import Button from './Button';
import ButtonWithDropdownMenu from './ButtonWithDropdownMenu';
import categoryPropTypes from './categoryPropTypes';
import ConfirmedRoute from './ConfirmedRoute';
import FormHelpMessage from './FormHelpMessage';
import * as Expensicons from './Icon/Expensicons';
import Image from './Image';
import MenuItemWithTopDescription from './MenuItemWithTopDescription';
import optionPropTypes from './optionPropTypes';
import OptionsSelector from './OptionsSelector';
import SettlementButton from './SettlementButton';
import ShowMore from './ShowMore';
import Switch from './Switch';
import tagPropTypes from './tagPropTypes';
import Text from './Text';
Expand Down Expand Up @@ -635,20 +634,10 @@ function MoneyRequestConfirmationList(props) {
numberOfLinesTitle={2}
/>
{!shouldShowAllFields && (
<View style={[styles.flexRow, styles.justifyContentBetween, styles.mh3, styles.alignItemsCenter, styles.mb2, styles.mt1]}>
<View style={[styles.shortTermsHorizontalRule, styles.flex1, styles.mr0]} />
<Button
small
onPress={toggleShouldExpandFields}
text={translate('common.showMore')}
shouldShowRightIcon
iconRight={Expensicons.DownArrow}
iconFill={theme.icon}
style={styles.mh0}
/>

<View style={[styles.shortTermsHorizontalRule, styles.flex1, styles.ml0]} />
</View>
<ShowMore
containerStyle={styles.mt1}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bottom margin missed here which caused #33758

onPress={toggleShouldExpandFields}
/>
)}
{shouldShowAllFields && (
<>
Expand Down
2 changes: 2 additions & 0 deletions src/components/OptionsList/BaseOptionsList.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ function BaseOptionsList({
isLoadingNewOptions,
nestedScrollEnabled,
bounces,
renderFooterContent,
}) {
const styles = useThemeStyles();
const flattenedData = useRef();
Expand Down Expand Up @@ -286,6 +287,7 @@ function BaseOptionsList({
viewabilityConfig={{viewAreaCoveragePercentThreshold: 95}}
onViewableItemsChanged={onViewableItemsChanged}
bounces={bounces}
ListFooterComponent={renderFooterContent}
/>
</>
)}
Expand Down
4 changes: 4 additions & 0 deletions src/components/OptionsList/optionsListPropTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ const propTypes = {

/** Whether the list should have a bounce effect on iOS */
bounces: PropTypes.bool,

/** Custom content to display in the floating footer */
renderFooterContent: PropTypes.func,
};

const defaultProps = {
Expand Down Expand Up @@ -130,6 +133,7 @@ const defaultProps = {
isLoadingNewOptions: false,
nestedScrollEnabled: true,
bounces: true,
renderFooterContent: undefined,
};

export {propTypes, defaultProps};
62 changes: 60 additions & 2 deletions src/components/OptionsSelector/BaseOptionsSelector.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import Icon from '@components/Icon';
import {Info} from '@components/Icon/Expensicons';
import OptionsList from '@components/OptionsList';
import {PressableWithoutFeedback} from '@components/Pressable';
import ShowMore from '@components/ShowMore';
import Text from '@components/Text';
import TextInput from '@components/TextInput';
import withLocalize, {withLocalizePropTypes} from '@components/withLocalize';
Expand Down Expand Up @@ -74,6 +75,7 @@ class BaseOptionsSelector extends Component {
this.selectFocusedOption = this.selectFocusedOption.bind(this);
this.addToSelection = this.addToSelection.bind(this);
this.updateSearchValue = this.updateSearchValue.bind(this);
this.incrementPage = this.incrementPage.bind(this);
this.relatedTarget = null;

const allOptions = this.flattenSections();
Expand All @@ -85,6 +87,7 @@ class BaseOptionsSelector extends Component {
shouldDisableRowSelection: false,
shouldShowReferralModal: false,
errorMessage: '',
paginationPage: 1,
};
}

Expand Down Expand Up @@ -189,8 +192,43 @@ class BaseOptionsSelector extends Component {
return defaultIndex;
}

/**
* When pagination is enabled,
puneetlath marked this conversation as resolved.
Show resolved Hide resolved
* maps sections to render only allowed count of them.
puneetlath marked this conversation as resolved.
Show resolved Hide resolved
*/
get sections() {
if (!_.isNumber(this.props.itemsPerPage)) {
return this.props.sections;
}

return _.map(this.props.sections, (section) => {
if (_.isEmpty(section.data)) {
return section;
}

return {
...section,
data: section.data.slice(0, this.props.itemsPerPage * this.state.paginationPage),
};
});
}

/**
* Calculates all exactly visible options of sections.
rezkiy37 marked this conversation as resolved.
Show resolved Hide resolved
*/
get allVisibleOptionsCount() {
Copy link
Member

@rushatgabhane rushatgabhane Nov 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

get
This is new syntax. was there a discussion on it's usage?

We shouldn't use new code patterns without getting a buy-in from most of the team because it can reduce readability.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got you, I will update it to methods.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done - 059a302.

let count = 0;

_.forEach(this.sections, (section) => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

did you mean this.props.sections?

i can't find sections being defined anywhere in the class. Is it the get syntax binding it to the class?

Suggested change
_.forEach(this.sections, (section) => {
_.forEach(this.props.sections, (section) => {

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is the get syntax. I will update it in order of removing the get.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done - 059a302.

count += lodashGet(section, 'data.length', 0);
});

return count;
}

updateSearchValue(value) {
this.setState({
paginationPage: 1,
errorMessage: value.length > this.props.maxLength ? this.props.translate('common.error.characterLimitExceedCounter', {length: value.length, limit: this.props.maxLength}) : '',
});

Expand Down Expand Up @@ -387,7 +425,17 @@ class BaseOptionsSelector extends Component {
this.props.onAddToSelection(option);
}

/**
* Increments a pagination page to show more items
*/
incrementPage() {
this.setState((prev) => ({
paginationPage: prev.paginationPage + 1,
}));
}

render() {
const shouldShowShowMore = this.state.allOptions.length > this.props.itemsPerPage * this.state.paginationPage;
const shouldShowFooter =
!this.props.isReadOnly && (this.props.shouldShowConfirmButton || this.props.footerContent) && !(this.props.canSelectMultipleOptions && _.isEmpty(this.props.selectedOptions));
const defaultConfirmButtonText = _.isUndefined(this.props.confirmButtonText) ? this.props.translate('common.confirm') : this.props.confirmButtonText;
Expand Down Expand Up @@ -424,7 +472,7 @@ class BaseOptionsSelector extends Component {
ref={(el) => (this.list = el)}
optionHoveredStyle={this.props.optionHoveredStyle}
onSelectRow={this.props.onSelectRow ? this.selectRow : undefined}
sections={this.props.sections}
sections={this.sections}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done - 059a302.

focusedIndex={this.state.focusedIndex}
selectedOptions={this.props.selectedOptions}
canSelectMultipleOptions={this.props.canSelectMultipleOptions}
Expand Down Expand Up @@ -458,6 +506,16 @@ class BaseOptionsSelector extends Component {
shouldPreventDefaultFocusOnSelectRow={this.props.shouldPreventDefaultFocusOnSelectRow}
nestedScrollEnabled={this.props.nestedScrollEnabled}
bounces={!this.props.shouldTextInputAppearBelowOptions || !this.props.shouldAllowScrollingChildren}
renderFooterContent={() =>
shouldShowShowMore && (
<ShowMore
containerStyle={styles.mv2}
currentCount={this.props.itemsPerPage * this.state.paginationPage}
totalCount={this.state.allOptions.length}
onPress={this.incrementPage}
/>
)
}
/>
);

Expand All @@ -475,7 +533,7 @@ class BaseOptionsSelector extends Component {
<ArrowKeyFocusManager
disabledIndexes={this.disabledOptionsIndexes}
focusedIndex={this.state.focusedIndex}
maxIndex={this.state.allOptions.length - 1}
maxIndex={this.allVisibleOptionsCount - 1}
onFocusedIndexChanged={this.props.disableArrowKeysActions ? () => {} : this.updateFocusedIndex}
shouldResetIndexOnEndReached={false}
>
Expand Down
4 changes: 4 additions & 0 deletions src/components/OptionsSelector/optionsSelectorPropTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@ const propTypes = {

/** Whether nested scroll of options is enabled, true by default */
nestedScrollEnabled: PropTypes.bool,

/** A maximum number of items per page. Then it multiplies by page. */
itemsPerPage: PropTypes.number,
};

const defaultProps = {
Expand Down Expand Up @@ -178,6 +181,7 @@ const defaultProps = {
shouldTextInputInterceptSwipe: false,
shouldAllowScrollingChildren: false,
nestedScrollEnabled: true,
itemsPerPage: undefined,
};

export {propTypes, defaultProps};
70 changes: 70 additions & 0 deletions src/components/ShowMore/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import PropTypes from 'prop-types';
import React from 'react';
import {Text, View} from 'react-native';
import _ from 'underscore';
import Button from '@components/Button';
import * as Expensicons from '@components/Icon/Expensicons';
import useLocalize from '@hooks/useLocalize';
import * as NumberFormatUtils from '@libs/NumberFormatUtils';
import stylePropTypes from '@styles/stylePropTypes';
import styles from '@styles/styles';
import themeColors from '@styles/themes/default';

const propTypes = {
/** Additional styles for container */
containerStyle: stylePropTypes,

/** A number of current showed items */
puneetlath marked this conversation as resolved.
Show resolved Hide resolved
currentCount: PropTypes.number,

/** A number of total items */
puneetlath marked this conversation as resolved.
Show resolved Hide resolved
totalCount: PropTypes.number,

/** A handler fires when button has been pressed */
puneetlath marked this conversation as resolved.
Show resolved Hide resolved
onPress: PropTypes.func.isRequired,
};

const defaultProps = {
containerStyle: {},
currentCount: undefined,
totalCount: undefined,
};

function ShowMore({containerStyle, currentCount, totalCount, onPress}) {
puneetlath marked this conversation as resolved.
Show resolved Hide resolved
const {translate, preferredLocale} = useLocalize();

const shouldShowCounter = _.isNumber(currentCount) && _.isNumber(totalCount);

return (
<View style={[styles.alignItemsCenter, containerStyle]}>
{shouldShowCounter && (
<Text style={[styles.mb2, styles.textLabelSupporting]}>
{`${translate('common.showing')} `}
<Text style={styles.textStrong}>{currentCount}</Text>
{` ${translate('common.of')} `}
<Text style={styles.textStrong}>{NumberFormatUtils.format(preferredLocale, totalCount)}</Text>
</Text>
)}
<View style={[styles.w100, styles.flexRow, styles.justifyContentBetween, styles.alignItemsCenter]}>
<View style={[styles.shortTermsHorizontalRule, styles.flex1, styles.mr0]} />
<Button
style={styles.mh0}
small
shouldShowRightIcon
iconFill={themeColors.icon}
iconRight={Expensicons.DownArrow}
text={translate('common.showMore')}
accessibilityLabel={translate('common.showMore')}
onPress={onPress}
/>
<View style={[styles.shortTermsHorizontalRule, styles.flex1, styles.ml0]} />
</View>
</View>
);
}

ShowMore.displayName = 'ShowMore';
ShowMore.propTypes = propTypes;
ShowMore.defaultProps = defaultProps;

export default ShowMore;
5 changes: 4 additions & 1 deletion src/components/TagPicker/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ import OptionsSelector from '@components/OptionsSelector';
import useLocalize from '@hooks/useLocalize';
import * as OptionsListUtils from '@libs/OptionsListUtils';
import * as PolicyUtils from '@libs/PolicyUtils';
import * as StyleUtils from '@styles/StyleUtils';
import useThemeStyles from '@styles/useThemeStyles';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import {defaultProps, propTypes} from './tagPickerPropTypes';

function TagPicker({selectedTag, tag, policyTags, policyRecentlyUsedTags, onSubmit, shouldShowDisabledAndSelectedOption}) {
function TagPicker({selectedTag, tag, policyTags, policyRecentlyUsedTags, shouldShowDisabledAndSelectedOption, insets, onSubmit}) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const [searchValue, setSearchValue] = useState('');
Expand Down Expand Up @@ -66,6 +67,7 @@ function TagPicker({selectedTag, tag, policyTags, policyRecentlyUsedTags, onSubm

return (
<OptionsSelector
contentContainerStyles={[{paddingBottom: StyleUtils.getSafeAreaMargins(insets).marginBottom}]}
optionHoveredStyle={styles.hoveredComponentBG}
sectionHeaderStyle={styles.mt5}
sections={sections}
Expand All @@ -78,6 +80,7 @@ function TagPicker({selectedTag, tag, policyTags, policyRecentlyUsedTags, onSubm
shouldShowTextInput={shouldShowTextInput}
value={searchValue}
initialFocusedIndex={initialFocusedIndex}
itemsPerPage={CONST.MAX_COUNT_OF_TAGS}
onChangeText={setSearchValue}
onSelectRow={onSubmit}
/>
Expand Down
4 changes: 4 additions & 0 deletions src/components/TagPicker/tagPickerPropTypes.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import tagPropTypes from '@components/tagPropTypes';
import safeAreaInsetPropTypes from '@pages/safeAreaInsetPropTypes';

const propTypes = {
/** The policyID we are getting tags for */
Expand All @@ -23,6 +24,9 @@ const propTypes = {

/** Should show the selected option that is disabled? */
shouldShowDisabledAndSelectedOption: PropTypes.bool,

/** Safe area insets required for mobile devices margins */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can modify this comment to explain why and how we should use this required prop.
I would have suggested something but I don't understand this prop 😅

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is simple insets from safe area. It is a common RN feature. Anyway, I will try to describe comments.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done - 19ff8d8.

insets: safeAreaInsetPropTypes.isRequired,
};

const defaultProps = {
Expand Down
6 changes: 4 additions & 2 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,8 @@ export default {
tbd: 'TBD',
selectCurrency: 'Select a currency',
card: 'Card',
showing: 'Showing',
of: 'of',
},
location: {
useCurrent: 'Use current location',
Expand Down Expand Up @@ -583,8 +585,8 @@ export default {
`changed the distance to ${newDistanceToDisplay} (previously ${oldDistanceToDisplay}), which updated the amount to ${newAmountToDisplay} (previously ${oldAmountToDisplay})`,
threadRequestReportName: ({formattedAmount, comment}: ThreadRequestReportNameParams) => `${formattedAmount} request${comment ? ` for ${comment}` : ''}`,
threadSentMoneyReportName: ({formattedAmount, comment}: ThreadSentMoneyReportNameParams) => `${formattedAmount} sent${comment ? ` for ${comment}` : ''}`,
tagSelection: ({tagName}: TagSelectionParams) => `Select a ${tagName} to add additional organization to your money`,
categorySelection: 'Select a category to add additional organization to your money',
tagSelection: ({tagName}: TagSelectionParams) => `Select a ${tagName} to add additional organization to your money.`,
categorySelection: 'Select a category to add additional organization to your money.',
error: {
invalidAmount: 'Please enter a valid amount before continuing.',
invalidSplit: 'Split amounts do not equal total amount',
Expand Down
6 changes: 4 additions & 2 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,8 @@ export default {
tbd: 'Por determinar',
selectCurrency: 'Selecciona una moneda',
card: 'Tarjeta',
showing: 'Mostrando',
of: 'de',
},
location: {
useCurrent: 'Usar ubicación actual',
Expand Down Expand Up @@ -577,8 +579,8 @@ export default {
`cambió la distancia a ${newDistanceToDisplay} (previamente ${oldDistanceToDisplay}), lo que cambió el importe a ${newAmountToDisplay} (previamente ${oldAmountToDisplay})`,
threadRequestReportName: ({formattedAmount, comment}: ThreadRequestReportNameParams) => `Solicitud de ${formattedAmount}${comment ? ` para ${comment}` : ''}`,
threadSentMoneyReportName: ({formattedAmount, comment}: ThreadSentMoneyReportNameParams) => `${formattedAmount} enviado${comment ? ` para ${comment}` : ''}`,
tagSelection: ({tagName}: TagSelectionParams) => `Seleccione una ${tagName} para organizar mejor tu dinero`,
categorySelection: 'Seleccione una categoría para organizar mejor tu dinero',
tagSelection: ({tagName}: TagSelectionParams) => `Seleccione una ${tagName} para organizar mejor tu dinero.`,
categorySelection: 'Seleccione una categoría para organizar mejor tu dinero.',
error: {
invalidAmount: 'Por favor ingresa un monto válido antes de continuar.',
invalidSplit: 'La suma de las partes no equivale al monto total',
Expand Down
Loading
Loading