Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cd1a2d2

Browse files
refactor: Refactor site roles machine to be used in the page (#5692)
1 parent f5a7538 commit cd1a2d2

File tree

3 files changed

+23
-30
lines changed

3 files changed

+23
-30
lines changed

site/src/pages/UsersPage/UsersPage.tsx

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
import { useActor, useMachine } from "@xstate/react"
1+
import { useMachine } from "@xstate/react"
22
import { User } from "api/typesGenerated"
33
import { DeleteDialog } from "components/Dialogs/DeleteDialog/DeleteDialog"
44
import {
55
getPaginationContext,
66
nonInitialPage,
77
} from "components/PaginationWidget/utils"
88
import { usePermissions } from "hooks/usePermissions"
9-
import { FC, ReactNode, useContext, useEffect } from "react"
9+
import { FC, ReactNode } from "react"
1010
import { Helmet } from "react-helmet-async"
1111
import { useNavigate } from "react-router"
1212
import { useSearchParams } from "react-router-dom"
13+
import { siteRolesMachine } from "xServices/roles/siteRolesXService"
1314
import { usersMachine } from "xServices/users/usersXService"
1415
import { ConfirmDialog } from "../../components/Dialogs/ConfirmDialog/ConfirmDialog"
1516
import { ResetPasswordDialog } from "../../components/Dialogs/ResetPasswordDialog/ResetPasswordDialog"
1617
import { pageTitle } from "../../util/page"
17-
import { XServiceContext } from "../../xServices/StateContext"
1818
import { UsersPageView } from "./UsersPageView"
1919

2020
export const Language = {
@@ -30,7 +30,6 @@ const getSelectedUser = (id: string, users?: User[]) =>
3030
users?.find((u) => u.id === id)
3131

3232
export const UsersPage: FC<{ children?: ReactNode }> = () => {
33-
const xServices = useContext(XServiceContext)
3433
const navigate = useNavigate()
3534
const [searchParams, setSearchParams] = useSearchParams()
3635
const filter = searchParams.get("filter") ?? ""
@@ -57,7 +56,11 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => {
5756
} = usersState.context
5857

5958
const { updateUsers: canEditUsers } = usePermissions()
60-
const [rolesState, rolesSend] = useActor(xServices.siteRolesXService)
59+
const [rolesState] = useMachine(siteRolesMachine, {
60+
context: {
61+
hasPermission: canEditUsers,
62+
},
63+
})
6164
const { roles } = rolesState.context
6265

6366
// Is loading if
@@ -67,16 +70,6 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => {
6770
usersState.matches("gettingUsers") ||
6871
(canEditUsers && rolesState.matches("gettingRoles"))
6972

70-
// Fetch roles on component mount
71-
useEffect(() => {
72-
// Only fetch the roles if the user has permission for it
73-
if (canEditUsers) {
74-
rolesSend({
75-
type: "GET_ROLES",
76-
})
77-
}
78-
}, [canEditUsers, rolesSend])
79-
8073
return (
8174
<>
8275
<Helmet>

site/src/xServices/StateContext.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@ import { buildInfoMachine } from "./buildInfo/buildInfoXService"
66
import { updateCheckMachine } from "./updateCheck/updateCheckXService"
77
import { deploymentConfigMachine } from "./deploymentConfig/deploymentConfigMachine"
88
import { entitlementsMachine } from "./entitlements/entitlementsXService"
9-
import { siteRolesMachine } from "./roles/siteRolesXService"
109
import { appearanceMachine } from "./appearance/appearanceXService"
1110

1211
interface XServiceContextType {
1312
authXService: ActorRefFrom<typeof authMachine>
1413
buildInfoXService: ActorRefFrom<typeof buildInfoMachine>
1514
entitlementsXService: ActorRefFrom<typeof entitlementsMachine>
1615
appearanceXService: ActorRefFrom<typeof appearanceMachine>
17-
siteRolesXService: ActorRefFrom<typeof siteRolesMachine>
1816
// Since the info here is used by multiple deployment settings page and we don't want to refetch them every time
1917
deploymentConfigXService: ActorRefFrom<typeof deploymentConfigMachine>
2018
updateCheckXService: ActorRefFrom<typeof updateCheckMachine>
@@ -38,7 +36,6 @@ export const XServiceProvider: FC<{ children: ReactNode }> = ({ children }) => {
3836
buildInfoXService: useInterpret(buildInfoMachine),
3937
entitlementsXService: useInterpret(entitlementsMachine),
4038
appearanceXService: useInterpret(appearanceMachine),
41-
siteRolesXService: useInterpret(siteRolesMachine),
4239
deploymentConfigXService: useInterpret(deploymentConfigMachine),
4340
updateCheckXService: useInterpret(updateCheckMachine),
4441
}}

site/src/xServices/roles/siteRolesXService.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,50 +8,50 @@ export const Language = {
88
}
99

1010
type SiteRolesContext = {
11+
hasPermission: boolean
1112
roles?: TypesGen.AssignableRoles[]
1213
getRolesError: Error | unknown
1314
}
1415

15-
type SiteRolesEvent = {
16-
type: "GET_ROLES"
17-
}
18-
1916
export const siteRolesMachine = createMachine(
2017
{
2118
id: "siteRolesState",
2219
predictableActionArguments: true,
2320
tsTypes: {} as import("./siteRolesXService.typegen").Typegen0,
2421
schema: {
2522
context: {} as SiteRolesContext,
26-
events: {} as SiteRolesEvent,
2723
services: {
2824
getRoles: {
2925
data: {} as TypesGen.AssignableRoles[],
3026
},
3127
},
3228
},
33-
initial: "idle",
29+
initial: "initializing",
3430
states: {
35-
idle: {
36-
on: {
37-
GET_ROLES: "gettingRoles",
38-
},
31+
initializing: {
32+
always: [
33+
{ target: "gettingRoles", cond: "hasPermission" },
34+
{ target: "done" },
35+
],
3936
},
4037
gettingRoles: {
4138
entry: "clearGetRolesError",
4239
invoke: {
4340
id: "getRoles",
4441
src: "getRoles",
4542
onDone: {
46-
target: "idle",
43+
target: "done",
4744
actions: ["assignRoles"],
4845
},
4946
onError: {
50-
target: "idle",
47+
target: "done",
5148
actions: ["assignGetRolesError", "displayGetRolesError"],
5249
},
5350
},
5451
},
52+
done: {
53+
type: "final",
54+
},
5555
},
5656
},
5757
{
@@ -72,5 +72,8 @@ export const siteRolesMachine = createMachine(
7272
services: {
7373
getRoles: () => API.getSiteRoles(),
7474
},
75+
guards: {
76+
hasPermission: ({ hasPermission }) => hasPermission,
77+
},
7578
},
7679
)

0 commit comments

Comments
 (0)