@@ -5,6 +5,7 @@ import {format} from 'date-fns';
5
5
import _ from 'underscore' ;
6
6
import { View } from 'react-native' ;
7
7
import lodashGet from 'lodash/get' ;
8
+ import { useIsFocused } from '@react-navigation/native' ;
8
9
import Text from './Text' ;
9
10
import styles from '../styles/styles' ;
10
11
import * as ReportUtils from '../libs/ReportUtils' ;
@@ -36,9 +37,11 @@ import tagPropTypes from './tagPropTypes';
36
37
import ConfirmedRoute from './ConfirmedRoute' ;
37
38
import transactionPropTypes from './transactionPropTypes' ;
38
39
import DistanceRequestUtils from '../libs/DistanceRequestUtils' ;
40
+ import FormHelpMessage from './FormHelpMessage' ;
39
41
import * as IOU from '../libs/actions/IOU' ;
40
42
import * as TransactionUtils from '../libs/TransactionUtils' ;
41
43
import * as PolicyUtils from '../libs/PolicyUtils' ;
44
+ import * as MoneyRequestUtils from '../libs/MoneyRequestUtils' ;
42
45
43
46
const propTypes = {
44
47
/** Callback to inform parent modal of success */
@@ -216,6 +219,13 @@ function MoneyRequestConfirmationList(props) {
216
219
props . isDistanceRequest ? currency : props . iouCurrencyCode ,
217
220
) ;
218
221
222
+ const isFocused = useIsFocused ( ) ;
223
+ const [ formError , setFormError ] = useState ( '' ) ;
224
+ useEffect ( ( ) => {
225
+ // reset the form error whenever the screen gains or loses focus
226
+ setFormError ( '' ) ;
227
+ } , [ isFocused ] ) ;
228
+
219
229
useEffect ( ( ) => {
220
230
if ( ! shouldCalculateDistanceAmount ) {
221
231
return ;
@@ -370,8 +380,6 @@ function MoneyRequestConfirmationList(props) {
370
380
*/
371
381
const confirm = useCallback (
372
382
( paymentMethod ) => {
373
- setDidConfirm ( true ) ;
374
-
375
383
if ( _ . isEmpty ( selectedParticipants ) ) {
376
384
return ;
377
385
}
@@ -381,13 +389,22 @@ function MoneyRequestConfirmationList(props) {
381
389
return ;
382
390
}
383
391
392
+ setDidConfirm ( true ) ;
393
+
384
394
Log . info ( `[IOU] Sending money via: ${ paymentMethod } ` ) ;
385
395
onSendMoney ( paymentMethod ) ;
386
396
} else {
397
+ // validate the amount for distance requests
398
+ if ( props . isDistanceRequest && ! isDistanceRequestWithoutRoute && ! MoneyRequestUtils . validateAmount ( String ( props . iouAmount ) ) ) {
399
+ setFormError ( 'common.error.invalidAmount' ) ;
400
+ return ;
401
+ }
402
+
403
+ setDidConfirm ( true ) ;
387
404
onConfirm ( selectedParticipants ) ;
388
405
}
389
406
} ,
390
- [ selectedParticipants , onSendMoney , onConfirm , props . iouType ] ,
407
+ [ selectedParticipants , onSendMoney , onConfirm , props . iouType , props . isDistanceRequest , isDistanceRequestWithoutRoute , props . iouAmount ] ,
391
408
) ;
392
409
393
410
const footerContent = useMemo ( ( ) => {
@@ -398,7 +415,7 @@ function MoneyRequestConfirmationList(props) {
398
415
const shouldShowSettlementButton = props . iouType === CONST . IOU . MONEY_REQUEST_TYPE . SEND ;
399
416
const shouldDisableButton = selectedParticipants . length === 0 ;
400
417
401
- return shouldShowSettlementButton ? (
418
+ const button = shouldShowSettlementButton ? (
402
419
< SettlementButton
403
420
isDisabled = { shouldDisableButton }
404
421
onPress = { confirm }
@@ -422,7 +439,20 @@ function MoneyRequestConfirmationList(props) {
422
439
buttonSize = { CONST . DROPDOWN_BUTTON_SIZE . LARGE }
423
440
/>
424
441
) ;
425
- } , [ confirm , props . bankAccountRoute , props . iouCurrencyCode , props . iouType , props . isReadOnly , props . policyID , selectedParticipants , splitOrRequestOptions ] ) ;
442
+
443
+ return (
444
+ < >
445
+ { ! _ . isEmpty ( formError ) && (
446
+ < FormHelpMessage
447
+ style = { [ styles . ph1 , styles . mb2 ] }
448
+ isError
449
+ message = { translate ( formError ) }
450
+ />
451
+ ) }
452
+ { button }
453
+ </ >
454
+ ) ;
455
+ } , [ confirm , props . bankAccountRoute , props . iouCurrencyCode , props . iouType , props . isReadOnly , props . policyID , selectedParticipants , splitOrRequestOptions , translate , formError ] ) ;
426
456
427
457
return (
428
458
< OptionsSelector
0 commit comments