diff --git a/app/manager/usuario/novo/page.tsx b/app/manager/usuario/novo/page.tsx index ee73c95..06227c9 100644 --- a/app/manager/usuario/novo/page.tsx +++ b/app/manager/usuario/novo/page.tsx @@ -18,14 +18,13 @@ import ManagerLayout from "@/components/manager-layout"; import { usersService } from "services/usersApi.mjs"; import { login } from "services/api.mjs"; -// Adicionada a propriedade 'senha' e 'confirmarSenha' interface UserFormData { email: string; nomeCompleto: string; telefone: string; papel: string; senha: string; - confirmarSenha: string; // Novo campo para confirmação + confirmarSenha: string; } const defaultFormData: UserFormData = { @@ -37,7 +36,6 @@ const defaultFormData: UserFormData = { confirmarSenha: "", }; -// Funções de formatação de telefone const cleanNumber = (value: string): string => value.replace(/\D/g, ""); const formatPhone = (value: string): string => { const cleaned = cleanNumber(value).substring(0, 11); @@ -63,13 +61,17 @@ export default function NovoUsuarioPage() { e.preventDefault(); setError(null); - // Validação de campos obrigatórios - if (!formData.email || !formData.nomeCompleto || !formData.papel || !formData.senha || !formData.confirmarSenha) { + if ( + !formData.email || + !formData.nomeCompleto || + !formData.papel || + !formData.senha || + !formData.confirmarSenha + ) { setError("Por favor, preencha todos os campos obrigatórios."); return; } - // Validação de senhas if (formData.senha !== formData.confirmarSenha) { setError("A Senha e a Confirmação de Senha não coincidem."); return; @@ -85,19 +87,20 @@ export default function NovoUsuarioPage() { email: formData.email.trim().toLowerCase(), phone: formData.telefone || null, role: formData.papel, - password: formData.senha, // Senha adicionada + password: formData.senha, }; console.log("📤 Enviando payload:", payload); + await usersService.create_user(payload); router.push("/manager/usuario"); } catch (e: any) { console.error("Erro ao criar usuário:", e); - const msg = - e.message || - "Não foi possível criar o usuário. Verifique os dados e tente novamente."; - setError(msg); + setError( + e?.message || + "Não foi possível criar o usuário. Verifique os dados e tente novamente." + ); } finally { setIsSaving(false); } @@ -105,14 +108,13 @@ export default function NovoUsuarioPage() { return ( - {/* Container principal: w-full e centralizado. max-w-screen-lg para evitar expansão excessiva */}
- - {/* Cabeçalho */}
-

Novo Usuário

+

+ Novo Usuário +

Preencha os dados para cadastrar um novo usuário no sistema.

@@ -122,7 +124,6 @@ export default function NovoUsuarioPage() {
- {/* Formulário */}

Erro no Cadastro:

-

{error}

+

{error}

)} - {/* Campos de Entrada - Usando Grid de 2 colunas para organização */}
- - {/* Nome Completo - Largura total */}
- {/* E-mail (Coluna 1) */}
- {/* Papel (Função) (Coluna 2) */}
handleInputChange("senha", e.target.value)} placeholder="Mínimo 8 caracteres" - minLength={8} + minLength={8} required />
- {/* Confirmar Senha (Coluna 2) */}
handleInputChange("confirmarSenha", e.target.value)} + onChange={(e) => + handleInputChange("confirmarSenha", e.target.value) + } placeholder="Repita a senha" required /> - {formData.senha && formData.confirmarSenha && formData.senha !== formData.confirmarSenha && ( -

As senhas não coincidem.

- )} + {formData.senha && + formData.confirmarSenha && + formData.senha !== formData.confirmarSenha && ( +

+ As senhas não coincidem. +

+ )}
- - {/* Telefone (Opcional, mas mantido no grid) */} +
-
- {/* Botões de Ação */}
); -} \ No newline at end of file +} diff --git a/services/api.mjs b/services/api.mjs index 17f8a0c..6894d9f 100644 --- a/services/api.mjs +++ b/services/api.mjs @@ -5,8 +5,8 @@ const API_KEY = export const apikey = API_KEY; let loginPromise = null; -// 🔹 Autenticação export async function login() { + console.log("🔐 Iniciando login..."); const res = await fetch(`${BASE_URL}/auth/v1/token?grant_type=password`, { method: "POST", headers: { @@ -20,10 +20,19 @@ export async function login() { }), }); + if (!res.ok) { + const msg = await res.text(); + console.error("❌ Erro no login:", res.status, msg); + throw new Error(`Erro ao autenticar: ${res.status} - ${msg}`); + } + const data = await res.json(); - if (typeof window !== "undefined") { + console.log("✅ Login bem-sucedido:", data); + + if (typeof window !== "undefined" && data.access_token) { localStorage.setItem("token", data.access_token); } + return data; } @@ -33,28 +42,42 @@ async function request(endpoint, options = {}) { try { await loginPromise; } catch (error) { - console.error("Falha ao autenticar:", error); + console.error("⚠️ Falha ao autenticar:", error); } finally { loginPromise = null; } - const token = + let token = typeof window !== "undefined" ? localStorage.getItem("token") : null; + if (!token) { + console.warn("⚠️ Token não encontrado, refazendo login..."); + const data = await login(); + token = data.access_token; + } + const headers = { "Content-Type": "application/json", apikey: API_KEY, - ...(token ? { Authorization: `Bearer ${token}` } : {}), + Authorization: `Bearer ${token}`, ...options.headers, }; - const response = await fetch(`${BASE_URL}${endpoint}`, { + const fullUrl = + endpoint.startsWith("/rest/v1") || endpoint.startsWith("/functions/") + ? `${BASE_URL}${endpoint}` + : `${BASE_URL}/rest/v1${endpoint}`; + + console.log("🌐 Requisição para:", fullUrl, "com headers:", headers); + + const response = await fetch(fullUrl, { ...options, headers, }); if (!response.ok) { const msg = await response.text(); + console.error("❌ Erro HTTP:", response.status, msg); throw new Error(`Erro HTTP: ${response.status} - Detalhes: ${msg}`); } @@ -71,3 +94,4 @@ export const api = { request(endpoint, { method: "PATCH", body: JSON.stringify(data) }), delete: (endpoint) => request(endpoint, { method: "DELETE" }), }; + diff --git a/services/usersApi.mjs b/services/usersApi.mjs index eb7d91e..263ada8 100644 --- a/services/usersApi.mjs +++ b/services/usersApi.mjs @@ -2,14 +2,16 @@ import { api } from "./api.mjs"; export const usersService = { async list_roles() { + // continua usando /rest/v1 normalmente return await api.get(`/rest/v1/user_roles?select=id,user_id,role,created_at`); }, async create_user(data) { + // continua usando a Edge Function corretamente return await api.post(`/functions/v1/user-create`, data); }, - // 🚀 Busca dados completos do usuário direto do banco (sem função bloqueada) + // 🚀 Busca dados completos do usuário direto do banco async full_data(user_id) { if (!user_id) throw new Error("user_id é obrigatório");