@@ -26,7 +26,7 @@ class Wizard extends React.Component {
26
26
prevSteps : [ ] ,
27
27
activeStepIndex : 0 ,
28
28
maxStepIndex : 0 ,
29
- isDynamic, // wizard contains nextStep mapper
29
+ isDynamic,
30
30
navSchema : this . createSchema ( { currentIndex : 0 , isDynamic } ) ,
31
31
loading : true ,
32
32
} ;
@@ -47,15 +47,19 @@ class Wizard extends React.Component {
47
47
}
48
48
}
49
49
50
- handleNext = ( nextStep , getRegisteredFields ) =>
50
+ handleNext = ( nextStep , getRegisteredFields ) => {
51
+ const newActiveIndex = this . state . activeStepIndex + 1 ;
52
+ const shouldInsertStepIntoHistory = this . state . prevSteps . includes ( this . state . activeStep ) ;
53
+
51
54
this . setState ( prevState => ( {
52
55
registeredFieldsHistory : { ...prevState . registeredFieldsHistory , [ prevState . activeStep ] : getRegisteredFields ( ) } ,
53
56
activeStep : nextStep ,
54
- prevSteps : prevState . prevSteps . includes ( prevState . activeStep ) ? prevState . prevSteps : [ ...prevState . prevSteps , prevState . activeStep ] ,
55
- activeStepIndex : prevState . activeStepIndex + 1 ,
56
- maxStepIndex : ( prevState . activeStepIndex + 1 ) > prevState . maxStepIndex ? prevState . maxStepIndex + 1 : prevState . maxStepIndex ,
57
- navSchema : this . state . isDynamic ? this . createSchema ( { currentIndex : prevState . activeStepIndex + 1 } ) : prevState . navSchema ,
57
+ prevSteps : shouldInsertStepIntoHistory ? prevState . prevSteps : [ ...prevState . prevSteps , prevState . activeStep ] ,
58
+ activeStepIndex : newActiveIndex ,
59
+ maxStepIndex : newActiveIndex > prevState . maxStepIndex ? newActiveIndex : prevState . maxStepIndex ,
60
+ navSchema : this . state . isDynamic ? this . createSchema ( { currentIndex : newActiveIndex } ) : prevState . navSchema ,
58
61
} ) ) ;
62
+ }
59
63
60
64
handlePrev = ( ) => this . jumpToStep ( this . state . activeStepIndex - 1 ) ;
61
65
@@ -78,45 +82,59 @@ class Wizard extends React.Component {
78
82
79
83
findCurrentStep = activeStep => this . props . fields . find ( ( { stepKey } ) => stepKey === activeStep )
80
84
81
- // jumping in the wizzard by clicking on nav links
82
85
jumpToStep = ( index , valid ) => {
83
- if ( this . state . prevSteps [ index ] ) {
84
- this . setState ( ( prevState ) =>
85
- ( {
86
+ const clickOnPreviousStep = this . state . prevSteps [ index ] ;
87
+ if ( clickOnPreviousStep ) {
88
+ let originalActiveStep ;
89
+ this . setState ( ( prevState ) => {
90
+ const includeActiveStep = prevState . prevSteps . includes ( prevState . activeStep ) ;
91
+ originalActiveStep = prevState . activeStep ;
92
+
93
+ return ( {
86
94
activeStep : this . state . prevSteps [ index ] ,
87
- prevSteps : prevState . prevSteps . includes ( prevState . activeStep ) ? prevState . prevSteps : [ ...prevState . prevSteps , prevState . activeStep ] ,
95
+ prevSteps : includeActiveStep ? prevState . prevSteps : [ ...prevState . prevSteps , prevState . activeStep ] ,
88
96
activeStepIndex : index ,
89
- } ) ) ;
90
-
91
- const currentStep = this . findCurrentStep ( this . state . prevSteps [ index ] ) ;
92
- const currentStepHasStepMapper = typeof currentStep . nextStep === 'object' ;
93
-
94
- if ( this . state . isDynamic && ( currentStepHasStepMapper || ! this . props . predictSteps ) ) {
95
- this . setState ( ( prevState ) => ( {
96
- navSchema : prevState . navSchema . slice ( 0 , index + 1 ) ,
97
- prevSteps : prevState . prevSteps . slice ( 0 , index + 1 ) ,
98
- maxStepIndex : prevState . prevSteps . slice ( 0 , index + 1 ) . length ,
99
- } ) ) ;
100
- }
101
-
102
- if ( currentStep . disableForwardJumping ) {
103
- this . setState ( ( prevState ) => ( {
104
- prevSteps : prevState . prevSteps . slice ( 0 , index + 1 ) ,
105
- maxStepIndex : prevState . prevSteps . slice ( 0 , index ) . length ,
106
- } ) ) ;
107
- }
108
-
109
- // invalid state disables jumping forward until it fixed (!)
110
- if ( valid === false ) {
111
- this . setState ( ( prevState ) => ( {
112
- prevSteps : prevState . prevSteps . slice ( 0 , index + 2 ) ,
113
- maxStepIndex : prevState . prevSteps . slice ( 0 , index + 1 ) . length ,
114
- } ) ) ;
115
- }
97
+ } ) ;
98
+ } , ( ) => this . setState ( ( prevState ) => {
99
+ const INDEXING_BY_ZERO = 1 ;
100
+
101
+ let newState ;
102
+
103
+ const currentStep = this . findCurrentStep ( prevState . prevSteps [ index ] ) ;
104
+ const currentStepHasStepMapper = typeof currentStep . nextStep === 'object' ;
105
+
106
+ const dynamicStepShouldDisableNav = prevState . isDynamic && ( currentStepHasStepMapper || ! this . props . predictSteps ) ;
107
+
108
+ if ( dynamicStepShouldDisableNav ) {
109
+ const newPrevSteps = prevState . prevSteps . slice ( 0 , index ) ;
110
+ newState = {
111
+ navSchema : this . props . predictSteps ? this . createSchema ( { currentIndex : index } ) : prevState . navSchema . slice ( 0 , index + INDEXING_BY_ZERO ) ,
112
+ prevSteps : newPrevSteps ,
113
+ maxStepIndex : newPrevSteps . length ,
114
+ } ;
115
+ } else if ( currentStep . disableForwardJumping ) {
116
+ const newPrevSteps = prevState . prevSteps . slice ( 0 , index ) ;
117
+ newState = {
118
+ prevSteps : newPrevSteps ,
119
+ maxStepIndex : newPrevSteps . length ,
120
+ } ;
121
+ }
122
+
123
+ if ( valid === false ) {
124
+ const indexOfCurrentStep = prevState . prevSteps . indexOf ( originalActiveStep ) ;
125
+
126
+ newState = {
127
+ ...newState ,
128
+ prevSteps : prevState . prevSteps . slice ( 0 , indexOfCurrentStep + INDEXING_BY_ZERO ) ,
129
+ maxStepIndex : prevState . prevSteps . slice ( 0 , indexOfCurrentStep + INDEXING_BY_ZERO ) . length - INDEXING_BY_ZERO ,
130
+ } ;
131
+ }
132
+
133
+ return newState ;
134
+ } ) ) ;
116
135
}
117
136
} ;
118
137
119
- // builds schema used for generating of the navigation links
120
138
createSchema = ( { currentIndex, isDynamic } ) => {
121
139
if ( typeof isDynamic === 'undefined' ) {
122
140
isDynamic = this . state . isDynamic ;
0 commit comments