diff --git a/frontend/src/app/(app)/tickets/page.tsx b/frontend/src/app/(app)/tickets/page.tsx index a72f811..a6beddd 100644 --- a/frontend/src/app/(app)/tickets/page.tsx +++ b/frontend/src/app/(app)/tickets/page.tsx @@ -115,6 +115,11 @@ function TicketsContent() { user?.role === "admin" || user?.role === "agent" || user?.role === "supervisor"; useEffect(() => { + // El loading vive aquí (no en los manejadores): así siempre hay un + // fetch en curso que lo apaga en .finally(). Poner setLoading(true) + // en un onClick sin cambio real de estado dejaba spinner eterno. + // Diferido como el efecto de URL para no disparar cascading renders. + queueMicrotask(() => setLoading(true)); getTickets({ status: statusFilters.length > 0 ? statusFilters : undefined, priority: priorityFilter || undefined, @@ -153,13 +158,11 @@ function TicketsContent() { return next; }); setPage(1); - setLoading(true); }; const selectAllStatuses = () => { setStatusFilters([]); setPage(1); - setLoading(true); }; const statusButtonLabel = @@ -176,7 +179,6 @@ function TicketsContent() { setView("all"); setSearch(""); setPage(1); - setLoading(true); router.replace("/tickets"); }; @@ -240,7 +242,6 @@ function TicketsContent() { onClick={() => { setView(v); setPage(1); - setLoading(true); }} > {label} @@ -314,7 +315,7 @@ function TicketsContent() { className="form-select" style={{ width: "auto" }} value={priorityFilter} - onChange={(e) => { setPriorityFilter(e.target.value); setPage(1); setLoading(true); }} + onChange={(e) => { setPriorityFilter(e.target.value); setPage(1); }} > @@ -331,7 +332,7 @@ function TicketsContent() { style={{ paddingLeft: "2rem" }} placeholder="Buscar tickets..." value={search} - onChange={(e) => { setSearch(e.target.value); setPage(1); setLoading(true); }} + onChange={(e) => { setSearch(e.target.value); setPage(1); }} />