fix: alinhar janela de reabertura do portal com regras do backend
This commit is contained in:
parent
2b0b72cd8b
commit
aadf156ba5
2 changed files with 34 additions and 11 deletions
|
|
@ -280,25 +280,35 @@ export function PortalTicketDetail({ ticketId }: PortalTicketDetailProps) {
|
||||||
const viewerEmail = (session?.user.email ?? machineContext?.assignedUserEmail ?? "")
|
const viewerEmail = (session?.user.email ?? machineContext?.assignedUserEmail ?? "")
|
||||||
.trim()
|
.trim()
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
const reopenDeadline = ticket?.reopenDeadline ?? null
|
const rawReopenDeadline = ticket?.reopenDeadline ?? null
|
||||||
|
const reopenedAt = ticket?.reopenedAt ?? null
|
||||||
const requesterEmail = (ticket?.requester?.email ?? "").trim().toLowerCase()
|
const requesterEmail = (ticket?.requester?.email ?? "").trim().toLowerCase()
|
||||||
const isRequesterById = Boolean(ticket?.requester?.id && viewerId && ticket.requester.id === viewerId)
|
const isRequesterById = Boolean(ticket?.requester?.id && viewerId && ticket.requester.id === viewerId)
|
||||||
const isRequesterByEmail = Boolean(viewerEmail && requesterEmail && viewerEmail === requesterEmail)
|
const isRequesterByEmail = Boolean(viewerEmail && requesterEmail && viewerEmail === requesterEmail)
|
||||||
const isRequester = isRequesterById || isRequesterByEmail
|
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 =
|
const canReopenTicket =
|
||||||
!!ticket &&
|
!!ticket &&
|
||||||
ticket.status === "RESOLVED" &&
|
ticket.status === "RESOLVED" &&
|
||||||
reopenWindowActive &&
|
reopenWindowActive &&
|
||||||
(isStaff || viewerRole === "manager" || isRequester)
|
(isStaff || viewerRole === "manager" || isRequester)
|
||||||
const reopenDeadlineLabel = useMemo(() => {
|
const reopenDeadlineLabel = useMemo(() => {
|
||||||
if (!reopenDeadline) return null
|
const deadline = inferredDeadline ?? rawReopenDeadline
|
||||||
|
if (!deadline) return null
|
||||||
try {
|
try {
|
||||||
return new Date(reopenDeadline).toLocaleString("pt-BR")
|
return new Date(deadline).toLocaleString("pt-BR")
|
||||||
} catch {
|
} catch {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}, [reopenDeadline])
|
}, [inferredDeadline, rawReopenDeadline])
|
||||||
|
|
||||||
const handleReopenTicket = useCallback(async () => {
|
const handleReopenTicket = useCallback(async () => {
|
||||||
if (!ticket || !viewerId) {
|
if (!ticket || !viewerId) {
|
||||||
|
|
|
||||||
|
|
@ -147,20 +147,33 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
|
||||||
: null
|
: null
|
||||||
const viewerId = convexUserId ?? null
|
const viewerId = convexUserId ?? null
|
||||||
const viewerRole = (role ?? "").toLowerCase()
|
const viewerRole = (role ?? "").toLowerCase()
|
||||||
|
const viewerEmail = (session?.user?.email ?? machineContext?.assignedUserEmail ?? "").trim().toLowerCase()
|
||||||
const [status, setStatus] = useState<TicketStatus>(ticket.status)
|
const [status, setStatus] = useState<TicketStatus>(ticket.status)
|
||||||
const reopenDeadline = ticket.reopenDeadline ?? null
|
const rawReopenDeadline = ticket.reopenDeadline ?? null
|
||||||
const isRequester = Boolean(ticket.requester?.id && viewerId && ticket.requester.id === viewerId)
|
const fallbackClosedMs = ticket.closedAt?.getTime() ?? ticket.resolvedAt?.getTime() ?? null
|
||||||
const reopenWindowActive = reopenDeadline ? reopenDeadline > Date.now() : false
|
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 =
|
const canReopenTicket =
|
||||||
status === "RESOLVED" && reopenWindowActive && (isStaff || viewerRole === "manager" || isRequester)
|
status === "RESOLVED" && reopenWindowActive && (isStaff || viewerRole === "manager" || isRequester)
|
||||||
const reopenDeadlineLabel = useMemo(() => {
|
const reopenDeadlineLabel = useMemo(() => {
|
||||||
if (!reopenDeadline) return null
|
const deadline = inferredDeadline ?? rawReopenDeadline
|
||||||
|
if (!deadline) return null
|
||||||
try {
|
try {
|
||||||
return new Date(reopenDeadline).toLocaleString("pt-BR")
|
return new Date(deadline).toLocaleString("pt-BR")
|
||||||
} catch {
|
} catch {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}, [reopenDeadline])
|
}, [inferredDeadline, rawReopenDeadline])
|
||||||
const viewerEmail = session?.user?.email ?? machineContext?.assignedUserEmail ?? null
|
const viewerEmail = session?.user?.email ?? machineContext?.assignedUserEmail ?? null
|
||||||
const viewerAvatar = session?.user?.avatarUrl ?? null
|
const viewerAvatar = session?.user?.avatarUrl ?? null
|
||||||
const viewerAgentMeta = useMemo(
|
const viewerAgentMeta = useMemo(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue