feat: add equality operators, make history screen paginated, random performance updates
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user