A bit of optimization
This commit is contained in:
parent
f7f22c50d2
commit
70cdbec5d4
|
|
@ -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')),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user