From 98de8e948bf86ed6ab492d86881d5660112d4b56 Mon Sep 17 00:00:00 2001 From: "santasri.pachhal" Date: Fri, 7 Aug 2026 17:56:55 +0530 Subject: [PATCH] feat(ticket): preserve list state across detail navigation --- src/app/(modules)/layout.tsx | 2 +- .../components/TicketDetailHeader.tsx | 4 +- src/app/(modules)/ticket/[ticketId]/page.tsx | 19 +++- src/app/(modules)/ticket/page.tsx | 103 +++++++++++++++--- 4 files changed, 110 insertions(+), 18 deletions(-) diff --git a/src/app/(modules)/layout.tsx b/src/app/(modules)/layout.tsx index ba25eb9..8a77cbf 100644 --- a/src/app/(modules)/layout.tsx +++ b/src/app/(modules)/layout.tsx @@ -11,7 +11,7 @@ const ModulesLayout = ({ }>) => { return ( - +
diff --git a/src/app/(modules)/ticket/[ticketId]/components/TicketDetailHeader.tsx b/src/app/(modules)/ticket/[ticketId]/components/TicketDetailHeader.tsx index b30696c..d5fc034 100644 --- a/src/app/(modules)/ticket/[ticketId]/components/TicketDetailHeader.tsx +++ b/src/app/(modules)/ticket/[ticketId]/components/TicketDetailHeader.tsx @@ -14,8 +14,10 @@ import { OpenRepairReviewAction } from './actions/OpenRepairReviewAction'; export function TicketDetailHeader({ ticket, + backHref, }: { ticket: TicketOverviewDetail; + backHref: string; }) { const router = useRouter(); const ticketName = ticket.ticket_name || 'Unnamed ticket'; @@ -27,7 +29,7 @@ export function TicketDetailHeader({ type="button" variant="secondary" size="icon" - onClick={() => router.push('/ticket')} + onClick={() => router.push(backHref)} aria-label="Back to ticket list" className="shrink-0" > diff --git a/src/app/(modules)/ticket/[ticketId]/page.tsx b/src/app/(modules)/ticket/[ticketId]/page.tsx index 2f53c56..88f7e06 100644 --- a/src/app/(modules)/ticket/[ticketId]/page.tsx +++ b/src/app/(modules)/ticket/[ticketId]/page.tsx @@ -1,12 +1,13 @@ 'use client'; import { useState } from 'react'; -import { useParams, useRouter } from 'next/navigation'; +import { useParams, useRouter, useSearchParams } from 'next/navigation'; import { ArrowLeft } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { PERMISSIONS } from '@/constants/permissions'; import { PermissionGuard } from '@/guards'; +import { ROUTES } from '@/utils/routes'; import { TicketDetailHeader } from './components/TicketDetailHeader'; import { @@ -26,8 +27,20 @@ import { export default function TicketDetailPage() { const router = useRouter(); + const searchParams = useSearchParams(); const { ticketId } = useParams() as { ticketId: string }; const [selectedAssignmentId, setSelectedAssignmentId] = useState(); + const listParams = new URLSearchParams(); + + for (const key of ['page', 'limit', 'segment']) { + const value = searchParams.get(key); + if (value) listParams.set(key, value); + } + + const listSearch = listParams.toString(); + const ticketListHref = listSearch + ? `${ROUTES.TICKET}?${listSearch}` + : ROUTES.TICKET; const overviewQuery = useTicketOverviewQuery(ticketId); const overview = overviewQuery.data; @@ -52,7 +65,7 @@ export default function TicketDetailPage() {