Skip to content

Commit c79fc56

Browse files
authored
Merge pull request Expensify#65871 from mkzie2/mkzie2-issue/65632
feat: add warning when cash splits are less than original expense amount
2 parents 072356c + 95dfd58 commit c79fc56

2 files changed

Lines changed: 23 additions & 7 deletions

File tree

src/components/FormHelpMessage.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@ type FormHelpMessageProps = {
2828

2929
/** Whether should render error text as HTML or as Text */
3030
shouldRenderMessageAsHTML?: boolean;
31+
32+
/** Whether to show information icon */
33+
isInfo?: boolean;
3134
};
3235

33-
function FormHelpMessage({message = '', children, isError = true, style, shouldShowRedDotIndicator = true, shouldRenderMessageAsHTML = false}: FormHelpMessageProps) {
36+
function FormHelpMessage({message = '', children, isError = true, style, shouldShowRedDotIndicator = true, shouldRenderMessageAsHTML = false, isInfo = false}: FormHelpMessageProps) {
3437
const theme = useTheme();
3538
const styles = useThemeStyles();
3639

@@ -60,6 +63,14 @@ function FormHelpMessage({message = '', children, isError = true, style, shouldS
6063
fill={theme.danger}
6164
/>
6265
)}
66+
{isInfo && (
67+
<Icon
68+
src={Expensicons.Exclamation}
69+
fill={theme.icon}
70+
small
71+
additionalStyles={[styles.mr1]}
72+
/>
73+
)}
6374
<View style={[styles.flex1, isError && shouldShowRedDotIndicator ? styles.ml2 : {}]}>
6475
{children ?? (shouldRenderMessageAsHTML ? <RenderHTML html={HTMLMessage} /> : <Text style={[isError ? styles.formError : styles.formHelp, styles.mb0]}>{message}</Text>)}
6576
</View>

src/pages/iou/SplitExpensePage.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
4040

4141
const {shouldUseNarrowLayout} = useResponsiveLayout();
4242

43-
const [errorMessage, setErrorMessage] = React.useState<string | null>(null);
43+
const [errorMessage, setErrorMessage] = React.useState<string>('');
4444
const {currentSearchHash} = useSearchContext();
4545

4646
const [draftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: false});
@@ -56,7 +56,7 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
5656
const isCard = isCardTransaction(transaction);
5757

5858
useEffect(() => {
59-
setErrorMessage(null);
59+
setErrorMessage('');
6060
}, [sumOfSplitExpenses, draftTransaction?.comment?.splitExpenses?.length]);
6161

6262
const onAddSplitExpense = useCallback(() => {
@@ -147,13 +147,18 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
147147
);
148148

149149
const footerContent = useMemo(() => {
150+
const shouldShowWarningMessage = sumOfSplitExpenses < Math.abs(transactionDetailsAmount);
151+
const warningMessage = shouldShowWarningMessage
152+
? translate('iou.totalAmountLessThanOriginal', {amount: convertToDisplayString(Math.abs(transactionDetailsAmount) - sumOfSplitExpenses, transactionDetails.currency)})
153+
: '';
150154
return (
151155
<>
152-
{!!errorMessage && (
156+
{(!!errorMessage || !!warningMessage) && (
153157
<FormHelpMessage
154158
style={[styles.ph1, styles.mb2]}
155-
isError
156-
message={errorMessage}
159+
isError={!!errorMessage}
160+
isInfo={!errorMessage && shouldShowWarningMessage}
161+
message={errorMessage || warningMessage}
157162
/>
158163
)}
159164
<Button
@@ -167,7 +172,7 @@ function SplitExpensePage({route}: SplitExpensePageProps) {
167172
/>
168173
</>
169174
);
170-
}, [onSaveSplitExpense, styles.mb2, styles.ph1, styles.w100, translate, errorMessage]);
175+
}, [sumOfSplitExpenses, transactionDetailsAmount, translate, transactionDetails.currency, errorMessage, styles.ph1, styles.mb2, styles.w100, onSaveSplitExpense]);
171176

172177
const initiallyFocusedOptionKey = useMemo(
173178
() => sections.at(0)?.data.find((option) => option.transactionID === splitExpenseTransactionID)?.keyForList,

0 commit comments

Comments
 (0)