124 lines
2.8 KiB
Dart
124 lines
2.8 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
|
|
import '../models/closed_tab.dart';
|
|
import '../services/bar_tab_service.dart';
|
|
|
|
class HistoryViewModel extends ChangeNotifier {
|
|
final BarTabService barTabService;
|
|
|
|
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 = '';
|
|
|
|
List<ClosedTab> get closedTabs {
|
|
if (_searchQuery.isEmpty) return _closedTabs;
|
|
|
|
return _closedTabs
|
|
.where(
|
|
(tab) => tab.customerName.toLowerCase().contains(
|
|
_searchQuery.toLowerCase(),
|
|
),
|
|
)
|
|
.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 {
|
|
if (_hasLoaded || _isLoading) return;
|
|
|
|
await load();
|
|
}
|
|
|
|
Future<void> load() async {
|
|
if (_isLoading) return;
|
|
|
|
_isLoading = true;
|
|
_errorMessage = null;
|
|
notifyListeners();
|
|
|
|
try {
|
|
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 {
|
|
_hasLoaded = true;
|
|
_isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
} |