@@ -39,6 +39,8 @@ class ChatBot extends Component {
3939 } ;
4040
4141 this . renderStep = this . renderStep . bind ( this ) ;
42+ this . getTriggeredStep = this . getTriggeredStep . bind ( this ) ;
43+ this . generateRenderedStepsById = this . generateRenderedStepsById . bind ( this ) ;
4244 this . triggerNextStep = this . triggerNextStep . bind ( this ) ;
4345 this . onValueChange = this . onValueChange . bind ( this ) ;
4446 this . handleKeyPress = this . handleKeyPress . bind ( this ) ;
@@ -82,6 +84,14 @@ class ChatBot extends Component {
8284
8385 schema . checkInvalidIds ( steps ) ;
8486
87+ const firstStep = this . props . steps [ 0 ] ;
88+
89+ if ( firstStep . message ) {
90+ const message = firstStep . message ;
91+ firstStep . message = typeof message === 'function' ? message ( ) : message ;
92+ steps [ firstStep . id ] . message = firstStep . message ;
93+ }
94+
8595 const {
8696 currentStep,
8797 previousStep,
@@ -90,7 +100,7 @@ class ChatBot extends Component {
90100 } = storage . getData ( {
91101 cacheName,
92102 cache,
93- firstStep : this . props . steps [ 0 ] ,
103+ firstStep,
94104 steps,
95105 } , ( ) => {
96106 // focus input if last step cached is a user step
@@ -133,6 +143,31 @@ class ChatBot extends Component {
133143 this . setState ( { inputValue : event . target . value } ) ;
134144 }
135145
146+ getTriggeredStep ( trigger , value ) {
147+ const steps = this . generateRenderedStepsById ( ) ;
148+ return ( typeof trigger === 'function' ) ? trigger ( { value, steps } ) : trigger ;
149+ }
150+
151+ getStepMessage ( message ) {
152+ const { previousSteps } = this . state ;
153+ const lastStepIndex = previousSteps . length > 0 ? previousSteps . length - 1 : 0 ;
154+ const steps = this . generateRenderedStepsById ( ) ;
155+ const previousValue = previousSteps [ lastStepIndex ] . value ;
156+ return ( typeof message === 'function' ) ? message ( { previousValue, steps } ) : message ;
157+ }
158+
159+ generateRenderedStepsById ( ) {
160+ const { previousSteps } = this . state ;
161+ const steps = { } ;
162+
163+ for ( let i = 0 , len = previousSteps . length ; i < len ; i += 1 ) {
164+ const { id, message, value } = previousSteps [ i ] ;
165+ steps [ id ] = { id, message, value } ;
166+ }
167+
168+ return steps ;
169+ }
170+
136171 triggerNextStep ( data ) {
137172 const {
138173 defaultUserSettings,
@@ -147,13 +182,14 @@ class ChatBot extends Component {
147182 currentStep . value = data . value ;
148183 }
149184 if ( data && data . trigger ) {
150- currentStep . trigger = data . trigger ;
185+ currentStep . trigger = this . getTriggeredStep ( data . trigger , data . value ) ;
151186 }
152187
153188 if ( isEnd ) {
154189 this . handleEnd ( ) ;
155190 } else if ( currentStep . options && data ) {
156191 const option = currentStep . options . filter ( o => o . value === data . value ) [ 0 ] ;
192+ const trigger = this . getTriggeredStep ( option . trigger , currentStep . value ) ;
157193 delete currentStep . options ;
158194
159195 // replace choose option for user message
@@ -164,8 +200,8 @@ class ChatBot extends Component {
164200 defaultUserSettings ,
165201 {
166202 user : true ,
167- trigger : option . trigger ,
168203 message : option . label ,
204+ trigger,
169205 } ,
170206 ) ;
171207
@@ -184,9 +220,12 @@ class ChatBot extends Component {
184220 renderedSteps . pop ( ) ;
185221 }
186222
187- let nextStep = Object . assign ( { } , steps [ currentStep . trigger ] ) ;
223+ const trigger = this . getTriggeredStep ( currentStep . trigger , currentStep . value ) ;
224+ let nextStep = Object . assign ( { } , steps [ trigger ] ) ;
188225
189- if ( nextStep . update ) {
226+ if ( nextStep . message ) {
227+ nextStep . message = this . getStepMessage ( nextStep . message ) ;
228+ } else if ( nextStep . update ) {
190229 const updateStep = nextStep ;
191230 nextStep = Object . assign ( { } , steps [ updateStep . update ] ) ;
192231
@@ -376,7 +415,7 @@ class ChatBot extends Component {
376415 }
377416
378417 renderStep ( step , index ) {
379- const { renderedSteps, previousSteps } = this . state ;
418+ const { renderedSteps } = this . state ;
380419 const {
381420 avatarStyle,
382421 bubbleStyle,
@@ -385,19 +424,9 @@ class ChatBot extends Component {
385424 hideUserAvatar,
386425 } = this . props ;
387426 const { options, component, asMessage } = step ;
388- const steps = { } ;
427+ const steps = this . generateRenderedStepsById ( ) ;
389428 const previousStep = index > 0 ? renderedSteps [ index - 1 ] : { } ;
390429
391- for ( let i = 0 , len = previousSteps . length ; i < len ; i += 1 ) {
392- const ps = previousSteps [ i ] ;
393-
394- steps [ ps . id ] = {
395- id : ps . id ,
396- message : ps . message ,
397- value : ps . value ,
398- } ;
399- }
400-
401430 if ( component && ! asMessage ) {
402431 return (
403432 < CustomStep
0 commit comments