ui: alternar botao encerrar/reabrir no header do ticket

This commit is contained in:
Esdras Renan 2025-11-14 11:11:40 -03:00
parent aadf156ba5
commit 6560e7047c

View file

@ -19,7 +19,7 @@ import { DeleteTicketDialog } from "@/components/tickets/delete-ticket-dialog"
import { StatusSelect } from "@/components/tickets/status-select"
import { CloseTicketDialog, type AdjustWorkSummaryResult } from "@/components/tickets/close-ticket-dialog"
import { TicketCustomFieldsSection } from "@/components/tickets/ticket-custom-fields"
import { CheckCircle2 } from "lucide-react"
import { CheckCircle2, RotateCcw } from "lucide-react"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
@ -147,7 +147,8 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
: null
const viewerId = convexUserId ?? null
const viewerRole = (role ?? "").toLowerCase()
const viewerEmail = (session?.user?.email ?? machineContext?.assignedUserEmail ?? "").trim().toLowerCase()
const viewerEmailRaw = session?.user?.email ?? machineContext?.assignedUserEmail ?? null
const viewerEmail = (viewerEmailRaw ?? "").trim().toLowerCase()
const [status, setStatus] = useState<TicketStatus>(ticket.status)
const rawReopenDeadline = ticket.reopenDeadline ?? null
const fallbackClosedMs = ticket.closedAt?.getTime() ?? ticket.resolvedAt?.getTime() ?? null
@ -174,19 +175,18 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
return null
}
}, [inferredDeadline, rawReopenDeadline])
const viewerEmail = session?.user?.email ?? machineContext?.assignedUserEmail ?? null
const viewerAvatar = session?.user?.avatarUrl ?? null
const viewerAgentMeta = useMemo(
() => {
if (!convexUserId) return null
return {
id: String(convexUserId),
name: agentName ?? viewerEmail ?? null,
email: viewerEmail,
name: agentName ?? viewerEmailRaw ?? null,
email: viewerEmailRaw,
avatarUrl: viewerAvatar,
}
},
[convexUserId, agentName, viewerEmail, viewerAvatar]
[convexUserId, agentName, viewerEmailRaw, viewerAvatar]
)
useDefaultQueues(ticket.tenantId)
const changeAssignee = useMutation(api.tickets.changeAssignee)
@ -1097,6 +1097,7 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
return (
<div id="ticket-summary-header" className={cardClass}>
<div className="absolute right-6 top-6 flex items-center gap-3">
{status !== "RESOLVED" ? (
<Button
type="button"
className="inline-flex items-center gap-2 rounded-lg border border-sidebar-border bg-sidebar-accent px-3 py-1.5 text-sm font-semibold text-sidebar-accent-foreground transition-all duration-200 ease-out hover:-translate-y-0.5 hover:border-sidebar-ring hover:bg-sidebar-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--sidebar-ring)]/30 active:translate-y-0 active:border-sidebar-ring"
@ -1104,6 +1105,17 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
>
<CheckCircle2 className="size-4" /> Encerrar
</Button>
) : canReopenTicket ? (
<Button
type="button"
className="inline-flex items-center gap-2 rounded-lg border border-sidebar-border bg-white px-3 py-1.5 text-sm font-semibold text-neutral-800 transition-all duration-200 ease-out hover:-translate-y-0.5 hover:border-sidebar-ring hover:bg-slate-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--sidebar-ring)]/30 active:translate-y-0 active:border-sidebar-ring"
onClick={handleReopenTicket}
disabled={isReopening}
>
{isReopening ? <Spinner className="size-4 text-neutral-600" /> : <RotateCcw className="size-4" />}
Reabrir
</Button>
) : null}
{workSummary ? (
<Tooltip>
<TooltipTrigger asChild>