|
1
|
|
View Code Duplication |
'use strict'; |
|
|
|
|
|
|
2
|
|
|
|
|
3
|
|
|
var _ = require( 'underscore' ), |
|
4
|
|
|
objectAssign = require( 'object-assign' ), |
|
5
|
|
|
ValidationStates = require( '../form_validation' ).ValidationStates; |
|
6
|
|
|
|
|
7
|
|
|
function inputIsValid( value, pattern ) { |
|
8
|
|
|
if ( pattern === null ) { |
|
9
|
|
|
return value !== ''; |
|
10
|
|
|
} |
|
11
|
|
|
return new RegExp( pattern ).test( value ); |
|
12
|
|
|
} |
|
13
|
|
|
|
|
14
|
|
|
/** |
|
15
|
|
|
* @param {boolean} formWasFilledBefore |
|
16
|
|
|
* @return {Function} |
|
17
|
|
|
*/ |
|
18
|
|
|
function newDataEnteredState( formWasFilledBefore ) { |
|
19
|
|
|
if ( formWasFilledBefore ) { |
|
20
|
|
|
return function () { |
|
21
|
|
|
return true; |
|
22
|
|
|
}; |
|
23
|
|
|
} else { |
|
24
|
|
|
return function ( state ) { |
|
25
|
|
|
return state; |
|
26
|
|
|
}; |
|
27
|
|
|
} |
|
28
|
|
|
} |
|
29
|
|
|
|
|
30
|
|
|
function inputValidation( validationState, action ) { |
|
31
|
|
|
var newValidationState = objectAssign( {}, validationState ), |
|
32
|
|
|
bankDataIsValid, dataEnteredTransformer; |
|
33
|
|
|
|
|
34
|
|
|
switch ( action.type ) { |
|
35
|
|
|
case 'INITIALIZE_VALIDATION': |
|
36
|
|
|
// We have no indicator if the form was freshly loaded with default values, called with payment data from |
|
37
|
|
|
// a banner or reloaded with validation errors. So we try to determine the state of "dataEntered" by |
|
38
|
|
|
// looking at the validation info from the server. In case of coming from the banner, |
|
39
|
|
|
// initialValidationResult is filled, in case of validation errors, violatedFields is filled. |
|
40
|
|
|
// In all other cases, we can't decide and just pass the initial state from the reducer, but that should be ok |
|
41
|
|
|
dataEnteredTransformer = newDataEnteredState( |
|
42
|
|
|
!_.isEmpty( action.payload.violatedFields ) || |
|
43
|
|
|
!_.isEmpty( action.payload.initialValidationResult ) |
|
44
|
|
|
); |
|
45
|
|
|
_.each( validationState, function ( value, key ) { |
|
46
|
|
|
newValidationState[ key ] = { |
|
47
|
|
|
dataEntered: dataEnteredTransformer( validationState[ key ].dataEntered ), |
|
48
|
|
|
isValid: _.has( action.payload.violatedFields, key ) ? false : validationState[ key ].isValid |
|
49
|
|
|
}; |
|
50
|
|
|
} ); |
|
51
|
|
|
return newValidationState; |
|
52
|
|
|
case 'VALIDATE_INPUT': |
|
53
|
|
|
if ( validationState[ action.payload.contentName ].dataEntered === false && action.payload.value === '' ) { |
|
54
|
|
|
return validationState; |
|
55
|
|
|
} |
|
56
|
|
|
|
|
57
|
|
|
newValidationState[ action.payload.contentName ] = { |
|
58
|
|
|
dataEntered: true, |
|
59
|
|
|
isValid: inputIsValid( action.payload.value, action.payload.pattern ) |
|
60
|
|
|
}; |
|
61
|
|
|
return newValidationState; |
|
62
|
|
|
case 'MARK_EMPTY_FIELD_INVALID': |
|
63
|
|
|
_.each( action.payload.requiredFields, function ( key ) { |
|
64
|
|
|
if ( newValidationState[ key ].isValid === null ) { |
|
65
|
|
|
newValidationState[ key ].isValid = false; |
|
66
|
|
|
} |
|
67
|
|
|
} ); |
|
68
|
|
|
_.each( action.payload.neutralFields, function ( key ) { |
|
69
|
|
|
newValidationState[ key ].isValid = null; |
|
70
|
|
|
} ); |
|
71
|
|
|
return newValidationState; |
|
72
|
|
|
case 'RESET_FIELD_VALIDITY': |
|
73
|
|
|
_.each( action.payload.affectedFields, function ( key ) { |
|
74
|
|
|
newValidationState[ key ] = { dataEntered: false, isValid: null }; |
|
75
|
|
|
} ); |
|
76
|
|
|
return newValidationState; |
|
77
|
|
|
case 'FINISH_PAYMENT_DATA_VALIDATION': |
|
78
|
|
|
if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
79
|
|
|
return newValidationState; |
|
80
|
|
|
} else if ( action.payload.status === ValidationStates.OK ) { |
|
81
|
|
|
newValidationState.amount = { dataEntered: true, isValid: true }; |
|
82
|
|
|
newValidationState.paymentType = { dataEntered: true, isValid: true }; |
|
83
|
|
|
} else { |
|
84
|
|
|
newValidationState.amount = { dataEntered: true, isValid: !action.payload.messages.amount }; |
|
85
|
|
|
newValidationState.paymentType = { dataEntered: true, isValid: !action.payload.messages.paymentType }; |
|
86
|
|
|
} |
|
87
|
|
|
return newValidationState; |
|
88
|
|
|
case 'FINISH_BANK_DATA_VALIDATION': |
|
89
|
|
|
if ( action.payload.status === ValidationStates.INCOMPLETE || action.payload.status === ValidationStates.NOT_APPLICABLE ) { |
|
90
|
|
|
return newValidationState; |
|
91
|
|
|
} |
|
92
|
|
|
bankDataIsValid = action.payload.status !== ValidationStates.ERR; |
|
93
|
|
|
newValidationState.iban = { dataEntered: true, isValid: bankDataIsValid }; |
|
94
|
|
|
if ( action.payload.bic || !bankDataIsValid ) { |
|
95
|
|
|
newValidationState.bic = { dataEntered: true, isValid: bankDataIsValid }; |
|
96
|
|
|
} |
|
97
|
|
|
if ( action.payload.account || !bankDataIsValid ) { |
|
98
|
|
|
newValidationState.accountNumber = { dataEntered: true, isValid: bankDataIsValid }; |
|
99
|
|
|
} |
|
100
|
|
|
if ( action.payload.bankCode || !bankDataIsValid ) { |
|
101
|
|
|
newValidationState.bankCode = { dataEntered: true, isValid: bankDataIsValid }; |
|
102
|
|
|
} |
|
103
|
|
|
return newValidationState; |
|
104
|
|
|
case 'FINISH_EMAIL_ADDRESS_VALIDATION': |
|
105
|
|
|
if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
106
|
|
|
return newValidationState; |
|
107
|
|
|
} |
|
108
|
|
|
newValidationState.email = { dataEntered: true, isValid: action.payload.status !== ValidationStates.ERR }; |
|
109
|
|
|
return newValidationState; |
|
110
|
|
|
case 'FINISH_ADDRESS_VALIDATION': |
|
111
|
|
|
if ( action.payload.status === ValidationStates.INCOMPLETE ) { |
|
112
|
|
|
return newValidationState; |
|
113
|
|
|
} |
|
114
|
|
|
_.forEach( newValidationState, function ( value, key ) { |
|
115
|
|
|
if ( newValidationState[ key ].dataEntered === true ) { |
|
116
|
|
|
newValidationState[ key ] = { |
|
117
|
|
|
dataEntered: true, |
|
118
|
|
|
isValid: newValidationState[ key ].isValid !== false && !( _.has( action.payload.messages, key ) ) |
|
119
|
|
|
}; |
|
120
|
|
|
} |
|
121
|
|
|
} ); |
|
122
|
|
|
return newValidationState; |
|
123
|
|
|
default: |
|
124
|
|
|
return validationState; |
|
125
|
|
|
} |
|
126
|
|
|
} |
|
127
|
|
|
|
|
128
|
|
|
module.exports = { |
|
129
|
|
|
inputValidation: inputValidation |
|
130
|
|
|
}; |
|
131
|
|
|
|