diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index 63384c1311..66303ebb03 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -1,4 +1,5 @@ import { useActor, useMachine } from "@xstate/react" +import { User } from "api/typesGenerated" import { DeleteDialog } from "components/Dialogs/DeleteDialog/DeleteDialog" import { getPaginationContext } from "components/PaginationWidget/utils" import { usePermissions } from "hooks/usePermissions" @@ -22,6 +23,9 @@ export const Language = { activateDialogMessagePrefix: "Do you want to activate the user", } +const getSelectedUser = (id: string, users?: User[]) => + users?.find((u) => u.id === id) + export const UsersPage: FC<{ children?: ReactNode }> = () => { const xServices = useContext(XServiceContext) const navigate = useNavigate() @@ -40,18 +44,14 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => { const { users, getUsersError, - userIdToDelete, - userIdToSuspend, - userIdToActivate, + usernameToDelete, + usernameToSuspend, + usernameToActivate, userIdToResetPassword, newUserPassword, paginationRef, } = usersState.context - const userToBeSuspended = users?.find((u) => u.id === userIdToSuspend) - const userToBeDeleted = users?.find((u) => u.id === userIdToDelete) - const userToBeActivated = users?.find((u) => u.id === userIdToActivate) - const userToResetPassword = users?.find((u) => u.id === userIdToResetPassword) const { updateUsers: canEditUsers } = usePermissions() const [rolesState, rolesSend] = useActor(xServices.siteRolesXService) const { roles } = rolesState.context @@ -88,13 +88,25 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => { ) }} onDeleteUser={(user) => { - usersSend({ type: "DELETE_USER", userId: user.id }) + usersSend({ + type: "DELETE_USER", + userId: user.id, + username: user.username, + }) }} onSuspendUser={(user) => { - usersSend({ type: "SUSPEND_USER", userId: user.id }) + usersSend({ + type: "SUSPEND_USER", + userId: user.id, + username: user.username, + }) }} onActivateUser={(user) => { - usersSend({ type: "ACTIVATE_USER", userId: user.id }) + usersSend({ + type: "ACTIVATE_USER", + userId: user.id, + username: user.username, + }) }} onResetUserPassword={(user) => { usersSend({ type: "RESET_USER_PASSWORD", userId: user.id }) @@ -117,25 +129,29 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => { paginationRef={paginationRef} /> - {userToBeDeleted && ( - { - usersSend("CONFIRM_USER_DELETE") - }} - onCancel={() => { - usersSend("CANCEL_USER_DELETE") - }} - /> - )} + { + usersSend("CONFIRM_USER_DELETE") + }} + onCancel={() => { + usersSend("CANCEL_USER_DELETE") + }} + /> = () => { }} description={ <> - {Language.suspendDialogMessagePrefix}{" "} - {userToBeSuspended?.username}? + {Language.suspendDialogMessagePrefix} + {usernameToSuspend && " "} + {usernameToSuspend ?? ""}? } /> @@ -156,7 +173,10 @@ export const UsersPage: FC<{ children?: ReactNode }> = () => { = () => { }} description={ <> - {Language.activateDialogMessagePrefix}{" "} - {userToBeActivated?.username}? + {Language.activateDialogMessagePrefix} + {usernameToActivate && " "} + {usernameToActivate ?? ""}? } /> - { - usersSend("CANCEL_USER_PASSWORD_RESET") - }} - onConfirm={() => { - usersSend("CONFIRM_USER_PASSWORD_RESET") - }} - /> + {userIdToResetPassword && ( + { + usersSend("CANCEL_USER_PASSWORD_RESET") + }} + onConfirm={() => { + usersSend("CONFIRM_USER_PASSWORD_RESET") + }} + /> + )} ) } diff --git a/site/src/xServices/users/usersXService.ts b/site/src/xServices/users/usersXService.ts index 764d3124fa..f35c814a48 100644 --- a/site/src/xServices/users/usersXService.ts +++ b/site/src/xServices/users/usersXService.ts @@ -38,12 +38,15 @@ export interface UsersContext { getUsersError?: Error | unknown // Suspend user userIdToSuspend?: TypesGen.User["id"] + usernameToSuspend?: TypesGen.User["username"] suspendUserError?: Error | unknown // Delete user userIdToDelete?: TypesGen.User["id"] + usernameToDelete?: TypesGen.User["username"] deleteUserError?: Error | unknown // Activate user userIdToActivate?: TypesGen.User["id"] + usernameToActivate?: TypesGen.User["username"] activateUserError?: Error | unknown // Reset user password userIdToResetPassword?: TypesGen.User["id"] @@ -59,15 +62,27 @@ export interface UsersContext { export type UsersEvent = | { type: "GET_USERS"; query?: string } // Suspend events - | { type: "SUSPEND_USER"; userId: TypesGen.User["id"] } + | { + type: "SUSPEND_USER" + userId: TypesGen.User["id"] + username: TypesGen.User["username"] + } | { type: "CONFIRM_USER_SUSPENSION" } | { type: "CANCEL_USER_SUSPENSION" } // Delete events - | { type: "DELETE_USER"; userId: TypesGen.User["id"] } + | { + type: "DELETE_USER" + userId: TypesGen.User["id"] + username: TypesGen.User["username"] + } | { type: "CONFIRM_USER_DELETE" } | { type: "CANCEL_USER_DELETE" } // Activate events - | { type: "ACTIVATE_USER"; userId: TypesGen.User["id"] } + | { + type: "ACTIVATE_USER" + userId: TypesGen.User["id"] + username: TypesGen.User["username"] + } | { type: "CONFIRM_USER_ACTIVATION" } | { type: "CANCEL_USER_ACTIVATION" } // Reset password events @@ -152,18 +167,19 @@ export const usersMachine = tags: "loading", }, idle: { + entry: "clearSelectedUser", on: { SUSPEND_USER: { target: "confirmUserSuspension", - actions: "assignUserIdToSuspend", + actions: "assignUserToSuspend", }, DELETE_USER: { target: "confirmUserDeletion", - actions: "assignUserIdToDelete", + actions: "assignUserToDelete", }, ACTIVATE_USER: { target: "confirmUserActivation", - actions: "assignUserIdToActivate", + actions: "assignUserToActivate", }, RESET_USER_PASSWORD: { target: "confirmUserPasswordReset", @@ -391,6 +407,16 @@ export const usersMachine = }, actions: { + clearSelectedUser: assign({ + userIdToSuspend: (_) => undefined, + usernameToSuspend: (_) => undefined, + userIdToDelete: (_) => undefined, + usernameToDelete: (_) => undefined, + userIdToActivate: (_) => undefined, + usernameToActivate: (_) => undefined, + userIdToResetPassword: (_) => undefined, + userIdToUpdateRoles: (_) => undefined, + }), assignUsers: assign({ users: (_, event) => event.data, }), @@ -400,14 +426,17 @@ export const usersMachine = assignGetUsersError: assign({ getUsersError: (_, event) => event.data, }), - assignUserIdToSuspend: assign({ + assignUserToSuspend: assign({ userIdToSuspend: (_, event) => event.userId, + usernameToSuspend: (_, event) => event.username, }), - assignUserIdToDelete: assign({ + assignUserToDelete: assign({ userIdToDelete: (_, event) => event.userId, + usernameToDelete: (_, event) => event.username, }), - assignUserIdToActivate: assign({ + assignUserToActivate: assign({ userIdToActivate: (_, event) => event.userId, + usernameToActivate: (_, event) => event.username, }), assignUserIdToResetPassword: assign({ userIdToResetPassword: (_, event) => event.userId,