QoL changes
All checks were successful
All checks were successful
This commit is contained in:
@@ -61,6 +61,10 @@ class DataService extends ChangeNotifier {
|
||||
List<String> get locoClasses => _locoClasses;
|
||||
List<TripSummary> _tripList = [];
|
||||
List<TripSummary> get tripList => _tripList;
|
||||
List<EventField> _eventFields = [];
|
||||
List<EventField> get eventFields => _eventFields;
|
||||
bool _isEventFieldsLoading = false;
|
||||
bool get isEventFieldsLoading => _isEventFieldsLoading;
|
||||
|
||||
// Station Data
|
||||
List<Station>? _cachedStations;
|
||||
@@ -73,6 +77,17 @@ class DataService extends ChangeNotifier {
|
||||
bool _isOnThisDayLoading = false;
|
||||
bool get isOnThisDayLoading => _isOnThisDayLoading;
|
||||
|
||||
static const List<EventField> _fallbackEventFields = [
|
||||
EventField(name: 'operator', display: 'Operator'),
|
||||
EventField(name: 'status', display: 'Status'),
|
||||
EventField(name: 'evn', display: 'EVN'),
|
||||
EventField(name: 'owner', display: 'Owner'),
|
||||
EventField(name: 'location', display: 'Location'),
|
||||
EventField(name: 'livery', display: 'Livery'),
|
||||
EventField(name: 'domain', display: 'Domain'),
|
||||
EventField(name: 'type', display: 'Type'),
|
||||
];
|
||||
|
||||
void _notifyAsync() {
|
||||
// Always defer to the next frame to avoid setState during build.
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||
@@ -260,6 +275,75 @@ class DataService extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<TripLocoStat>> fetchTripLocoStats(int tripId) async {
|
||||
try {
|
||||
final json = await api.get('/trips/stats?trip_id=$tripId');
|
||||
if (json is List) {
|
||||
return json
|
||||
.whereType<Map<String, dynamic>>()
|
||||
.map((e) => TripLocoStat.fromJson(e))
|
||||
.toList();
|
||||
}
|
||||
if (json is Map && json['locos'] is List) {
|
||||
return (json['locos'] as List)
|
||||
.whereType<Map<String, dynamic>>()
|
||||
.map((e) => TripLocoStat.fromJson(e))
|
||||
.toList();
|
||||
}
|
||||
return [];
|
||||
} catch (e) {
|
||||
debugPrint('Failed to fetch trip loco stats: $e');
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> fetchEventFields({bool force = false}) async {
|
||||
if (_eventFields.isNotEmpty && !force) return;
|
||||
_isEventFieldsLoading = true;
|
||||
_notifyAsync();
|
||||
try {
|
||||
final json = await api.get('/event/fields');
|
||||
List<EventField> fields = _parseEventFields(json);
|
||||
if (fields.isEmpty) {
|
||||
fields = _fallbackEventFields;
|
||||
}
|
||||
_eventFields = fields;
|
||||
} catch (e) {
|
||||
debugPrint('Failed to fetch event fields: $e');
|
||||
_eventFields = _fallbackEventFields;
|
||||
} finally {
|
||||
_isEventFieldsLoading = false;
|
||||
_notifyAsync();
|
||||
}
|
||||
}
|
||||
|
||||
List<EventField> _parseEventFields(dynamic json) {
|
||||
if (json is List) {
|
||||
return json
|
||||
.whereType<Map<String, dynamic>>()
|
||||
.map(EventField.fromJson)
|
||||
.toList();
|
||||
}
|
||||
if (json is Map) {
|
||||
if (json['fields'] is List) {
|
||||
return (json['fields'] as List)
|
||||
.whereType<Map<String, dynamic>>()
|
||||
.map(EventField.fromJson)
|
||||
.toList();
|
||||
}
|
||||
// If map of name -> definition
|
||||
return json.entries
|
||||
.where((entry) => entry.value is Map<String, dynamic>)
|
||||
.map((entry) {
|
||||
final map = Map<String, dynamic>.from(entry.value);
|
||||
map['name'] = entry.key;
|
||||
return EventField.fromJson(map);
|
||||
})
|
||||
.toList();
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
Future<void> fetchTrips() async {
|
||||
try {
|
||||
final json = await api.get('/trips/mileage');
|
||||
@@ -314,6 +398,7 @@ class DataService extends ChangeNotifier {
|
||||
_onThisDay = [];
|
||||
_trips = [];
|
||||
_tripDetails = [];
|
||||
_eventFields = [];
|
||||
_notifyAsync();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user