File tree Expand file tree Collapse file tree 2 files changed +33
-3
lines changed Expand file tree Collapse file tree 2 files changed +33
-3
lines changed Original file line number Diff line number Diff line change @@ -154,7 +154,7 @@ test("can time travel with Mutable object", () => {
154
154
setUndoManagerDifferentTree ( self )
155
155
return {
156
156
setProp ( k : string , v : any ) {
157
- ; ( self . mutable as any ) . set ( k , v )
157
+ ; ( self . mutable as any ) . set ( k , v )
158
158
}
159
159
}
160
160
} )
@@ -568,3 +568,31 @@ describe("includeHooks flag", () => {
568
568
] )
569
569
} )
570
570
} )
571
+
572
+ test ( "#15 - rollback by recorder.undo() should not be an UndoState" , ( ) => {
573
+ let _undoManager : any
574
+ const Model = types
575
+ . model ( 'Model' , {
576
+ value : 1 ,
577
+ } )
578
+ . actions ( self => {
579
+ _undoManager = UndoManager . create ( { } , { targetStore : self } )
580
+ function setValue ( value : number ) {
581
+ self . value = value ;
582
+ throw 'some error throw by actions'
583
+ }
584
+ return {
585
+ setValue,
586
+ }
587
+ } )
588
+
589
+ const model = Model . create ( { } )
590
+ try {
591
+ model . setValue ( 2 )
592
+ } catch ( e ) {
593
+ expect ( e ) . toBe ( 'some error throw by actions' )
594
+ }
595
+ // rollback successfully and no UndoState
596
+ expect ( model . value ) . toBe ( 1 )
597
+ expect ( _undoManager . history ) . toHaveLength ( 0 )
598
+ } )
Original file line number Diff line number Diff line change @@ -85,10 +85,10 @@ const UndoManager = types
85
85
} ,
86
86
onFinish ( call , error ) {
87
87
const recorder = call . env ! . recorder
88
- call . env = undefined
89
88
recorder . stop ( )
90
-
91
89
if ( error === undefined ) {
90
+ // if no errors from the action, we can safely clean up call.env before proceeding further
91
+ call . env = undefined
92
92
if ( groupRecorders . length > 0 ) {
93
93
const groupRecorder = groupRecorders [ groupRecorders . length - 1 ]
94
94
groupRecorder . patches = groupRecorder . patches . concat ( recorder . patches )
@@ -99,7 +99,9 @@ const UndoManager = types
99
99
; ( self as any ) . addUndoState ( recorder )
100
100
}
101
101
} else {
102
+ // if there was an error, we need call.env to filtered action from `recorder.undo -> applyPatch`, so we clean up call.env afterwards
102
103
recorder . undo ( )
104
+ call . env = undefined
103
105
}
104
106
}
105
107
} )
You can’t perform that action at this time.
0 commit comments