Ajusta timeline, comentários internos e contadores de trabalho
This commit is contained in:
parent
ee18619519
commit
ef25cbe799
7 changed files with 212 additions and 69 deletions
|
|
@ -35,6 +35,19 @@ interface TicketHeaderProps {
|
|||
ticket: TicketWithDetails
|
||||
}
|
||||
|
||||
type WorkSummarySnapshot = {
|
||||
ticketId: Id<"tickets">
|
||||
totalWorkedMs: number
|
||||
internalWorkedMs: number
|
||||
externalWorkedMs: number
|
||||
activeSession: {
|
||||
id: Id<"ticketWorkSessions">
|
||||
agentId: Id<"users">
|
||||
startedAt: number
|
||||
workType?: string
|
||||
} | null
|
||||
}
|
||||
|
||||
const cardClass = "relative space-y-4 rounded-2xl border border-slate-200 bg-white p-6 shadow-sm"
|
||||
const referenceBadgeClass = "inline-flex h-9 items-center gap-2 rounded-full border border-slate-200 bg-white px-3 text-sm font-semibold text-neutral-700"
|
||||
const startButtonClass =
|
||||
|
|
@ -102,7 +115,14 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
|
|||
| {
|
||||
ticketId: Id<"tickets">
|
||||
totalWorkedMs: number
|
||||
activeSession: { id: Id<"ticketWorkSessions">; agentId: Id<"users">; startedAt: number } | null
|
||||
internalWorkedMs?: number
|
||||
externalWorkedMs?: number
|
||||
activeSession: {
|
||||
id: Id<"ticketWorkSessions">
|
||||
agentId: Id<"users">
|
||||
startedAt: number
|
||||
workType?: string
|
||||
} | null
|
||||
}
|
||||
| null
|
||||
| undefined
|
||||
|
|
@ -264,24 +284,63 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
|
|||
}
|
||||
}, [editing, secondaryOptions, selectedCategoryId, selectedSubcategoryId])
|
||||
|
||||
const workSummary = useMemo(() => {
|
||||
if (workSummaryRemote !== undefined) return workSummaryRemote ?? null
|
||||
const ticketActiveSession = ticket.workSummary?.activeSession ?? null
|
||||
const ticketActiveSessionStartedAtMs = ticketActiveSession ? ticketActiveSession.startedAt.getTime() : undefined
|
||||
const ticketActiveSessionWorkType = (ticketActiveSession as { workType?: string } | null)?.workType
|
||||
|
||||
const initialWorkSummary = useMemo<WorkSummarySnapshot | null>(() => {
|
||||
if (!ticket.workSummary) return null
|
||||
return {
|
||||
ticketId: ticket.id as Id<"tickets">,
|
||||
totalWorkedMs: ticket.workSummary.totalWorkedMs,
|
||||
totalWorkedMs: ticket.workSummary.totalWorkedMs ?? 0,
|
||||
internalWorkedMs: ticket.workSummary.internalWorkedMs ?? 0,
|
||||
externalWorkedMs: ticket.workSummary.externalWorkedMs ?? 0,
|
||||
activeSession: ticket.workSummary.activeSession
|
||||
activeSession: ticketActiveSession
|
||||
? {
|
||||
id: ticket.workSummary.activeSession.id as Id<"ticketWorkSessions">,
|
||||
agentId: ticket.workSummary.activeSession.agentId as Id<"users">,
|
||||
startedAt: ticket.workSummary.activeSession.startedAt.getTime(),
|
||||
workType: (ticket.workSummary.activeSession as any).workType ?? "INTERNAL",
|
||||
id: ticketActiveSession.id as Id<"ticketWorkSessions">,
|
||||
agentId: ticketActiveSession.agentId as Id<"users">,
|
||||
startedAt: ticketActiveSessionStartedAtMs ?? ticketActiveSession.startedAt.getTime(),
|
||||
workType: (ticketActiveSessionWorkType ?? "INTERNAL").toString().toUpperCase(),
|
||||
}
|
||||
: null,
|
||||
}
|
||||
}, [ticket.id, ticket.workSummary, workSummaryRemote])
|
||||
}, [
|
||||
ticket.id,
|
||||
ticket.workSummary?.totalWorkedMs,
|
||||
ticket.workSummary?.internalWorkedMs,
|
||||
ticket.workSummary?.externalWorkedMs,
|
||||
ticketActiveSession?.id,
|
||||
ticketActiveSessionStartedAtMs,
|
||||
ticketActiveSessionWorkType,
|
||||
])
|
||||
|
||||
const [workSummary, setWorkSummary] = useState<WorkSummarySnapshot | null>(initialWorkSummary)
|
||||
|
||||
useEffect(() => {
|
||||
setWorkSummary(initialWorkSummary)
|
||||
}, [initialWorkSummary])
|
||||
|
||||
useEffect(() => {
|
||||
if (workSummaryRemote === undefined) return
|
||||
if (workSummaryRemote === null) {
|
||||
setWorkSummary(null)
|
||||
return
|
||||
}
|
||||
setWorkSummary({
|
||||
ticketId: workSummaryRemote.ticketId,
|
||||
totalWorkedMs: workSummaryRemote.totalWorkedMs ?? 0,
|
||||
internalWorkedMs: workSummaryRemote.internalWorkedMs ?? 0,
|
||||
externalWorkedMs: workSummaryRemote.externalWorkedMs ?? 0,
|
||||
activeSession: workSummaryRemote.activeSession
|
||||
? {
|
||||
id: workSummaryRemote.activeSession.id,
|
||||
agentId: workSummaryRemote.activeSession.agentId,
|
||||
startedAt: workSummaryRemote.activeSession.startedAt,
|
||||
workType: (workSummaryRemote.activeSession.workType ?? "INTERNAL").toString().toUpperCase(),
|
||||
}
|
||||
: null,
|
||||
})
|
||||
}, [workSummaryRemote])
|
||||
|
||||
const isPlaying = Boolean(workSummary?.activeSession)
|
||||
const [now, setNow] = useState(() => Date.now())
|
||||
|
|
@ -292,7 +351,7 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
|
|||
setNow(Date.now())
|
||||
}, 1000)
|
||||
return () => clearInterval(interval)
|
||||
}, [workSummary?.activeSession])
|
||||
}, [workSummary?.activeSession?.id])
|
||||
|
||||
useEffect(() => {
|
||||
if (!pauseDialogOpen) {
|
||||
|
|
@ -305,10 +364,10 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
|
|||
const currentSessionMs = workSummary?.activeSession ? Math.max(0, now - workSummary.activeSession.startedAt) : 0
|
||||
const totalWorkedMs = workSummary ? workSummary.totalWorkedMs + currentSessionMs : 0
|
||||
const internalWorkedMs = workSummary
|
||||
? (((workSummary as any).internalWorkedMs ?? 0) + (((workSummary?.activeSession as any)?.workType === "INTERNAL") ? currentSessionMs : 0))
|
||||
? workSummary.internalWorkedMs + (workSummary.activeSession?.workType === "INTERNAL" ? currentSessionMs : 0)
|
||||
: 0
|
||||
const externalWorkedMs = workSummary
|
||||
? (((workSummary as any).externalWorkedMs ?? 0) + (((workSummary?.activeSession as any)?.workType === "EXTERNAL") ? currentSessionMs : 0))
|
||||
? workSummary.externalWorkedMs + (workSummary.activeSession?.workType === "EXTERNAL" ? currentSessionMs : 0)
|
||||
: 0
|
||||
|
||||
const formattedTotalWorked = useMemo(() => formatDuration(totalWorkedMs), [totalWorkedMs])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue