@@ -8,30 +8,18 @@ type State = {
88 count : number ;
99} ;
1010
11- type Action =
12- | { type : "increment" ; value : number }
13- | { type : "decrement" ; value : number }
14- | { type : "reset" } ;
11+ type Action = { type : "update" ; value : number } | { type : "reset" } ;
1512
1613type Effect = { type : "log" ; value : string } | { type : "backup" ; count : number } ;
1714
1815const stateReducer : StateReducer < State , Action , Effect > = ( state , action ) => {
1916 switch ( action . type ) {
20- case "increment" : {
21- return [
22- { count : state . count + action . value } ,
23- [ { type : "log" , value : `increment counter +${ action . value } ` } ] ,
24- ] ;
25- }
26- case "decrement" : {
27- return [
28- { count : state . count - action . value } ,
29- [ { type : "log" , value : `decrement counter -${ action . value } ` } ] ,
30- ] ;
17+ case "update" : {
18+ return [ { count : action . value } , [ { type : "log" , value : `set counter ${ action . value } ` } ] ] ;
3119 }
3220 case "reset" : {
3321 return [
34- { count : 0 } ,
22+ state ,
3523 [
3624 { type : "log" , value : "reset counter" } ,
3725 { type : "backup" , count : state . count } ,
@@ -41,14 +29,15 @@ const stateReducer: StateReducer<State, Action, Effect> = (state, action) => {
4129 }
4230} ;
4331
44- const effectReducer : EffectReducer < Effect > = effect => {
32+ const effectReducer : EffectReducer < Effect , Action > = ( effect , dispatch ) => {
4533 switch ( effect . type ) {
4634 case "log" : {
4735 console . log ( effect . value ) ;
4836 return ;
4937 }
5038 case "backup" : {
5139 localStorage . setItem ( "backup" , String ( effect . count ) ) ;
40+ dispatch ( { type : "update" , value : 0 } ) ;
5241 return ( ) => {
5342 localStorage . clear ( ) ;
5443 } ;
@@ -80,9 +69,21 @@ describe("useBireducer", () => {
8069 return (
8170 < >
8271 < span data-testid = "counter" > { state . count } </ span >
83- < button data-testid = "decrement" onClick = { ( ) => dispatch ( { type : "decrement" , value : 1 } ) } />
84- < button data-testid = "increment" onClick = { ( ) => dispatch ( { type : "increment" , value : 1 } ) } />
85- < button data-testid = "reset" onClick = { ( ) => dispatch ( { type : "reset" } ) } />
72+ < button
73+ data-testid = "decrement"
74+ onClick = { ( ) => dispatch ( { type : "update" , value : state . count - 1 } ) }
75+ >
76+ decrement
77+ </ button >
78+ < button
79+ data-testid = "increment"
80+ onClick = { ( ) => dispatch ( { type : "update" , value : state . count + 1 } ) }
81+ >
82+ increment
83+ </ button >
84+ < button data-testid = "reset" onClick = { ( ) => dispatch ( { type : "reset" } ) } >
85+ reset
86+ </ button >
8687 </ >
8788 ) ;
8889 }
@@ -93,15 +94,17 @@ describe("useBireducer", () => {
9394 fireEvent . click ( screen . getByTestId ( "increment" ) ) ;
9495 fireEvent . click ( screen . getByTestId ( "increment" ) ) ;
9596 expect ( screen . getByTestId ( "counter" ) ) . toHaveTextContent ( "2" ) ;
96- expect ( console . log ) . toHaveBeenNthCalledWith ( 2 , "increment counter +1" ) ;
97+ expect ( console . log ) . toHaveBeenNthCalledWith ( 1 , "set counter 1" ) ;
98+ expect ( console . log ) . toHaveBeenNthCalledWith ( 2 , "set counter 2" ) ;
9799
98100 fireEvent . click ( screen . getByTestId ( "decrement" ) ) ;
99101 expect ( screen . getByTestId ( "counter" ) ) . toHaveTextContent ( "1" ) ;
100- expect ( console . log ) . toHaveBeenLastCalledWith ( "decrement counter - 1") ;
102+ expect ( console . log ) . toHaveBeenNthCalledWith ( 3 , "set counter 1") ;
101103
102104 fireEvent . click ( screen . getByTestId ( "reset" ) ) ;
103105 expect ( screen . getByTestId ( "counter" ) ) . toHaveTextContent ( "0" ) ;
104- expect ( console . log ) . toHaveBeenLastCalledWith ( "reset counter" ) ;
106+ expect ( console . log ) . toHaveBeenNthCalledWith ( 4 , "reset counter" ) ;
107+ expect ( console . log ) . toHaveBeenNthCalledWith ( 5 , "set counter 0" ) ;
105108 expect ( localStorage . setItem ) . toHaveBeenNthCalledWith ( 1 , "backup" , "1" ) ;
106109 expect ( localStorage . clear ) . not . toHaveBeenCalled ( ) ;
107110
0 commit comments