1
- /* globals React, ReactDOM, Draft, diff_match_patch */
1
+ /* globals React, ReactDOM, Draft, diff_match_patch, lodash */
2
2
3
3
var DMP = new diff_match_patch ( ) ;
4
4
@@ -9,6 +9,11 @@ var DIFF = {
9
9
EQUAL : 0
10
10
} ;
11
11
12
+ var DEBOUNCE_WAIT = 600 ; // ms
13
+ var DEBOUNCE_OPTS = {
14
+ trailing : true // We want to update after the delay only
15
+ } ;
16
+
12
17
var DiffArea = React . createClass ( {
13
18
14
19
propTypes : {
@@ -17,6 +22,8 @@ var DiffArea = React.createClass({
17
22
} ,
18
23
19
24
getInitialState : function ( ) {
25
+ // Make a debounced diff update
26
+ this . debouncedUpdateDiffs = _ . debounce ( this . updateDiffs , DEBOUNCE_WAIT , DEBOUNCE_OPTS ) ;
20
27
var left = this . props . left ;
21
28
var right = this . props . right ;
22
29
@@ -37,32 +44,37 @@ var DiffArea = React.createClass({
37
44
} ,
38
45
39
46
onChange : function ( rightState ) {
40
- var newState = { } ;
41
-
42
47
// Text changed ?
43
48
var contentChanged = this . state . rightState . getCurrentContent ( )
44
49
!== rightState . getCurrentContent ( ) ;
45
50
46
51
// Update diffs
47
52
if ( contentChanged ) {
48
- var left = this . props . left ;
49
- var right = rightState . getCurrentContent ( ) . getPlainText ( ) ;
50
-
51
- var diffs = computeDiff ( left , right ) ;
52
-
53
- // Update the decorators
54
- newState . leftState = Draft . EditorState . set ( this . state . leftState , {
55
- decorator : createDiffsDecorator ( diffs , DIFF . REMOVED )
56
- } ) ;
57
- newState . rightState = Draft . EditorState . set ( rightState , {
58
- decorator : createDiffsDecorator ( diffs , DIFF . INSERTED )
59
- } ) ;
60
- } else {
61
- // Just update the EditorState
62
- newState . leftState = this . state . leftState ;
63
- newState . rightState = rightState ;
53
+ this . debouncedUpdateDiffs ( ) ;
64
54
}
65
55
56
+ // Update the EditorState
57
+ this . setState ( {
58
+ leftState : this . state . leftState ,
59
+ rightState : rightState
60
+ } ) ;
61
+ } ,
62
+
63
+ // We use a debounced version of it
64
+ updateDiffs : function ( ) {
65
+ var newState = { } ;
66
+ var left = this . props . left ;
67
+ var right = this . state . rightState . getCurrentContent ( ) . getPlainText ( ) ;
68
+
69
+ var diffs = computeDiff ( left , right ) ;
70
+
71
+ // Update the decorators
72
+ newState . leftState = Draft . EditorState . set ( this . state . leftState , {
73
+ decorator : createDiffsDecorator ( diffs , DIFF . REMOVED )
74
+ } ) ;
75
+ newState . rightState = Draft . EditorState . set ( this . state . rightState , {
76
+ decorator : createDiffsDecorator ( diffs , DIFF . INSERTED )
77
+ } ) ;
66
78
this . setState ( newState ) ;
67
79
} ,
68
80
0 commit comments