From ef55d9bb24430610b60c1b77821307cd72c08c55 Mon Sep 17 00:00:00 2001 From: zwlucas Date: Sat, 25 Jul 2026 18:23:29 -0300 Subject: feat: upload of the project Signed-off-by: zwlucas --- web/src/pages/UsersPage.tsx | 290 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 web/src/pages/UsersPage.tsx (limited to 'web/src/pages/UsersPage.tsx') diff --git a/web/src/pages/UsersPage.tsx b/web/src/pages/UsersPage.tsx new file mode 100644 index 0000000..7406dcd --- /dev/null +++ b/web/src/pages/UsersPage.tsx @@ -0,0 +1,290 @@ +import { useState, type FormEvent } from 'react'; +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { api, type UserResponse } from '@/lib/api'; +import { useAuth } from '@/context/AuthContext'; +import { useToast } from '@/context/ToastContext'; +import styles from './UsersPage.module.css'; + +export default function UsersPage() { + const { user } = useAuth(); + const { addToast } = useToast(); + const queryClient = useQueryClient(); + + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [role, setRole] = useState<'admin' | 'agent' | 'requester'>('requester'); + + const [editingUser, setEditingUser] = useState(null); + const [editName, setEditName] = useState(''); + const [editEmail, setEditEmail] = useState(''); + const [editPassword, setEditPassword] = useState(''); + const [editRole, setEditRole] = useState<'admin' | 'agent' | 'requester'>('requester'); + const [editIsActive, setEditIsActive] = useState(true); + + const { data: users, isLoading } = useQuery({ + queryKey: ['users'], + queryFn: () => api.users.list(), + enabled: user?.role === 'admin', + }); + + const createMutation = useMutation({ + mutationFn: () => api.users.create({ name, email, password, role }), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['users'] }); + setName(''); + setEmail(''); + setPassword(''); + setRole('requester'); + addToast('Usuário criado com sucesso!', 'success'); + }, + onError: (error: any) => { + addToast(`Erro ao criar usuário: ${error.message}`, 'error'); + }, + }); + + const updateMutation = useMutation({ + mutationFn: () => api.users.update(editingUser!.id, { + name: editName, + email: editEmail, + password: editPassword || undefined, + role: editRole, + isActive: editIsActive, + }), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['users'] }); + setEditingUser(null); + addToast('Usuário atualizado com sucesso!', 'success'); + }, + onError: (error: any) => addToast(`Erro ao atualizar: ${error.message}`, 'error'), + }); + + const deleteMutation = useMutation({ + mutationFn: (id: number) => api.users.delete(id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['users'] }); + addToast('Usuário excluído com sucesso!', 'success'); + }, + onError: (error: any) => addToast(`Erro ao excluir: ${error.message}`, 'error'), + }); + + function handleSubmit(e: FormEvent) { + e.preventDefault(); + createMutation.mutate(); + } + + function handleEditSubmit(e: FormEvent) { + e.preventDefault(); + updateMutation.mutate(); + } + + function openEdit(u: UserResponse) { + setEditingUser(u); + setEditName(u.name); + setEditEmail(u.email); + setEditPassword(''); + setEditRole(u.role); + setEditIsActive(u.isActive); + } + + if (user?.role !== 'admin') { + return ( +
+

Acesso Negado

+

Apenas administradores podem gerenciar usuários.

+
+ ); + } + + return ( +
+
+

Criar Novo Usuário

+
+
+ + setName(e.target.value)} + required + /> +
+ +
+ + setEmail(e.target.value)} + required + /> +
+ +
+ + setPassword(e.target.value)} + required + minLength={8} + /> +
+ +
+ + +
+ + +
+
+ +
+

Usuários Cadastrados

+ {isLoading ? ( +

Carregando...

+ ) : ( +
+ + + + + + + + + + + + {users?.map((u) => ( + + + + + + + + ))} + {users?.length === 0 && ( + + + + )} + +
NomeE-mailRoleAtivoAções
{u.name}{u.email}{u.role}{u.isActive ? 'Sim' : 'Não'} + + +
Nenhum usuário encontrado.
+
+ )} +
+ + {editingUser && ( +
+
+

Editar Usuário

+
+
+ + setEditName(e.target.value)} + required + /> +
+
+ + setEditEmail(e.target.value)} + required + /> +
+
+ + setEditPassword(e.target.value)} + minLength={8} + /> +
+
+ + +
+
+ setEditIsActive(e.target.checked)} + /> + +
+ +
+ + +
+
+
+
+ )} +
+ ); +} -- cgit v1.2.3