Completed
Push — master ( 616573...58347b )
by wiese
163:41 queued 98:34
created

input_validation.js ➔ newDataEnteredState   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11

Duplication

Lines 11
Ratio 100 %

Importance

Changes 0
Metric Value
dl 11
loc 11
rs 9.4285
c 0
b 0
f 0
cc 2
nc 2
nop 1

1 Function

Rating   Name   Duplication   Size   Complexity  
A input_validation.js ➔ ... ➔ 3 3 1
1 View Code Duplication
'use strict';
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
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