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); }}
/>