()
normalizedRoles.forEach((roleOption) => {
const coerced = coerceRole(roleOption)
+ if (!viewerIsAdmin && isRestrictedRole(coerced)) return
unique.add(coerced)
})
return Array.from(unique)
- }, [normalizedRoles])
+ }, [normalizedRoles, viewerIsAdmin])
const teamUsers = useMemo(() => users.filter((user) => user.role !== "machine"), [users])
const machineUsers = useMemo(() => users.filter((user) => user.role === "machine"), [users])
@@ -297,6 +308,12 @@ export function AdminUsersManager({ initialUsers, initialInvites, roleOptions, d
return
}
+ if (!canManageInvite(revokeCandidate.role)) {
+ toast.error("Você não pode revogar convites deste papel")
+ setRevokeDialogInviteId(null)
+ return
+ }
+
setRevokingId(revokeCandidate.id)
try {
const response = await fetch(`/api/admin/invites/${revokeCandidate.id}`, {
@@ -325,6 +342,10 @@ export function AdminUsersManager({ initialUsers, initialInvites, roleOptions, d
async function handleReactivate(invite: AdminInvite) {
if (!canReactivateInvite(invite)) return
+ if (!canManageInvite(invite.role)) {
+ toast.error("Você não pode reativar convites deste papel")
+ return
+ }
setReactivatingId(invite.id)
try {
const response = await fetch(`/api/admin/invites/${invite.id}`, {
@@ -433,6 +454,10 @@ export function AdminUsersManager({ initialUsers, initialInvites, roleOptions, d
async function handleResetPassword() {
if (!editUser) return
+ if (!canManageUser(editUser.role)) {
+ toast.error("Você não pode gerar senha para este usuário")
+ return
+ }
setIsResettingPassword(true)
toast.loading("Gerando nova senha...", { id: "reset-password" })
try {
@@ -457,12 +482,18 @@ export function AdminUsersManager({ initialUsers, initialInvites, roleOptions, d
}
const isMachineEditing = editUser?.role === "machine"
+ const editingRestricted = editUser ? !canManageUser(editUser.role) : false
const companyOptions = useMemo(
() => [{ id: NO_COMPANY_ID, name: "Sem empresa vinculada" }, ...companies],
[companies]
)
- async function handleDeleteUser() {
+async function handleDeleteUser() {
if (!deleteTarget) return
+ if (!canManageUser(deleteTarget.role)) {
+ toast.error("Você não pode remover esse usuário")
+ setDeleteUserId(null)
+ return
+ }
setIsDeletingUser(true)
const isMachine = deleteTarget.role === "machine"
@@ -547,14 +578,26 @@ export function AdminUsersManager({ initialUsers, initialInvites, roleOptions, d
| {formatDate(user.createdAt)} |
-
@@ -911,7 +959,7 @@ export function AdminUsersManager({ initialUsers, initialInvites, roleOptions, d
onValueChange={(value) =>
setEditForm((prev) => ({ ...prev, companyId: value === NO_COMPANY_ID ? "" : value }))
}
- disabled={isSavingUser}
+ disabled={isSavingUser || editingRestricted}
>
@@ -937,11 +985,11 @@ export function AdminUsersManager({ initialUsers, initialInvites, roleOptions, d
Gerar nova senha
Uma senha temporária será exibida abaixo. Compartilhe com o usuário e peça para trocá-la no primeiro acesso.
-
- {isResettingPassword ? "Gerando..." : "Gerar senha"}
-
-
- {passwordPreview ? (
+
+ {isResettingPassword ? "Gerando..." : "Gerar senha"}
+
+
+ {passwordPreview ? (
{passwordPreview}
setEditUserId(null)} disabled={isSavingUser}>
Cancelar
-
+
{isSavingUser ? "Salvando..." : "Salvar alterações"}
|