@@ -12,6 +12,8 @@ export default class Typist extends Component {
1212 stdTypingDelay : PropTypes . number ,
1313 startDelay : PropTypes . number ,
1414 cursor : PropTypes . object ,
15+ onCharacterTyped : PropTypes . func ,
16+ onLineTyped : PropTypes . func ,
1517 onTypingDone : PropTypes . func ,
1618 delayGenerator : PropTypes . func ,
1719 }
@@ -22,6 +24,8 @@ export default class Typist extends Component {
2224 stdTypingDelay : 25 ,
2325 startDelay : 0 ,
2426 cursor : { } ,
27+ onCharacterTyped : ( ) => { } ,
28+ onLineTyped : ( ) => { } ,
2529 onTypingDone : ( ) => { } ,
2630 delayGenerator : utils . gaussianRnd ,
2731 }
@@ -91,27 +95,35 @@ export default class Typist extends Component {
9195 }
9296
9397 typeAllLines ( lines = this . linesToType ) {
94- return utils . eachPromise ( lines , ( line , idx ) => {
95- if ( ! this . mounted ) { return Promise . resolve ( ) ; }
96- return new Promise ( ( resolve ) => {
97- this . setState ( { text : this . state . text . concat ( [ '' ] ) } , ( ) => {
98- this . typeLine ( line , idx ) . then ( resolve ) ;
99- } ) ;
100- } ) ;
101- } )
98+ return utils . eachPromise ( lines , this . typeLine )
10299 . then ( ( ) => this . onTypingDone ( ) ) ;
103100 }
104101
105- typeLine ( line , lineIdx ) {
106- return utils . eachPromise ( line , ( character , charIdx ) => {
107- if ( ! this . mounted ) { return Promise . resolve ( ) ; }
108- return new Promise ( ( resolve ) => {
109- const text = this . state . text . slice ( ) ;
110- text [ lineIdx ] += character ;
111- this . setState ( { text } , ( ) => {
112- const delay = this . delayGenerator ( line , lineIdx , character , charIdx ) ;
113- setTimeout ( resolve , delay ) ;
114- } ) ;
102+ typeLine = ( line , lineIdx ) => {
103+ if ( ! this . mounted ) { return Promise . resolve ( ) ; }
104+ const { onLineTyped } = this . props ;
105+
106+ return new Promise ( ( resolve , reject ) => {
107+ this . setState ( { text : this . state . text . concat ( [ '' ] ) } , ( ) => {
108+ utils . eachPromise ( line , this . typeCharacter , line , lineIdx )
109+ . then ( ( ) => onLineTyped ( line , lineIdx ) )
110+ . then ( resolve )
111+ . catch ( reject ) ;
112+ } ) ;
113+ } ) ;
114+ }
115+
116+ typeCharacter = ( character , charIdx , line , lineIdx ) => {
117+ if ( ! this . mounted ) { return Promise . resolve ( ) ; }
118+ const { onCharacterTyped } = this . props ;
119+
120+ return new Promise ( ( resolve ) => {
121+ const text = this . state . text . slice ( ) ;
122+ text [ lineIdx ] += character ;
123+ this . setState ( { text } , ( ) => {
124+ onCharacterTyped ( character , charIdx ) ;
125+ const delay = this . delayGenerator ( line , lineIdx , character , charIdx ) ;
126+ setTimeout ( resolve , delay ) ;
115127 } ) ;
116128 } ) ;
117129 }
0 commit comments