72 lines
1.9 KiB
Dart
72 lines
1.9 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
import 'package:mileograph_flutter/objects/objects.dart';
|
|
import 'package:mileograph_flutter/services/apiService.dart'; // assumes you've moved HomepageStats + submodels to a separate file
|
|
|
|
class DataService extends ChangeNotifier {
|
|
final ApiService api;
|
|
|
|
DataService({required this.api});
|
|
|
|
HomepageStats? _homepageStats;
|
|
HomepageStats? get homepageStats => _homepageStats;
|
|
|
|
List<Leg> _legs = [];
|
|
List<Leg> get legs => _legs;
|
|
|
|
bool _isHomepageLoading = false;
|
|
bool get isHomepageLoading => _isHomepageLoading;
|
|
|
|
Future<void> fetchHomepageStats() async {
|
|
_isHomepageLoading = true;
|
|
notifyListeners();
|
|
|
|
try {
|
|
final json = await api.get('/stats/homepage');
|
|
_homepageStats = HomepageStats.fromJson(json);
|
|
} catch (e) {
|
|
debugPrint('Failed to fetch homepage stats: $e');
|
|
_homepageStats = null;
|
|
} finally {
|
|
_isHomepageLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<void> fetchLegs({
|
|
int offset = 0,
|
|
int limit = 100,
|
|
String sortBy = 'date',
|
|
int sortDirection = 0,
|
|
}) async {
|
|
final query = '?sort_direction=$sortDirection&sort_by=$sortBy&offset=$offset&limit=$limit';
|
|
final json = await api.get('/user/legs$query');
|
|
|
|
if (json is List) {
|
|
_legs = json.map((e) => Leg.fromJson(e)).toList();
|
|
notifyListeners();
|
|
} else {
|
|
throw Exception('Unexpected legs response: $json');
|
|
}
|
|
}
|
|
|
|
void clear() {
|
|
_homepageStats = null;
|
|
notifyListeners();
|
|
}
|
|
|
|
double getMileageForCurrentYear() {
|
|
final currentYear = DateTime.now().year;
|
|
return getMileageForYear(currentYear) ?? 0;
|
|
}
|
|
|
|
double? getMileageForYear(int year) {
|
|
return _homepageStats?.yearlyMileage
|
|
.firstWhere(
|
|
(entry) => entry.year == year,
|
|
orElse: () => YearlyMileage(year: null, mileage: 0),
|
|
)
|
|
.mileage ??
|
|
0;
|
|
}
|
|
}
|