chore(site): use react-query to fetch roles (#9630)

This commit is contained in:
Bruno Quaresma
2023-09-12 15:07:56 -03:00
committed by GitHub
parent b33cb0ef97
commit b3c98395ab
4 changed files with 13 additions and 91 deletions
+1 -3
View File
@@ -719,9 +719,7 @@ export const updateUserPassword = async (
): Promise<undefined> =>
axios.put(`/api/v2/users/${userId}/password`, updatePassword);
export const getSiteRoles = async (): Promise<
Array<TypesGen.AssignableRoles>
> => {
export const getRoles = async (): Promise<Array<TypesGen.AssignableRoles>> => {
const response = await axios.get<Array<TypesGen.AssignableRoles>>(
`/api/v2/users/roles`,
);
+8
View File
@@ -0,0 +1,8 @@
import * as API from "api/api";
export const roles = () => {
return {
queryKey: ["roles"],
queryFn: API.getRoles,
};
};
+4 -9
View File
@@ -10,7 +10,6 @@ import { usePermissions } from "hooks/usePermissions";
import { FC, ReactNode, useEffect } from "react";
import { Helmet } from "react-helmet-async";
import { useSearchParams, useNavigate } from "react-router-dom";
import { siteRolesMachine } from "xServices/roles/siteRolesXService";
import { usersMachine } from "xServices/users/usersXService";
import { ConfirmDialog } from "../../components/Dialogs/ConfirmDialog/ConfirmDialog";
import { ResetPasswordDialog } from "./ResetPasswordDialog";
@@ -22,6 +21,7 @@ import { useDashboard } from "components/Dashboard/DashboardProvider";
import { deploymentConfigMachine } from "xServices/deploymentConfig/deploymentConfigMachine";
import { useQuery } from "@tanstack/react-query";
import { getAuthMethods } from "api/api";
import { roles } from "api/queries/roles";
export const Language = {
suspendDialogTitle: "Suspend user",
@@ -64,12 +64,7 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => {
} = usersState.context;
const { updateUsers: canEditUsers, viewDeploymentValues } = usePermissions();
const [rolesState] = useMachine(siteRolesMachine, {
context: {
hasPermission: canEditUsers,
},
});
const { roles } = rolesState.context;
const rolesQuery = useQuery({ ...roles(), enabled: canEditUsers });
// Ideally this only runs if 'canViewDeployment' is true.
// TODO: Prevent api call if the user does not have the perms.
@@ -109,7 +104,7 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => {
// - the user can edit the users but the roles are loading
const isLoading =
usersState.matches("gettingUsers") ||
(canEditUsers && rolesState.matches("gettingRoles")) ||
rolesQuery.isLoading ||
authMethods.isLoading;
return (
@@ -119,7 +114,7 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => {
</Helmet>
<UsersPageView
oidcRoleSyncEnabled={oidcRoleSyncEnabled}
roles={roles}
roles={rolesQuery.data}
users={users}
authMethods={authMethods.data}
count={count}
@@ -1,79 +0,0 @@
import { assign, createMachine } from "xstate";
import * as API from "../../api/api";
import * as TypesGen from "../../api/typesGenerated";
import { displayError } from "../../components/GlobalSnackbar/utils";
export const Language = {
getRolesError: "Error on get the roles.",
};
type SiteRolesContext = {
hasPermission: boolean;
roles?: TypesGen.AssignableRoles[];
getRolesError: unknown;
};
export const siteRolesMachine = createMachine(
{
id: "siteRolesState",
predictableActionArguments: true,
tsTypes: {} as import("./siteRolesXService.typegen").Typegen0,
schema: {
context: {} as SiteRolesContext,
services: {
getRoles: {
data: {} as TypesGen.AssignableRoles[],
},
},
},
initial: "initializing",
states: {
initializing: {
always: [
{ target: "gettingRoles", cond: "hasPermission" },
{ target: "done" },
],
},
gettingRoles: {
entry: "clearGetRolesError",
invoke: {
id: "getRoles",
src: "getRoles",
onDone: {
target: "done",
actions: ["assignRoles"],
},
onError: {
target: "done",
actions: ["assignGetRolesError", "displayGetRolesError"],
},
},
},
done: {
type: "final",
},
},
},
{
actions: {
assignRoles: assign({
roles: (_, event) => event.data,
}),
assignGetRolesError: assign({
getRolesError: (_, event) => event.data,
}),
displayGetRolesError: () => {
displayError(Language.getRolesError);
},
clearGetRolesError: assign({
getRolesError: (_) => undefined,
}),
},
services: {
getRoles: () => API.getSiteRoles(),
},
guards: {
hasPermission: ({ hasPermission }) => hasPermission,
},
},
);