Skip to content

Commit 2878346

Browse files
authored
Use backend error if possible (#1938)
1 parent 1fa50a9 commit 2878346

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

site/src/api/errors.ts

Lines changed: 9 additions & 0 deletions
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

Lines changed: 20 additions & 0 deletions
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

Lines changed: 10 additions & 7 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy