From ba0dcddefbf10d32dccfc0df195e13f1d94dbe53 Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Mon, 13 Oct 2025 19:20:16 -0300 Subject: [PATCH] =?UTF-8?q?Ajusta=20portal=20e=20desktop=20para=20m=C3=A1q?= =?UTF-8?q?uina=20vinculada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/desktop/src/index.css | 4 +- src/app/api/machines/session/route.ts | 48 ++++++++++++++++++-- src/components/portal/portal-shell.tsx | 2 +- src/components/portal/portal-ticket-form.tsx | 17 ++++++- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/apps/desktop/src/index.css b/apps/desktop/src/index.css index 879898e..244ef4d 100644 --- a/apps/desktop/src/index.css +++ b/apps/desktop/src/index.css @@ -21,7 +21,7 @@ body { } .btn { - @apply inline-flex items-center justify-center rounded-lg border px-3 py-2 text-sm font-semibold transition; + @apply inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold transition; } .btn-primary { @@ -49,7 +49,7 @@ body { } .tab-btn { - @apply rounded-lg border border-transparent bg-transparent px-3 py-1.5 text-sm font-medium text-slate-700 hover:bg-slate-100; + @apply rounded-md border border-transparent bg-transparent px-3 py-1.5 text-sm font-medium text-slate-700 hover:bg-slate-100; } .tab-btn.active { diff --git a/src/app/api/machines/session/route.ts b/src/app/api/machines/session/route.ts index a6412d0..790f70f 100644 --- a/src/app/api/machines/session/route.ts +++ b/src/app/api/machines/session/route.ts @@ -6,6 +6,7 @@ import { api } from "@/convex/_generated/api" import type { Id } from "@/convex/_generated/dataModel" import { env } from "@/lib/env" import { assertAuthenticatedSession } from "@/lib/auth-server" +import { DEFAULT_TENANT_ID } from "@/lib/constants" const MACHINE_CTX_COOKIE = "machine_ctx" @@ -88,17 +89,56 @@ export async function GET(request: NextRequest) { authEmail: string | null } + let ensuredAssignedUserId = context.assignedUserId + let ensuredAssignedUserName = context.assignedUserName + let ensuredAssignedUserRole = context.assignedUserRole + + if (!ensuredAssignedUserId && context.persona && context.assignedUserEmail) { + try { + const ensuredUser = (await client.mutation(api.users.ensureUser, { + tenantId: context.tenantId ?? DEFAULT_TENANT_ID, + email: context.assignedUserEmail, + name: context.assignedUserName ?? context.assignedUserEmail, + avatarUrl: undefined, + role: (context.assignedUserRole ?? context.persona ?? "collaborator").toUpperCase(), + companyId: context.companyId ?? undefined, + })) as { _id?: Id<"users">; name?: string | null; role?: string | null } | null + + if (ensuredUser?._id) { + ensuredAssignedUserId = ensuredUser._id as string + ensuredAssignedUserName = ensuredUser.name ?? context.assignedUserName + ensuredAssignedUserRole = ensuredUser.role ?? context.assignedUserRole + + await client.mutation(api.machines.updatePersona, { + machineId: machineId as Id<"machines">, + persona: context.persona ?? undefined, + assignedUserId: ensuredUser._id as Id<"users">, + assignedUserEmail: context.assignedUserEmail, + assignedUserName: ensuredAssignedUserName ?? undefined, + assignedUserRole: (ensuredAssignedUserRole ?? context.persona ?? "collaborator").toUpperCase(), + }) + } + } catch (error) { + console.error("[machines.session] Falha ao garantir usuário vinculado", error) + } + } + const responsePayload = { machineId: context.id, persona: context.persona, - assignedUserId: context.assignedUserId, + assignedUserId: ensuredAssignedUserId, assignedUserEmail: context.assignedUserEmail, - assignedUserName: context.assignedUserName, - assignedUserRole: context.assignedUserRole, + assignedUserName: ensuredAssignedUserName, + assignedUserRole: ensuredAssignedUserRole, } const response = NextResponse.json({ - machine: context, + machine: { + ...context, + assignedUserId: ensuredAssignedUserId ?? null, + assignedUserName: ensuredAssignedUserName ?? null, + assignedUserRole: ensuredAssignedUserRole ?? null, + }, cookie: responsePayload, }) diff --git a/src/components/portal/portal-shell.tsx b/src/components/portal/portal-shell.tsx index 2b937e1..07462a3 100644 --- a/src/components/portal/portal-shell.tsx +++ b/src/components/portal/portal-shell.tsx @@ -79,7 +79,7 @@ export function PortalShell({ children }: PortalShellProps) {
- + Portal do Cliente Raven diff --git a/src/components/portal/portal-ticket-form.tsx b/src/components/portal/portal-ticket-form.tsx index d4f597f..2cbe0bb 100644 --- a/src/components/portal/portal-ticket-form.tsx +++ b/src/components/portal/portal-ticket-form.tsx @@ -48,10 +48,18 @@ export function PortalTicketForm() { const isFormValid = useMemo(() => { return Boolean(subject.trim() && description.trim() && categoryId && subcategoryId) }, [subject, description, categoryId, subcategoryId]) + const isViewerReady = Boolean(viewerId) async function handleSubmit(event: React.FormEvent) { event.preventDefault() - if (!viewerId || !isFormValid || isSubmitting) return + if (isSubmitting || !isFormValid) return + if (!viewerId) { + toast.error( + "Não foi possível identificar o colaborador vinculado a esta máquina. Tente abrir novamente o portal ou contate o suporte.", + { id: "portal-new-ticket" } + ) + return + } const trimmedSubject = subject.trim() const trimmedSummary = summary.trim() @@ -113,6 +121,11 @@ export function PortalTicketForm() { Abrir novo chamado + {!isViewerReady ? ( +
+ Vincule esta máquina a um colaborador na aplicação desktop para enviar chamados em nome dele. +
+ ) : null}
@@ -186,7 +199,7 @@ export function PortalTicketForm() {