From 059d90c9bf679eba0f9e5f4024d7142036a3b90a Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Sat, 7 Mar 2026 09:12:30 -0600 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20migrate=20Gest=C3=A3o=20de=20E?= =?UTF-8?q?mpresas=20to=20Go=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace Appwrite-based empresa route with direct Go API calls. - Remove Models.Document dependency (cause of infinite loading) - Call /api/v1/companies with auth token from localStorage - Map corporate_name, category, license_number to new API fields - Rewrite EmpresaList with proper Go Company type and clean table - Rewrite EmpresaModal with correct fields matching Go backend Co-Authored-By: Claude Sonnet 4.6 --- .../src/app/dashboard/empresa-novo/page.tsx | 113 +++--- frontend/src/components/EmpresaList.tsx | 169 ++++----- frontend/src/components/EmpresaModal.tsx | 338 +++++++++--------- 3 files changed, 311 insertions(+), 309 deletions(-) diff --git a/frontend/src/app/dashboard/empresa-novo/page.tsx b/frontend/src/app/dashboard/empresa-novo/page.tsx index 98e43f1..a331509 100644 --- a/frontend/src/app/dashboard/empresa-novo/page.tsx +++ b/frontend/src/app/dashboard/empresa-novo/page.tsx @@ -1,53 +1,63 @@ -"use client"; +"use client"; import { useEffect, useMemo, useState } from "react"; -import { Models } from "@/lib/appwrite"; import EmpresaList from "@/components/EmpresaList"; import EmpresaModal from "@/components/EmpresaModal"; +import { API_V1_BASE_URL } from "@/lib/apiBase"; -interface EmpresaFormData { +export interface Company { + id: string; cnpj: string; - razaoSocial: string; - nomeFantasia: string; + corporate_name: string; + category: string; + license_number: string; + is_verified: boolean; + city: string; + state: string; + phone: string; + created_at: string; + updated_at: string; } -const emptyForm: EmpresaFormData = { - cnpj: "", - razaoSocial: "", - nomeFantasia: "", -}; +export interface EmpresaFormData { + cnpj: string; + corporate_name: string; + category: string; + license_number: string; +} -const toPayload = (empresa: EmpresaFormData) => ({ - data: { - cnpj: empresa.cnpj.replace(/\D/g, ""), - "razao-social": empresa.razaoSocial, - "nome-fantasia": empresa.nomeFantasia, - }, +const getToken = () => + typeof window !== "undefined" ? localStorage.getItem("access_token") ?? "" : ""; + +const authHeaders = () => ({ + "Content-Type": "application/json", + Authorization: `Bearer ${getToken()}`, }); export default function EmpresaNovoPage() { - const [empresas, setEmpresas] = useState([]); + const [empresas, setEmpresas] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchTerm, setSearchTerm] = useState(""); const [modalOpen, setModalOpen] = useState(false); - const [empresaEditando, setEmpresaEditando] = useState(null); + const [empresaEditando, setEmpresaEditando] = useState(null); const carregarEmpresas = async () => { setLoading(true); setError(null); try { - const response = await fetch("/api/empresas?page=1&limit=200", { + const response = await fetch(`${API_V1_BASE_URL}/companies?limit=200`, { + headers: authHeaders(), cache: "no-store", }); const data = await response.json(); - if (!response.ok || !data.success) { - throw new Error(data.error || "Erro ao carregar empresas"); + if (!response.ok) { + throw new Error(data.message || "Erro ao carregar empresas"); } - setEmpresas(Array.isArray(data.documents) ? data.documents : []); + setEmpresas(Array.isArray(data.tenants) ? data.tenants : []); } catch (err) { const message = err instanceof Error ? err.message : "Erro ao carregar empresas"; setError(message); @@ -63,23 +73,12 @@ export default function EmpresaNovoPage() { const empresasFiltradas = useMemo(() => { const term = searchTerm.trim().toLowerCase(); - - if (!term) { - return empresas; - } - - return empresas.filter((empresa) => { - const empresaData = empresa as unknown as Record; - const values = [ - empresaData["nome-fantasia"], - empresaData["razao-social"], - empresaData.cnpj, - ] + if (!term) return empresas; + return empresas.filter((e) => + [e.corporate_name, e.cnpj, e.city, e.state] .filter(Boolean) - .map((value) => String(value).toLowerCase()); - - return values.some((value) => value.includes(term)); - }); + .some((v) => v.toLowerCase().includes(term)) + ); }, [empresas, searchTerm]); const handleSave = async (formData: EmpresaFormData) => { @@ -87,20 +86,26 @@ export default function EmpresaNovoPage() { setError(null); try { - const isEdicao = Boolean(empresaEditando?.$id); - const url = isEdicao ? `/api/empresas/${empresaEditando!.$id}` : "/api/empresas"; + const isEdicao = Boolean(empresaEditando?.id); + const url = isEdicao + ? `${API_V1_BASE_URL}/companies/${empresaEditando!.id}` + : `${API_V1_BASE_URL}/companies`; const method = isEdicao ? "PATCH" : "POST"; + const response = await fetch(url, { method, - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(toPayload(formData)), + headers: authHeaders(), + body: JSON.stringify({ + cnpj: formData.cnpj.replace(/\D/g, ""), + corporate_name: formData.corporate_name, + category: formData.category || "farmacia", + license_number: formData.license_number || "PENDING", + }), }); const data = await response.json().catch(() => ({})); - if (!response.ok || !data.success) { - throw new Error(data.error || "Erro ao salvar empresa"); + if (!response.ok) { + throw new Error(data.message || "Erro ao salvar empresa"); } setModalOpen(false); @@ -117,13 +122,14 @@ export default function EmpresaNovoPage() { const handleDelete = async (id: string) => { try { - const response = await fetch(`/api/empresas/${id}`, { + const response = await fetch(`${API_V1_BASE_URL}/companies/${id}`, { method: "DELETE", + headers: authHeaders(), }); - const data = await response.json().catch(() => ({})); - if (!response.ok || data.success === false) { - throw new Error(data.error || "Erro ao excluir empresa"); + if (!response.ok && response.status !== 204) { + const data = await response.json().catch(() => ({})); + throw new Error(data.message || "Erro ao excluir empresa"); } await carregarEmpresas(); @@ -155,7 +161,7 @@ export default function EmpresaNovoPage() { type="text" value={searchTerm} onChange={(event) => setSearchTerm(event.target.value)} - placeholder="Buscar por nome fantasia, razão social ou CNPJ" + placeholder="Buscar por razão social, CNPJ ou cidade" className="flex-1 rounded-xl border border-slate-300 bg-white px-4 py-3 text-sm text-slate-900 outline-none transition focus:border-slate-500 focus:ring-2 focus:ring-slate-200" /> - - - {/* Conteúdo do Modal */} -
-

- {empresa ? 'Atualize os dados da empresa.' : 'Cadastre uma nova empresa na plataforma.'} -

- - {/* Campo CNPJ */} -
- - -
- - {/* Campo Razão Social */} -
- - -
- - {/* Campo Nome Fantasia */} -
- - -
- - {/* Botões */} -
- - - -
-
- + return ( +
+
e.stopPropagation()} + > +
+

+ {empresa ? "Editar Empresa" : "Nova Empresa"} +

+
- ); + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+
+
+
+ ); }; export default EmpresaModal;