A bit of optimization
This commit is contained in:
parent
f7f22c50d2
commit
70cdbec5d4
|
|
@ -34,6 +34,7 @@ class _TicketsListScreenState extends ConsumerState<TicketsListScreen> {
|
|||
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<TicketsListScreen> {
|
|||
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<TicketsListScreen> {
|
|||
|
||||
@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<TicketsListScreen> {
|
|||
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 ?? <Ticket>[];
|
||||
final officeById = <String, Office>{
|
||||
for (final office in officesAsync.valueOrNull ?? <Office>[])
|
||||
office.id: office,
|
||||
|
|
@ -195,6 +202,7 @@ class _TicketsListScreenState extends ConsumerState<TicketsListScreen> {
|
|||
),
|
||||
],
|
||||
);
|
||||
|
||||
final listBody = TasQAdaptiveList<Ticket>(
|
||||
items: filteredTickets,
|
||||
onRowTap: (ticket) => context.go('/tickets/${ticket.id}'),
|
||||
|
|
@ -202,8 +210,6 @@ class _TicketsListScreenState extends ConsumerState<TicketsListScreen> {
|
|||
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<TicketsListScreen> {
|
|||
.read(ticketsQueryProvider.notifier)
|
||||
.update((q) => q.copyWith(offset: firstRow));
|
||||
},
|
||||
isLoading: false,
|
||||
isLoading: ticketsAsync.maybeWhen(
|
||||
loading: () => true,
|
||||
orElse: () => false,
|
||||
),
|
||||
columns: [
|
||||
TasQColumn<Ticket>(
|
||||
header: 'Ticket ID',
|
||||
|
|
@ -324,9 +333,6 @@ class _TicketsListScreenState extends ConsumerState<TicketsListScreen> {
|
|||
],
|
||||
);
|
||||
},
|
||||
loading: () => const SizedBox.shrink(),
|
||||
error: (error, _) =>
|
||||
Center(child: Text('Failed to load tickets: $error')),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user