diff --git a/lib/screens/tickets/tickets_list_screen.dart b/lib/screens/tickets/tickets_list_screen.dart index 67d1ca7b..b8571548 100644 --- a/lib/screens/tickets/tickets_list_screen.dart +++ b/lib/screens/tickets/tickets_list_screen.dart @@ -34,6 +34,7 @@ class _TicketsListScreenState extends ConsumerState { String? _selectedStatus; DateTimeRange? _selectedDateRange; bool _isInitial = true; + // (previous deferred listen removed; providers are watched directly) @override void dispose() { @@ -41,6 +42,11 @@ class _TicketsListScreenState extends ConsumerState { super.dispose(); } + @override + void initState() { + super.initState(); + } + bool get _hasTicketFilters { return _subjectController.text.trim().isNotEmpty || _selectedOfficeId != null || @@ -50,11 +56,12 @@ class _TicketsListScreenState extends ConsumerState { @override Widget build(BuildContext context) { + final realtime = ref.watch(realtimeControllerProvider); + final ticketsAsync = ref.watch(ticketsProvider); final officesAsync = ref.watch(officesProvider); final notificationsAsync = ref.watch(notificationsProvider); final profilesAsync = ref.watch(profilesProvider); - final realtime = ref.watch(realtimeControllerProvider); final showSkeleton = realtime.isConnecting || @@ -77,11 +84,11 @@ class _TicketsListScreenState extends ConsumerState { maxWidth: double.infinity, child: Skeletonizer( enabled: effectiveShowSkeleton, - child: ticketsAsync.when( - data: (tickets) { - if (tickets.isEmpty) { - return const Center(child: Text('No tickets yet.')); - } + child: Builder( + builder: (context) { + // Build the list UI immediately so `Skeletonizer` can + // render placeholders while providers are still loading. + final tickets = ticketsAsync.valueOrNull ?? []; final officeById = { for (final office in officesAsync.valueOrNull ?? []) office.id: office, @@ -195,6 +202,7 @@ class _TicketsListScreenState extends ConsumerState { ), ], ); + final listBody = TasQAdaptiveList( items: filteredTickets, onRowTap: (ticket) => context.go('/tickets/${ticket.id}'), @@ -202,8 +210,6 @@ class _TicketsListScreenState extends ConsumerState { filterHeader: filterHeader, skeletonMode: effectiveShowSkeleton, onRequestRefresh: () { - // For server-side pagination, update the query provider - // This will trigger a reload with new pagination parameters ref.read(ticketsQueryProvider.notifier).state = const TicketQuery(offset: 0, limit: 50); }, @@ -212,7 +218,10 @@ class _TicketsListScreenState extends ConsumerState { .read(ticketsQueryProvider.notifier) .update((q) => q.copyWith(offset: firstRow)); }, - isLoading: false, + isLoading: ticketsAsync.maybeWhen( + loading: () => true, + orElse: () => false, + ), columns: [ TasQColumn( header: 'Ticket ID', @@ -324,9 +333,6 @@ class _TicketsListScreenState extends ConsumerState { ], ); }, - loading: () => const SizedBox.shrink(), - error: (error, _) => - Center(child: Text('Failed to load tickets: $error')), ), ), ),