Files
mileograph_flutter/lib/objects/objects.dart
Pete Gregory 40ee16d2d5
Some checks failed
Release / build (push) Failing after 48s
Release / release-dev (push) Has been skipped
Release / release-master (push) Has been skipped
Release / windows-build (push) Has been cancelled
initial codex commit
2025-12-11 01:08:30 +00:00

403 lines
11 KiB
Dart

import 'package:flutter/material.dart';
class DestinationObject {
const DestinationObject(
this.label,
this.icon,
this.selectedIcon,
this.pageWidget,
);
final String label;
final Widget icon;
final Widget selectedIcon;
final Widget pageWidget;
}
class UserData {
const UserData(this.username, this.full_name, this.user_id, this.email);
final String user_id;
final String username;
final String full_name;
final String email;
}
class AuthenticatedUserData extends UserData {
const AuthenticatedUserData({
required String user_id,
required String username,
required String full_name,
required String email,
required this.access_token,
}) : super(username, full_name, user_id, email);
final String access_token;
}
class HomepageStats {
final double totalMileage;
final List<YearlyMileage> yearlyMileage;
final List<LocoSummary> topLocos;
final List<LeaderboardEntry> leaderboard;
final List<TripSummary> trips;
final UserData? user;
HomepageStats({
required this.totalMileage,
required this.yearlyMileage,
required this.topLocos,
required this.leaderboard,
required this.trips,
this.user,
});
factory HomepageStats.fromJson(Map<String, dynamic> json) {
final userData = json['user_data'];
final mileageData = json['milage_data'];
final totalMileage = mileageData is Map && mileageData['mileage'] != null
? (mileageData['mileage'] as num).toDouble()
: 0.0;
return HomepageStats(
totalMileage: totalMileage,
yearlyMileage: (json['yearly_mileage'] as List? ?? [])
.map((e) => YearlyMileage.fromJson(e))
.toList(),
topLocos: (json['top_locos'] as List? ?? [])
.map((e) => LocoSummary.fromJson(e))
.toList(),
leaderboard: (json['leaderboard_data'] as List? ?? [])
.map((e) => LeaderboardEntry.fromJson(e))
.toList(),
trips: (json['trip_data'] as List? ?? [])
.map((e) => TripSummary.fromJson(e))
.toList(),
user: userData == null
? null
: UserData(
userData['username'] ?? '',
userData['full_name'] ?? '',
userData['user_id'] ?? '',
userData['email'] ?? '',
),
);
}
}
class YearlyMileage {
final int? year;
final double mileage;
YearlyMileage({this.year, required this.mileage});
factory YearlyMileage.fromJson(Map<String, dynamic> json) => YearlyMileage(
year: json['year'],
mileage: (json['mileage'] as num).toDouble(),
);
}
class Loco {
final int id;
final String type, number, locoClass;
final String? name, operator, notes, evn;
Loco({
required this.id,
required this.type,
required this.number,
required this.name,
required this.locoClass,
required this.operator,
this.notes,
this.evn,
});
factory Loco.fromJson(Map<String, dynamic> json) => Loco(
id: json['loco_id'],
type: json['type'],
number: json['number'],
name: json['name'] ?? "",
locoClass: json['class'],
operator: json['operator'],
notes: json['notes'],
evn: json['evn'],
);
}
class LocoSummary extends Loco {
final double? mileage;
final int? journeys;
final int? trips;
final String? status;
final String? domain;
final String? owner;
final String? livery;
final String? location;
final Map<String, dynamic> extra;
LocoSummary({
required int locoId,
required String locoType,
required String locoNumber,
required String locoName,
required String locoClass,
required String locoOperator,
String? locoNotes,
String? locoEvn,
this.mileage,
this.journeys,
this.trips,
this.status,
this.domain,
this.owner,
this.livery,
this.location,
Map<String, dynamic>? extra,
}) : extra = extra ?? const {},
super(
id: locoId,
type: locoType,
number: locoNumber,
name: locoName,
locoClass: locoClass,
operator: locoOperator,
notes: locoNotes,
evn: locoEvn,
);
factory LocoSummary.fromJson(Map<String, dynamic> json) => LocoSummary(
locoId: json['loco_id'] ?? json['id'] ?? 0,
locoType: json['type'] ?? json['loco_type'] ?? '',
locoNumber: json['number'] ?? json['loco_number'] ?? '',
locoName: json['name'] ?? json['loco_name'] ?? "",
locoClass: json['class'] ?? json['loco_class'] ?? '',
locoOperator: json['operator'] ?? json['loco_operator'] ?? '',
locoNotes: json['notes'],
locoEvn: json['evn'] ?? json['loco_evn'],
mileage: ((json['loco_mileage'] ?? json['mileage']) as num?)
?.toDouble() ??
0,
journeys: (json['loco_journeys'] ?? json['journeys'] ?? 0) is num
? (json['loco_journeys'] ?? json['journeys'] ?? 0).toInt()
: 0,
trips: (json['loco_trips'] ?? json['trips']) is num
? (json['loco_trips'] ?? json['trips']).toInt()
: null,
status: json['status'] ?? json['loco_status'],
domain: json['domain'],
owner: json['owner'] ?? json['loco_owner'],
livery: json['livery'],
location: json['location'],
extra: Map<String, dynamic>.from(json),
);
}
class LeaderboardEntry {
final String userId, username, userFullName;
final double mileage;
LeaderboardEntry({
required this.userId,
required this.username,
required this.userFullName,
required this.mileage,
});
factory LeaderboardEntry.fromJson(Map<String, dynamic> json) =>
LeaderboardEntry(
userId: json['user_id'],
username: json['username'],
userFullName: json['user_full_name'],
mileage: (json['mileage'] as num).toDouble(),
);
}
class TripSummary {
final int tripId;
final String tripName;
final double tripMileage;
TripSummary({
required this.tripId,
required this.tripName,
required this.tripMileage,
});
factory TripSummary.fromJson(Map<String, dynamic> json) => TripSummary(
tripId: json['trip_id'],
tripName: json['trip_name'],
tripMileage: (json['trip_mileage'] as num).toDouble(),
);
}
class Leg {
final int id, tripId, timezone, driving;
final String start, end, route, network, notes, headcode, user;
final DateTime beginTime;
final double mileage;
final List<Loco> locos;
Leg({
required this.id,
required this.tripId,
required this.start,
required this.end,
required this.beginTime,
required this.timezone,
required this.network,
required this.route,
required this.mileage,
required this.notes,
required this.headcode,
required this.driving,
required this.user,
required this.locos,
});
factory Leg.fromJson(Map<String, dynamic> json) => Leg(
id: json['leg_id'],
tripId: json['leg_trip'] ?? 0,
start: json['leg_start'],
end: json['leg_end'],
beginTime: DateTime.parse(json['leg_begin_time']),
timezone: (json['leg_timezone'] as num).toInt(),
network: json['leg_network'] ?? "",
route: json['leg_route'],
mileage: (json['leg_mileage'] as num).toDouble(),
notes: json['leg_notes'] ?? "",
headcode: json['leg_headcode'] ?? "",
driving: json['leg_driving'],
user: json['leg_user'],
locos: (json['locos'] as List)
.map((e) => Loco.fromJson(e as Map<String, dynamic>))
.toList(),
);
}
class RouteError {
final String error;
final String msg;
RouteError({required this.error, required this.msg});
factory RouteError.fromJson(Map<String, dynamic> json) {
return RouteError(error: json["error"], msg: json["msg"]);
}
}
class RouteResult {
final List<String> inputRoute;
final List<String> calculatedRoute;
final List<double> costs;
final double distance;
RouteResult({
required this.inputRoute,
required this.calculatedRoute,
required this.costs,
required this.distance,
});
factory RouteResult.fromJson(Map<String, dynamic> json) {
return RouteResult(
inputRoute: List<String>.from(json['input_route']),
calculatedRoute: List<String>.from(json['calculated_route']),
costs: (json['costs'] as List).map((e) => (e as num).toDouble()).toList(),
distance: (json['distance'] as num).toDouble(),
);
}
}
class Station {
final int id;
final String name;
final String network;
final String country;
Station({
required this.id,
required this.name,
required this.network,
required this.country,
});
factory Station.fromJson(Map<String, dynamic> json) => Station(
id: json['id'],
name: json['name'],
network: json['network'],
country: json['country'],
);
}
class TripLeg {
final int? id;
final String start;
final String end;
final DateTime? beginTime;
final String? network;
final String? route;
final double? mileage;
final String? notes;
final List<Loco> locos;
TripLeg({
required this.id,
required this.start,
required this.end,
required this.beginTime,
required this.network,
required this.route,
required this.mileage,
required this.notes,
required this.locos,
});
factory TripLeg.fromJson(Map<String, dynamic> json) => TripLeg(
id: json['leg_id'],
start: json['leg_start'] ?? '',
end: json['leg_end'] ?? '',
beginTime:
json['leg_begin_time'] != null && json['leg_begin_time'] is String
? DateTime.tryParse(json['leg_begin_time'])
: (json['leg_begin_time'] is DateTime
? json['leg_begin_time']
: null),
network: json['leg_network'],
route: json['leg_route'],
mileage: (json['leg_mileage'] as num?)?.toDouble(),
notes: json['leg_notes'],
locos: (json['locos'] as List?)
?.map((e) => Loco.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
);
}
class TripDetail {
final int id;
final String name;
final double mileage;
final int legCount;
final List<TripLeg> legs;
TripDetail({
required this.id,
required this.name,
required this.mileage,
required this.legCount,
required this.legs,
});
factory TripDetail.fromJson(Map<String, dynamic> json) => TripDetail(
id: json['trip_id'] ?? 0,
name: json['trip_name'] ?? '',
mileage: (json['trip_mileage'] as num?)?.toDouble() ?? 0,
legCount: json['leg_count'] ??
((json['trip_legs'] as List?)?.length ?? 0),
legs: (json['trip_legs'] as List?)
?.map((e) => TripLeg.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
);
}