Skip to content

Commit c4dbcf5

Browse files
presleypkylecarbs
authored andcommitted
Use backend error if possible (#1938)
1 parent 5f56f01 commit c4dbcf5

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

site/src/api/errors.ts

+9
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,12 @@ export const mapApiErrorToFieldErrors = (apiErrorResponse: ApiErrorResponse): Fi
4444

4545
return result
4646
}
47+
48+
/**
49+
*
50+
* @param error
51+
* @param defaultMessage
52+
* @returns error's message if ApiError or Error, else defaultMessage
53+
*/
54+
export const getErrorMessage = (error: Error | ApiError | unknown, defaultMessage: string): string =>
55+
isApiError(error) ? error.response.data.message : error instanceof Error ? error.message : defaultMessage

site/src/pages/UsersPage/UsersPage.test.tsx

+20
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,26 @@ describe("Users Page", () => {
272272
expect(API.updateUserRoles).toBeCalledTimes(1)
273273
expect(API.updateUserRoles).toBeCalledWith([...currentRoles, MockAuditorRole.name], MockUser.id)
274274
})
275+
it("shows an error from the backend", async () => {
276+
render(
277+
<>
278+
<UsersPage />
279+
<GlobalSnackbar />
280+
</>,
281+
)
282+
283+
server.use(
284+
rest.put(`/api/v2/users/${MockUser.id}/roles`, (req, res, ctx) => {
285+
return res(ctx.status(401), ctx.json({ message: "message from the backend" }))
286+
}),
287+
)
288+
289+
// eslint-disable-next-line @typescript-eslint/no-empty-function
290+
await updateUserRole(() => {}, MockAuditorRole)
291+
292+
// Check if the error message is displayed
293+
await screen.findByText("message from the backend")
294+
})
275295
})
276296
})
277297
})

site/src/xServices/users/usersXService.ts

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { assign, createMachine } from "xstate"
22
import * as API from "../../api/api"
3-
import { ApiError, FieldErrors, isApiError, mapApiErrorToFieldErrors } from "../../api/errors"
3+
import { ApiError, FieldErrors, getErrorMessage, isApiError, mapApiErrorToFieldErrors } from "../../api/errors"
44
import * as TypesGen from "../../api/typesGenerated"
55
import { displayError, displaySuccess } from "../../components/GlobalSnackbar/utils"
66
import { generateRandomString } from "../../util/random"
@@ -292,17 +292,20 @@ export const usersMachine = createMachine(
292292
displaySuspendSuccess: () => {
293293
displaySuccess(Language.suspendUserSuccess)
294294
},
295-
displaySuspendedErrorMessage: () => {
296-
displayError(Language.suspendUserError)
295+
displaySuspendedErrorMessage: (context) => {
296+
const message = getErrorMessage(context.suspendUserError, Language.suspendUserError)
297+
displayError(message)
297298
},
298299
displayResetPasswordSuccess: () => {
299300
displaySuccess(Language.resetUserPasswordSuccess)
300301
},
301-
displayResetPasswordErrorMessage: () => {
302-
displayError(Language.resetUserPasswordError)
302+
displayResetPasswordErrorMessage: (context) => {
303+
const message = getErrorMessage(context.resetUserPasswordError, Language.resetUserPasswordError)
304+
displayError(message)
303305
},
304-
displayUpdateRolesErrorMessage: () => {
305-
displayError(Language.updateUserRolesError)
306+
displayUpdateRolesErrorMessage: (context) => {
307+
const message = getErrorMessage(context.updateUserRolesError, Language.updateUserRolesError)
308+
displayError(message)
306309
},
307310
generateRandomPassword: assign({
308311
newUserPassword: (_) => generateRandomString(12),

0 commit comments

Comments
 (0)