feat: add equality operators, make history screen paginated, random performance updates

This commit is contained in:
2026-07-29 18:10:46 +02:00
parent da5588cd1c
commit 031a618220
22 changed files with 702 additions and 79 deletions
+63 -2
View File
@@ -8,9 +8,16 @@ class HistoryViewModel extends ChangeNotifier {
HistoryViewModel({required this.barTabService});
static const int _pageSize = 20;
List<ClosedTab> _closedTabs = [];
List<String> _customerNames = [];
String? _selectedCustomer;
int _offset = 0;
int _totalCount = 0;
bool _isLoading = false;
bool _hasLoaded = false;
bool _isLoadingMore = false;
String? _errorMessage;
String _searchQuery = '';
@@ -26,10 +33,18 @@ class HistoryViewModel extends ChangeNotifier {
.toList();
}
List<String> get customerNames => _customerNames;
String? get selectedCustomer => _selectedCustomer;
bool get isLoading => _isLoading;
bool get hasLoaded => _hasLoaded;
bool get isLoadingMore => _isLoadingMore;
bool get hasMore => _closedTabs.length < _totalCount;
String? get errorMessage => _errorMessage;
Future<void> ensureLoaded() async {
@@ -46,7 +61,18 @@ class HistoryViewModel extends ChangeNotifier {
notifyListeners();
try {
_closedTabs = await barTabService.getClosedTabs();
final results = await Future.wait([
_fetchPage(offset: 0),
barTabService.getClosedTabCount(
customerName: _selectedCustomer,
),
barTabService.getDistinctCustomerNames(),
]);
_closedTabs = results[0] as List<ClosedTab>;
_totalCount = results[1] as int;
_customerNames = results[2] as List<String>;
_offset = _closedTabs.length;
} catch (_) {
_errorMessage = 'Could not load tab history.';
} finally {
@@ -56,8 +82,43 @@ class HistoryViewModel extends ChangeNotifier {
}
}
Future<void> loadMore() async {
if (_isLoadingMore || !hasMore) return;
_isLoadingMore = true;
notifyListeners();
try {
final more = await _fetchPage(offset: _offset);
_closedTabs = [..._closedTabs, ...more];
_offset = _closedTabs.length;
} catch (_) {
_errorMessage = 'Could not load more tabs.';
} finally {
_isLoadingMore = false;
notifyListeners();
}
}
Future<List<ClosedTab>> _fetchPage({required int offset}) {
return barTabService.getClosedTabsPaginated(
limit: _pageSize,
offset: offset,
customerName: _selectedCustomer,
);
}
void search(String query) {
_searchQuery = query;
notifyListeners();
}
}
Future<void> filterByCustomer(String? customerName) async {
_selectedCustomer = customerName;
_searchQuery = '';
_offset = 0;
_closedTabs = [];
await load();
}
}