From 604216ddec27a51ccd6b0edfb8d216a917df6e49 Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Thu, 16 Oct 2025 23:35:20 -0300 Subject: [PATCH] feat: improve company forms, phone input, and auth redirects --- middleware.ts | 19 ++++--- .../companies/admin-companies-manager.tsx | 49 +++++++++++++++---- src/components/ui/phone-input.tsx | 6 ++- 3 files changed, 57 insertions(+), 17 deletions(-) diff --git a/middleware.ts b/middleware.ts index 96e9f59..e1e035a 100644 --- a/middleware.ts +++ b/middleware.ts @@ -15,7 +15,7 @@ export async function middleware(request: NextRequest) { return new NextResponse("Invalid Host header", { status: 403 }) } - const { pathname, search } = request.nextUrl + const { pathname, searchParams, search } = request.nextUrl if (pathname.startsWith("/api")) { return NextResponse.next() @@ -49,6 +49,18 @@ export async function middleware(request: NextRequest) { ? ((session.user as unknown as { machinePersona?: string }).machinePersona ?? "").toLowerCase() : null + if (pathname === "/login") { + const callback = searchParams.get("callbackUrl") ?? undefined + const defaultDestination = + role === "machine" + ? machinePersona === "manager" + ? "/dashboard" + : "/portal/tickets" + : APP_HOME + const target = callback && !callback.startsWith("/login") ? callback : defaultDestination + return NextResponse.redirect(new URL(target, request.url)) + } + // Ajusta destinos conforme persona da máquina para evitar loops login<->dashboard if (role === "machine") { // Evita enviar colaborador ao dashboard; redireciona para o Portal @@ -56,11 +68,6 @@ export async function middleware(request: NextRequest) { return NextResponse.redirect(new URL("/portal/tickets", request.url)) } // Evita mostrar login quando já há sessão de máquina - if (pathname === "/login") { - const target = machinePersona === "manager" ? "/dashboard" : "/portal/tickets" - const url = new URL(target, request.url) - return NextResponse.redirect(url) - } } const isAdmin = role === "admin" diff --git a/src/components/admin/companies/admin-companies-manager.tsx b/src/components/admin/companies/admin-companies-manager.tsx index 051a6da..78145c8 100644 --- a/src/components/admin/companies/admin-companies-manager.tsx +++ b/src/components/admin/companies/admin-companies-manager.tsx @@ -1,6 +1,6 @@ "use client" -import { useCallback, useEffect, useMemo, useRef, useState, useTransition } from "react" +import { useCallback, useEffect, useMemo, useRef, useState, useTransition, useId } from "react" import { formatDistanceToNow } from "date-fns" import { ptBR } from "date-fns/locale" import { useQuery } from "convex/react" @@ -86,6 +86,15 @@ export function AdminCompaniesManager({ initialCompanies }: { initialCompanies: const [searchTerm, setSearchTerm] = useState("") const isMobile = useIsMobile() + const nameId = useId() + const slugId = useId() + const descriptionId = useId() + const cnpjId = useId() + const domainId = useId() + const phoneId = useId() + const addressId = useId() + const hoursId = useId() + const machinesQuery = useQuery(api.machines.listByTenant, { includeMetadata: false }) as MachineSummary[] | undefined const machinesByCompanyId = useMemo(() => { const map = new Map() @@ -304,60 +313,80 @@ export function AdminCompaniesManager({ initialCompanies }: { initialCompanies:
- + setForm((p) => ({ ...p, name: e.target.value }))} placeholder="Nome da empresa ou apelido interno" />
- + setForm((p) => ({ ...p, slug: e.target.value }))} placeholder="empresa-exemplo" />
- - setForm((p) => ({ ...p, description: e.target.value }))} placeholder="Resumo, segmento ou observações internas" /> + + setForm((p) => ({ ...p, description: e.target.value }))} + placeholder="Resumo, segmento ou observações internas" + />
- + setForm((p) => ({ ...p, cnpj: e.target.value }))} placeholder="00.000.000/0000-00" />
- + setForm((p) => ({ ...p, domain: e.target.value }))} placeholder="empresa.com.br" />
- + setForm((p) => ({ ...p, phone: value || null }))} />
- + setForm((p) => ({ ...p, address: e.target.value }))} placeholder="Rua, número, bairro, cidade/UF" />
- + (DEFAULT_COUNTRY) const [localDigits, setLocalDigits] = useState("") @@ -144,6 +144,8 @@ export function PhoneInput({ value, onChange, className }: PhoneInputProps) { void className?: string + id?: string + name?: string } export function formatPhoneDisplay(rawValue?: string | null): string | null {