refactor(ticket): make details lot-based and remove class-detail flow

This commit is contained in:
2026-07-31 12:49:38 +05:30
parent 44d3be5d27
commit 2caeae7c91
20 changed files with 84 additions and 460 deletions

View File

@@ -1,6 +1,6 @@
'use client';
import { useCallback, useEffect, useMemo, useRef } from 'react';
import { useCallback, useMemo } from 'react';
import { useQueryClient } from '@tanstack/react-query';
import { API_ROUTES } from '@/constants/apiRoutes';
@@ -18,15 +18,9 @@ function isHeartbeatEvent(event: { type?: string } | null | undefined) {
export function useTicketDetailEvents(
ticketId: string | undefined,
defectClass: string | undefined,
enabled = true,
): void {
const queryClient = useQueryClient();
const defectClassRef = useRef(defectClass);
useEffect(() => {
defectClassRef.current = defectClass;
}, [defectClass]);
const refetchTicket = useCallback(() => {
if (!ticketId) return;
@@ -38,11 +32,6 @@ export function useTicketDetailEvents(
queryClient.refetchQueries({
queryKey: ticketKeys.timeline(ticketId),
});
if (defectClassRef.current) {
queryClient.refetchQueries({
queryKey: ticketKeys.classDetail(ticketId, defectClassRef.current),
});
}
queryClient.invalidateQueries({
queryKey: ticketKeys.defectClasses(ticketId),
});

View File

@@ -18,7 +18,6 @@ import type {
RequestTicketExtensionPayload,
ReviewDetectionRepairProofPayload,
ReviewTicketExtensionPayload,
TicketDetail,
TicketAssignmentSummary,
TicketListParams,
DetectionProofStatus,
@@ -78,21 +77,6 @@ export function useTicketTimelineQuery(ticketId: string | undefined) {
});
}
export function useTicketClassDetailQuery(
ticketId: string | undefined,
defectClass: string | undefined,
) {
return useQuery({
queryKey: ticketKeys.classDetail(ticketId ?? '', defectClass ?? ''),
queryFn: () =>
ticketService.getTicketClassDetail(
ticketId as string,
defectClass as string,
),
enabled: Boolean(ticketId && defectClass),
});
}
export function useTicketDefectClassesQuery(ticketId: string | undefined) {
return useQuery({
queryKey: ticketKeys.defectClasses(ticketId ?? ''),
@@ -224,7 +208,6 @@ export function useTicketReviewDetectionsQuery(
export function useDiscardDetectionMutation(
ticketId: string,
videoId: string | undefined,
defectClass?: string,
) {
const queryClient = useQueryClient();
@@ -248,13 +231,6 @@ export function useDiscardDetectionMutation(
queryClient.invalidateQueries({
queryKey: ticketKeys.overview(ticketId),
}),
...(defectClass
? [
queryClient.invalidateQueries({
queryKey: ticketKeys.classDetail(ticketId, defectClass),
}),
]
: []),
queryClient.invalidateQueries({
queryKey: ticketKeys.defectClasses(ticketId),
}),
@@ -372,7 +348,6 @@ export function useAssignTicketMutation(ticketId: string, videoId?: string) {
export function useRequestTicketExtensionMutation(
ticketId: string,
assignmentId: number | undefined,
defectClass: string,
) {
const queryClient = useQueryClient();
@@ -392,9 +367,6 @@ export function useRequestTicketExtensionMutation(
queryClient.invalidateQueries({
queryKey: ticketKeys.extensionRequest(ticketId, assignmentId),
});
queryClient.invalidateQueries({
queryKey: ticketKeys.classDetail(ticketId, defectClass),
});
queryClient.invalidateQueries({
queryKey: ticketKeys.assignments(ticketId),
});
@@ -409,7 +381,6 @@ export function useRequestTicketExtensionMutation(
export function useReviewTicketExtensionMutation(
ticketId: string,
assignmentId: number,
defectClass: string,
) {
const queryClient = useQueryClient();
@@ -425,9 +396,6 @@ export function useReviewTicketExtensionMutation(
queryClient.invalidateQueries({
queryKey: ticketKeys.extensionRequest(ticketId, assignmentId),
});
queryClient.invalidateQueries({
queryKey: ticketKeys.classDetail(ticketId, defectClass),
});
queryClient.invalidateQueries({
queryKey: ticketKeys.assignments(ticketId),
});
@@ -439,18 +407,21 @@ export function useReviewTicketExtensionMutation(
onError: () => toast.error('Failed to review extension request'),
});
}
export function useCloseTicketMutation(ticketId: string) {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (payload: CloseTicketPayload) =>
ticketService.closeTicket(ticketId, payload),
onSuccess: (ticket, payload) => {
onSuccess: () => {
toast.success('Ticket closed');
queryClient.setQueryData<TicketDetail>(
ticketKeys.classDetail(ticketId, payload.defect_class),
ticket,
);
queryClient.invalidateQueries({
queryKey: ticketKeys.overview(ticketId),
});
queryClient.invalidateQueries({
queryKey: ticketKeys.assignments(ticketId),
});
queryClient.invalidateQueries({
queryKey: ticketKeys.timeline(ticketId),
});