From aadf156ba5bdbda47f0b77d447b6f36fcc03eb25 Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Fri, 14 Nov 2025 11:09:53 -0300 Subject: [PATCH] fix: alinhar janela de reabertura do portal com regras do backend --- .../portal/portal-ticket-detail.tsx | 20 +++++++++++---- .../tickets/ticket-summary-header.tsx | 25 ++++++++++++++----- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/components/portal/portal-ticket-detail.tsx b/src/components/portal/portal-ticket-detail.tsx index c1fb29b..cfad7db 100644 --- a/src/components/portal/portal-ticket-detail.tsx +++ b/src/components/portal/portal-ticket-detail.tsx @@ -280,25 +280,35 @@ export function PortalTicketDetail({ ticketId }: PortalTicketDetailProps) { const viewerEmail = (session?.user.email ?? machineContext?.assignedUserEmail ?? "") .trim() .toLowerCase() - const reopenDeadline = ticket?.reopenDeadline ?? null + const rawReopenDeadline = ticket?.reopenDeadline ?? null + const reopenedAt = ticket?.reopenedAt ?? null const requesterEmail = (ticket?.requester?.email ?? "").trim().toLowerCase() const isRequesterById = Boolean(ticket?.requester?.id && viewerId && ticket.requester.id === viewerId) const isRequesterByEmail = Boolean(viewerEmail && requesterEmail && viewerEmail === requesterEmail) const isRequester = isRequesterById || isRequesterByEmail - const reopenWindowActive = reopenDeadline ? reopenDeadline > Date.now() : false + + const DEFAULT_REOPEN_DAYS = 7 + const fallbackClosedMs = ticket?.closedAt?.getTime() ?? ticket?.resolvedAt?.getTime() ?? null + const inferredDeadline = rawReopenDeadline + ? rawReopenDeadline + : fallbackClosedMs + ? fallbackClosedMs + DEFAULT_REOPEN_DAYS * 24 * 60 * 60 * 1000 + : null + const reopenWindowActive = inferredDeadline ? inferredDeadline > Date.now() : true const canReopenTicket = !!ticket && ticket.status === "RESOLVED" && reopenWindowActive && (isStaff || viewerRole === "manager" || isRequester) const reopenDeadlineLabel = useMemo(() => { - if (!reopenDeadline) return null + const deadline = inferredDeadline ?? rawReopenDeadline + if (!deadline) return null try { - return new Date(reopenDeadline).toLocaleString("pt-BR") + return new Date(deadline).toLocaleString("pt-BR") } catch { return null } - }, [reopenDeadline]) + }, [inferredDeadline, rawReopenDeadline]) const handleReopenTicket = useCallback(async () => { if (!ticket || !viewerId) { diff --git a/src/components/tickets/ticket-summary-header.tsx b/src/components/tickets/ticket-summary-header.tsx index 9cf6e6c..393c00b 100644 --- a/src/components/tickets/ticket-summary-header.tsx +++ b/src/components/tickets/ticket-summary-header.tsx @@ -147,20 +147,33 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) { : null const viewerId = convexUserId ?? null const viewerRole = (role ?? "").toLowerCase() + const viewerEmail = (session?.user?.email ?? machineContext?.assignedUserEmail ?? "").trim().toLowerCase() const [status, setStatus] = useState(ticket.status) - const reopenDeadline = ticket.reopenDeadline ?? null - const isRequester = Boolean(ticket.requester?.id && viewerId && ticket.requester.id === viewerId) - const reopenWindowActive = reopenDeadline ? reopenDeadline > Date.now() : false + const rawReopenDeadline = ticket.reopenDeadline ?? null + const fallbackClosedMs = ticket.closedAt?.getTime() ?? ticket.resolvedAt?.getTime() ?? null + const DEFAULT_REOPEN_DAYS = 7 + const inferredDeadline = rawReopenDeadline + ? rawReopenDeadline + : fallbackClosedMs + ? fallbackClosedMs + DEFAULT_REOPEN_DAYS * 24 * 60 * 60 * 1000 + : null + const isRequesterById = Boolean(ticket.requester?.id && viewerId && ticket.requester.id === viewerId) + const isRequesterByEmail = Boolean( + viewerEmail && ticket.requester?.email && viewerEmail === ticket.requester.email.trim().toLowerCase(), + ) + const isRequester = isRequesterById || isRequesterByEmail + const reopenWindowActive = inferredDeadline ? inferredDeadline > Date.now() : true const canReopenTicket = status === "RESOLVED" && reopenWindowActive && (isStaff || viewerRole === "manager" || isRequester) const reopenDeadlineLabel = useMemo(() => { - if (!reopenDeadline) return null + const deadline = inferredDeadline ?? rawReopenDeadline + if (!deadline) return null try { - return new Date(reopenDeadline).toLocaleString("pt-BR") + return new Date(deadline).toLocaleString("pt-BR") } catch { return null } - }, [reopenDeadline]) + }, [inferredDeadline, rawReopenDeadline]) const viewerEmail = session?.user?.email ?? machineContext?.assignedUserEmail ?? null const viewerAvatar = session?.user?.avatarUrl ?? null const viewerAgentMeta = useMemo(