Skip to content

Commit 644437a

Browse files
committed
Using immer in reducers
1 parent 10b43e3 commit 644437a

File tree

2 files changed

+74
-95
lines changed

2 files changed

+74
-95
lines changed
Lines changed: 35 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as types from './Auth.constants';
2+
import produce from 'immer';
23

34
let userType: IUser = {
45
id: '',
@@ -14,47 +15,38 @@ const initialState = {
1415
user: userType,
1516
};
1617

17-
export const authReducer = (state = initialState, action: ActionRedux) => {
18-
const { type, payload } = action;
19-
switch (type) {
20-
case types.USER_LOADED:
21-
return {
22-
...state,
23-
isAuthenticated: true,
24-
loading: false,
25-
token: payload.id,
26-
user: payload,
27-
};
28-
case types.LOGIN_SUCCESS:
29-
case types.REGISTER_SUCCESS:
30-
localStorage.setItem('user', JSON.stringify(payload));
31-
return {
32-
...state,
33-
...payload,
34-
isAuthenticated: true,
35-
loading: false,
36-
user: payload,
37-
};
38-
case types.LOGIN_FAILED:
39-
case types.AUTH_ERROR:
40-
case types.REGISTER_FAILED:
41-
localStorage.removeItem('user');
42-
return {
43-
...state,
44-
token: null,
45-
isAuthenticated: false,
46-
loading: false,
47-
};
48-
case types.LOGOUT:
49-
localStorage.removeItem('user');
50-
return {
51-
...state,
52-
token: null,
53-
isAuthenticated: false,
54-
loading: false,
55-
};
18+
export const authReducer = (state = initialState, action: ActionRedux) =>
19+
produce(state, draft => {
20+
switch (action.type) {
21+
case types.USER_LOADED:
22+
draft.isAuthenticated = true;
23+
draft.loading = false;
24+
draft.token = action.payload.id;
25+
draft.user = action.payload;
26+
break;
27+
case types.LOGIN_SUCCESS:
28+
case types.REGISTER_SUCCESS:
29+
localStorage.setItem('user', JSON.stringify(action.payload));
30+
draft.isAuthenticated = true;
31+
draft.loading = false;
32+
draft.user = action.payload;
33+
break;
34+
case types.LOGIN_FAILED:
35+
case types.AUTH_ERROR:
36+
case types.REGISTER_FAILED:
37+
localStorage.removeItem('user');
38+
draft.token = null;
39+
draft.isAuthenticated = false;
40+
draft.loading = false;
41+
break;
42+
case types.LOGOUT:
43+
localStorage.removeItem('user');
44+
draft.token = null;
45+
draft.isAuthenticated = false;
46+
draft.loading = false;
47+
break;
5648

57-
default:
58-
return state;
59-
}
60-
};
49+
default:
50+
return state;
51+
}
52+
});
Lines changed: 39 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as types from './Product.constants';
2+
import produce from 'immer';
23

34
const products = [] as Product[];
45
const initialState = {
@@ -8,56 +9,42 @@ const initialState = {
89
products: products,
910
};
1011

11-
export const productReducer = (state = initialState, action) => {
12-
const { type, payload } = action;
12+
export const productReducer = (state = initialState, action) =>
13+
produce(state, draft => {
14+
const { type, payload } = action;
15+
switch (type) {
16+
case types.GET_PRODUCTS:
17+
draft.products = payload;
18+
draft.loading = false;
19+
break;
20+
case types.GET_PRODUCT:
21+
draft.product = payload;
22+
draft.loading = false;
23+
break;
24+
case types.CREATE_PRODUCT:
25+
draft.products = [payload, ...state.products];
26+
draft.loading = false;
27+
break;
28+
case types.UPDATE_PRODUCT:
29+
draft.product = payload;
30+
draft.loading = false;
31+
break;
32+
case types.DELETE_PRODUCT:
33+
draft.products = state.products.filter(p => p.id !== payload);
34+
draft.loading = false;
35+
break;
36+
case types.PRODUCT_ERROR:
37+
draft.error = payload;
38+
draft.loading = false;
39+
draft.products = [];
40+
draft.product = null;
41+
break;
1342

14-
switch (type) {
15-
case types.GET_PRODUCTS:
16-
return {
17-
...state,
18-
products: payload,
19-
loading: false,
20-
};
21-
case types.GET_PRODUCT:
22-
return {
23-
...state,
24-
product: payload,
25-
loading: false,
26-
};
27-
case types.CREATE_PRODUCT:
28-
return {
29-
...state,
30-
products: [payload, ...state.products],
31-
loading: false,
32-
};
33-
case types.UPDATE_PRODUCT:
34-
return {
35-
...state,
36-
product: payload,
37-
loading: false,
38-
};
39-
case types.DELETE_PRODUCT:
40-
return {
41-
...state,
42-
products: state.products.filter(p => p.id !== payload),
43-
loading: false,
44-
};
45-
case types.PRODUCT_ERROR:
46-
return {
47-
...state,
48-
error: payload,
49-
loading: false,
50-
products: [],
51-
product: null,
52-
};
53-
case types.CLEAR_PRODUCT:
54-
return {
55-
...state,
56-
product: null,
57-
loading: false,
58-
};
59-
60-
default:
61-
return state;
62-
}
63-
};
43+
case types.CLEAR_PRODUCT:
44+
draft.product = null;
45+
draft.loading = false;
46+
break;
47+
default:
48+
return state;
49+
}
50+
});

0 commit comments

Comments
 (0)