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