implemented RMV public transit module including trip search, station departures, and nearby stop lookup, added "Marianum Connect" API integration with bearer token authentication and auto-refresh logic, integrated geolocator for location-based station search, added persistent storage for favorite stations and recent trip queries, and implemented comprehensive UI for journey details, trip results, and disruption alerts
This commit is contained in:
@@ -0,0 +1,243 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
import 'iso_duration.dart';
|
||||
|
||||
part 'rmv_models.freezed.dart';
|
||||
part 'rmv_models.g.dart';
|
||||
|
||||
@freezed
|
||||
abstract class Product with _$Product {
|
||||
const factory Product({
|
||||
String? name,
|
||||
String? line,
|
||||
String? displayNumber,
|
||||
String? category,
|
||||
String? categoryCode,
|
||||
String? operator,
|
||||
}) = _Product;
|
||||
|
||||
factory Product.fromJson(Map<String, Object?> json) =>
|
||||
_$ProductFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class StopLocation with _$StopLocation {
|
||||
const factory StopLocation({
|
||||
required String id,
|
||||
String? extId,
|
||||
required String name,
|
||||
String? description,
|
||||
double? lat,
|
||||
double? lon,
|
||||
int? products,
|
||||
int? distanceMeters,
|
||||
}) = _StopLocation;
|
||||
|
||||
factory StopLocation.fromJson(Map<String, Object?> json) =>
|
||||
_$StopLocationFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class Departure with _$Departure {
|
||||
const factory Departure({
|
||||
required String stopId,
|
||||
String? stopExtId,
|
||||
required String stopName,
|
||||
required String name,
|
||||
required String direction,
|
||||
String? directionFlag,
|
||||
required DateTime scheduledTime,
|
||||
DateTime? realTime,
|
||||
int? delayMinutes,
|
||||
String? track,
|
||||
String? realTrack,
|
||||
@Default(false) bool cancelled,
|
||||
@Default(true) bool reachable,
|
||||
Product? product,
|
||||
String? journeyRef,
|
||||
}) = _Departure;
|
||||
|
||||
factory Departure.fromJson(Map<String, Object?> json) =>
|
||||
_$DepartureFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class Arrival with _$Arrival {
|
||||
const factory Arrival({
|
||||
required String stopId,
|
||||
String? stopExtId,
|
||||
required String stopName,
|
||||
required String name,
|
||||
required String origin,
|
||||
required DateTime scheduledTime,
|
||||
DateTime? realTime,
|
||||
int? delayMinutes,
|
||||
String? track,
|
||||
String? realTrack,
|
||||
@Default(false) bool cancelled,
|
||||
Product? product,
|
||||
String? journeyRef,
|
||||
}) = _Arrival;
|
||||
|
||||
factory Arrival.fromJson(Map<String, Object?> json) =>
|
||||
_$ArrivalFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class TripEndpoint with _$TripEndpoint {
|
||||
const factory TripEndpoint({
|
||||
required String stopId,
|
||||
String? stopExtId,
|
||||
required String name,
|
||||
double? lat,
|
||||
double? lon,
|
||||
required DateTime scheduledTime,
|
||||
DateTime? realTime,
|
||||
int? delayMinutes,
|
||||
String? track,
|
||||
String? realTrack,
|
||||
String? type,
|
||||
}) = _TripEndpoint;
|
||||
|
||||
factory TripEndpoint.fromJson(Map<String, Object?> json) =>
|
||||
_$TripEndpointFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class JourneyStop with _$JourneyStop {
|
||||
const factory JourneyStop({
|
||||
required String id,
|
||||
String? extId,
|
||||
required String name,
|
||||
double? lat,
|
||||
double? lon,
|
||||
int? routeIdx,
|
||||
DateTime? scheduledArrival,
|
||||
DateTime? scheduledDeparture,
|
||||
DateTime? realArrival,
|
||||
DateTime? realDeparture,
|
||||
String? arrTrack,
|
||||
String? depTrack,
|
||||
String? realArrTrack,
|
||||
String? realDepTrack,
|
||||
@Default(false) bool cancelled,
|
||||
@Default(false) bool cancelledArrival,
|
||||
@Default(false) bool cancelledDeparture,
|
||||
}) = _JourneyStop;
|
||||
|
||||
factory JourneyStop.fromJson(Map<String, Object?> json) =>
|
||||
_$JourneyStopFromJson(json);
|
||||
}
|
||||
|
||||
enum LegType {
|
||||
@JsonValue('JOURNEY')
|
||||
journey,
|
||||
@JsonValue('WALK')
|
||||
walk,
|
||||
@JsonValue('TRANSFER')
|
||||
transfer,
|
||||
@JsonValue('BIKE')
|
||||
bike,
|
||||
@JsonValue('CAR')
|
||||
car,
|
||||
@JsonValue('PARK_RIDE')
|
||||
parkRide,
|
||||
@JsonValue('TAXI')
|
||||
taxi,
|
||||
@JsonValue('CHECK_IN')
|
||||
checkIn,
|
||||
@JsonValue('CHECK_OUT')
|
||||
checkOut,
|
||||
@JsonValue('DUMMY')
|
||||
dummy,
|
||||
@JsonValue('UNKNOWN')
|
||||
unknown,
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class Leg with _$Leg {
|
||||
const factory Leg({
|
||||
required String id,
|
||||
required int idx,
|
||||
@Default(LegType.unknown) LegType type,
|
||||
String? name,
|
||||
String? category,
|
||||
String? number,
|
||||
String? direction,
|
||||
required TripEndpoint origin,
|
||||
required TripEndpoint destination,
|
||||
@JsonKey(fromJson: IsoDuration.fromJson, toJson: IsoDuration.toJson)
|
||||
Duration? duration,
|
||||
@Default(false) bool cancelled,
|
||||
@Default(false) bool partCancelled,
|
||||
@Default(true) bool reachable,
|
||||
Product? product,
|
||||
String? journeyRef,
|
||||
@Default(<JourneyStop>[]) List<JourneyStop> stops,
|
||||
}) = _Leg;
|
||||
|
||||
factory Leg.fromJson(Map<String, Object?> json) => _$LegFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class Trip with _$Trip {
|
||||
const factory Trip({
|
||||
String? tripId,
|
||||
String? ctxRecon,
|
||||
String? checksum,
|
||||
@JsonKey(fromJson: IsoDuration.fromJson, toJson: IsoDuration.toJson)
|
||||
Duration? duration,
|
||||
@JsonKey(fromJson: IsoDuration.fromJson, toJson: IsoDuration.toJson)
|
||||
Duration? realDuration,
|
||||
int? transferCount,
|
||||
@Default(<Leg>[]) List<Leg> legs,
|
||||
}) = _Trip;
|
||||
|
||||
factory Trip.fromJson(Map<String, Object?> json) => _$TripFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class TripSearchResult with _$TripSearchResult {
|
||||
const factory TripSearchResult({
|
||||
@Default(<Trip>[]) List<Trip> trips,
|
||||
String? scrollContextLater,
|
||||
String? scrollContextEarlier,
|
||||
}) = _TripSearchResult;
|
||||
|
||||
factory TripSearchResult.fromJson(Map<String, Object?> json) =>
|
||||
_$TripSearchResultFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class JourneyDetail with _$JourneyDetail {
|
||||
const factory JourneyDetail({
|
||||
String? journeyId,
|
||||
Product? product,
|
||||
String? direction,
|
||||
@Default(<JourneyStop>[]) List<JourneyStop> stops,
|
||||
}) = _JourneyDetail;
|
||||
|
||||
factory JourneyDetail.fromJson(Map<String, Object?> json) =>
|
||||
_$JourneyDetailFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class HimMessage with _$HimMessage {
|
||||
const factory HimMessage({
|
||||
required String id,
|
||||
String? externalId,
|
||||
String? head,
|
||||
String? lead,
|
||||
String? text,
|
||||
String? category,
|
||||
String? company,
|
||||
int? priority,
|
||||
int? products,
|
||||
DateTime? startValidity,
|
||||
DateTime? endValidity,
|
||||
DateTime? modified,
|
||||
}) = _HimMessage;
|
||||
|
||||
factory HimMessage.fromJson(Map<String, Object?> json) =>
|
||||
_$HimMessageFromJson(json);
|
||||
}
|
||||
Reference in New Issue
Block a user