1
+ import { NavigateFunction } from "react-router"
1
2
import { assign , createMachine } from "xstate"
2
3
import * as API from "../../api"
3
4
import { ApiError , FieldErrors , isApiError , mapApiErrorToFieldErrors } from "../../api/errors"
@@ -15,13 +16,10 @@ export interface UsersContext {
15
16
getUsersError ?: Error | unknown
16
17
createUserError ?: Error | unknown
17
18
createUserFormErrors ?: FieldErrors
19
+ navigate ?: NavigateFunction
18
20
}
19
21
20
- export type UsersEvent =
21
- | { type : "GET_USERS" }
22
- | { type : "ENTER_CREATION_MODE" }
23
- | { type : "EXIT_CREATION_MODE" }
24
- | { type : "CREATE" ; user : TypesGen . CreateUserRequest }
22
+ export type UsersEvent = { type : "GET_USERS" } | { type : "CREATE" ; user : TypesGen . CreateUserRequest }
25
23
26
24
export const usersMachine = createMachine (
27
25
{
@@ -47,7 +45,7 @@ export const usersMachine = createMachine(
47
45
idle : {
48
46
on : {
49
47
GET_USERS : "gettingUsers" ,
50
- ENTER_CREATION_MODE : "creationMode " ,
48
+ CREATE : "creatingUser " ,
51
49
} ,
52
50
} ,
53
51
gettingUsers : {
@@ -69,40 +67,28 @@ export const usersMachine = createMachine(
69
67
} ,
70
68
tags : "loading" ,
71
69
} ,
72
- creationMode : {
73
- initial : "idle" ,
74
- states : {
75
- idle : {
76
- on : {
77
- CREATE : "creatingUser" ,
78
- EXIT_CREATION_MODE : "#usersState.idle" ,
79
- } ,
70
+ creatingUser : {
71
+ invoke : {
72
+ src : "createUser" ,
73
+ id : "createUser" ,
74
+ onDone : {
75
+ target : "idle" ,
76
+ actions : [ "displayCreateUserSuccess" , "redirectToUsersPage" , "clearCreateUserError" ] ,
80
77
} ,
81
- creatingUser : {
82
- invoke : {
83
- src : "createUser" ,
84
- id : "createUser" ,
85
- onDone : {
86
- target : "#usersState.idle" ,
87
- actions : [ "displayCreateUserSuccess" , "clearCreateUserError" ] ,
88
- } ,
89
- onError : [
90
- {
91
- target : "idle" ,
92
- cond : "isFormError" ,
93
- actions : [ "assignCreateUserFormErrors" ] ,
94
- } ,
95
- {
96
- target : "idle" ,
97
- actions : [ "assignCreateUserError" ] ,
98
- } ,
99
- ] ,
78
+ onError : [
79
+ {
80
+ target : "idle" ,
81
+ cond : "isFormError" ,
82
+ actions : [ "assignCreateUserFormErrors" ] ,
100
83
} ,
101
- tags : "loading" ,
102
- } ,
84
+ {
85
+ target : "idle" ,
86
+ actions : [ "assignCreateUserError" ] ,
87
+ } ,
88
+ ] ,
103
89
} ,
90
+ tags : "loading" ,
104
91
} ,
105
-
106
92
error : {
107
93
on : {
108
94
GET_USERS : "gettingUsers" ,
@@ -116,7 +102,7 @@ export const usersMachine = createMachine(
116
102
createUser : ( _ , event ) => API . createUser ( event . user ) ,
117
103
} ,
118
104
guards : {
119
- isFormError : ( _ , event ) => isApiError ( event . data ) ,
105
+ isFormError : ( _ , event ) => isApiError ( event . data )
120
106
} ,
121
107
actions : {
122
108
assignUsers : assign ( {
@@ -135,7 +121,7 @@ export const usersMachine = createMachine(
135
121
} ) ,
136
122
assignCreateUserFormErrors : assign ( {
137
123
// the guard ensures it is ApiError
138
- createUserFormErrors : ( _ , event ) => mapApiErrorToFieldErrors ( ( event . data as ApiError ) . response . data ) ,
124
+ createUserFormErrors : ( _ , event ) => mapApiErrorToFieldErrors ( ( event . data as ApiError ) . response . data )
139
125
} ) ,
140
126
clearCreateUserError : assign ( ( context : UsersContext ) => ( {
141
127
...context ,
@@ -144,6 +130,9 @@ export const usersMachine = createMachine(
144
130
displayCreateUserSuccess : ( ) => {
145
131
displaySuccess ( Language . createUserSuccess )
146
132
} ,
133
+ redirectToUsersPage : ( context ) => {
134
+ context . navigate && context . navigate ( "/users" )
135
+ } ,
147
136
} ,
148
137
} ,
149
138
)
0 commit comments