A bit of optimization

This commit is contained in:
Marc Rejohn Castillano 2026-02-28 22:27:23 +08:00
parent f7f22c50d2
commit 70cdbec5d4

View File

@ -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')),
),
),
),