Move to API v3
This commit is contained in:
parent
1f48e868b0
commit
17d8fac893
22 changed files with 3753 additions and 655 deletions
|
@ -4,7 +4,11 @@ import 'package:http/http.dart' as http;
|
||||||
import 'package:info_tren/api/common.dart';
|
import 'package:info_tren/api/common.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
|
|
||||||
Future<StationData> getStationData(String stationName) async {
|
Future<StationData> getStationData(String stationName, [DateTime? date]) async {
|
||||||
final response = await http.get(Uri.https(authority, 'v3/stations/$stationName'));
|
final uri = Uri.https(authority, 'v3/stations/$stationName');
|
||||||
|
if (date != null) {
|
||||||
|
uri.queryParameters['date'] = date.toIso8601String();
|
||||||
|
}
|
||||||
|
final response = await http.get(uri);
|
||||||
return StationData.fromJson(jsonDecode(response.body));
|
return StationData.fromJson(jsonDecode(response.body));
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import 'package:info_tren/models.dart';
|
||||||
|
|
||||||
Future<TrainData> getTrain(String trainNumber, {DateTime? date}) async {
|
Future<TrainData> getTrain(String trainNumber, {DateTime? date}) async {
|
||||||
date ??= DateTime.now();
|
date ??= DateTime.now();
|
||||||
final response = await http.get(Uri.https(authority, 'v2/train/$trainNumber', {
|
final response = await http.get(Uri.https(authority, 'v3/trains/$trainNumber', {
|
||||||
'date': date.toUtc().toIso8601String(),
|
'date': date.toUtc().toIso8601String(),
|
||||||
}),);
|
}),);
|
||||||
return trainDataFromJson(response.body);
|
return trainDataFromJson(response.body);
|
||||||
|
|
|
@ -4,11 +4,11 @@ export 'package:info_tren/models/station_data.dart';
|
||||||
export 'package:info_tren/models/station_status.dart';
|
export 'package:info_tren/models/station_status.dart';
|
||||||
export 'package:info_tren/models/station_train.dart';
|
export 'package:info_tren/models/station_train.dart';
|
||||||
export 'package:info_tren/models/stations_result.dart';
|
export 'package:info_tren/models/stations_result.dart';
|
||||||
export 'package:info_tren/models/train_data.dart' hide State;
|
export 'package:info_tren/models/train_data.dart';
|
||||||
export 'package:info_tren/models/trains_result.dart';
|
export 'package:info_tren/models/trains_result.dart';
|
||||||
export 'package:info_tren/models/ui_design.dart';
|
export 'package:info_tren/models/ui_design.dart';
|
||||||
export 'package:info_tren/models/ui_timezone.dart';
|
export 'package:info_tren/models/ui_timezone.dart';
|
||||||
|
|
||||||
import 'package:info_tren/models/train_data.dart' show State;
|
import 'package:info_tren/models/train_data.dart' show TrainDataStatusState;
|
||||||
|
|
||||||
typedef TrainDataState = State;
|
typedef TrainDataState = TrainDataStatusState;
|
|
@ -1,7 +1,7 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
// ignore_for_file: type=lint
|
// ignore_for_file: type=lint
|
||||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
part of 'station_arrdep.dart';
|
part of 'station_arrdep.dart';
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
// ignore_for_file: type=lint
|
// ignore_for_file: type=lint
|
||||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
part of 'station_data.dart';
|
part of 'station_data.dart';
|
||||||
|
|
||||||
|
@ -158,6 +158,7 @@ class _$_StationData implements _StationData {
|
||||||
List<StationArrDep>? get arrivals {
|
List<StationArrDep>? get arrivals {
|
||||||
final value = _arrivals;
|
final value = _arrivals;
|
||||||
if (value == null) return null;
|
if (value == null) return null;
|
||||||
|
if (_arrivals is EqualUnmodifiableListView) return _arrivals;
|
||||||
// ignore: implicit_dynamic_type
|
// ignore: implicit_dynamic_type
|
||||||
return EqualUnmodifiableListView(value);
|
return EqualUnmodifiableListView(value);
|
||||||
}
|
}
|
||||||
|
@ -167,6 +168,7 @@ class _$_StationData implements _StationData {
|
||||||
List<StationArrDep>? get departures {
|
List<StationArrDep>? get departures {
|
||||||
final value = _departures;
|
final value = _departures;
|
||||||
if (value == null) return null;
|
if (value == null) return null;
|
||||||
|
if (_departures is EqualUnmodifiableListView) return _departures;
|
||||||
// ignore: implicit_dynamic_type
|
// ignore: implicit_dynamic_type
|
||||||
return EqualUnmodifiableListView(value);
|
return EqualUnmodifiableListView(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
// ignore_for_file: type=lint
|
// ignore_for_file: type=lint
|
||||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
part of 'station_status.dart';
|
part of 'station_status.dart';
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
// ignore_for_file: type=lint
|
// ignore_for_file: type=lint
|
||||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
part of 'station_train.dart';
|
part of 'station_train.dart';
|
||||||
|
|
||||||
|
@ -189,6 +189,7 @@ class _$_StationTrain implements _StationTrain {
|
||||||
List<String>? get route {
|
List<String>? get route {
|
||||||
final value = _route;
|
final value = _route;
|
||||||
if (value == null) return null;
|
if (value == null) return null;
|
||||||
|
if (_route is EqualUnmodifiableListView) return _route;
|
||||||
// ignore: implicit_dynamic_type
|
// ignore: implicit_dynamic_type
|
||||||
return EqualUnmodifiableListView(value);
|
return EqualUnmodifiableListView(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
// ignore_for_file: type=lint
|
// ignore_for_file: type=lint
|
||||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
part of 'stations_result.dart';
|
part of 'stations_result.dart';
|
||||||
|
|
||||||
|
@ -121,6 +121,7 @@ class _$_StationsResult implements _StationsResult {
|
||||||
List<String>? get stoppedAtBy {
|
List<String>? get stoppedAtBy {
|
||||||
final value = _stoppedAtBy;
|
final value = _stoppedAtBy;
|
||||||
if (value == null) return null;
|
if (value == null) return null;
|
||||||
|
if (_stoppedAtBy is EqualUnmodifiableListView) return _stoppedAtBy;
|
||||||
// ignore: implicit_dynamic_type
|
// ignore: implicit_dynamic_type
|
||||||
return EqualUnmodifiableListView(value);
|
return EqualUnmodifiableListView(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,181 +4,106 @@
|
||||||
|
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
|
||||||
|
part 'train_data.freezed.dart';
|
||||||
|
part 'train_data.g.dart';
|
||||||
|
|
||||||
TrainData trainDataFromJson(String str) => TrainData.fromJson(json.decode(str));
|
TrainData trainDataFromJson(String str) => TrainData.fromJson(json.decode(str));
|
||||||
|
|
||||||
String trainDataToJson(TrainData data) => json.encode(data.toJson());
|
String trainDataToJson(TrainData data) => json.encode(data.toJson());
|
||||||
|
|
||||||
/// Results of scrapping InfoFer website for train info
|
/// Results of scrapping InfoFer website for train info
|
||||||
class TrainData {
|
@freezed
|
||||||
TrainData({
|
class TrainData with _$TrainData {
|
||||||
required this.date,
|
const TrainData._();
|
||||||
required this.number,
|
|
||||||
required this.operator,
|
|
||||||
required this.rank,
|
|
||||||
required this.route,
|
|
||||||
required this.stations,
|
|
||||||
this.status,
|
|
||||||
});
|
|
||||||
|
|
||||||
final String date;
|
const factory TrainData({
|
||||||
final String number;
|
required String rank,
|
||||||
final String operator;
|
required String number,
|
||||||
final String rank;
|
required String date,
|
||||||
final Route route;
|
required String operator,
|
||||||
final List<Station> stations;
|
required List<TrainDataGroup> groups,
|
||||||
final TrainDataStatus? status;
|
}) = _TrainData;
|
||||||
|
|
||||||
factory TrainData.fromJson(Map<String, dynamic> json) => TrainData(
|
factory TrainData.fromJson(Map<String, dynamic> json) => _$TrainDataFromJson(json);
|
||||||
date: json["date"],
|
|
||||||
number: json["number"],
|
|
||||||
operator: json["operator"],
|
|
||||||
rank: json["rank"],
|
|
||||||
route: Route.fromJson(json["route"]),
|
|
||||||
stations: List<Station>.from(
|
|
||||||
json["stations"].map((x) => Station.fromJson(x))),
|
|
||||||
status: json["status"] == null
|
|
||||||
? null
|
|
||||||
: TrainDataStatus.fromJson(json["status"]),
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
List<TrainDataStation> get stations => groups.first.stations;
|
||||||
"date": date,
|
TrainDataRoute get route => groups.first.route;
|
||||||
"number": number,
|
TrainDataStatus? get status => groups.first.status;
|
||||||
"operator": operator,
|
}
|
||||||
"rank": rank,
|
|
||||||
"route": route.toJson(),
|
@freezed
|
||||||
"stations": List<dynamic>.from(stations.map((x) => x.toJson())),
|
class TrainDataGroup with _$TrainDataGroup {
|
||||||
"status": status?.toJson(),
|
const factory TrainDataGroup({
|
||||||
};
|
required TrainDataRoute route,
|
||||||
|
required List<TrainDataStation> stations,
|
||||||
|
TrainDataStatus? status,
|
||||||
|
}) = _TrainDataGroup;
|
||||||
|
|
||||||
|
factory TrainDataGroup.fromJson(Map<String, dynamic> json) => _$TrainDataGroupFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Route of the train
|
/// Route of the train
|
||||||
class Route {
|
@freezed
|
||||||
Route({
|
class TrainDataRoute with _$TrainDataRoute {
|
||||||
required this.from,
|
const factory TrainDataRoute({
|
||||||
required this.to,
|
required String from,
|
||||||
});
|
required String to,
|
||||||
|
}) = _TrainDataRoute;
|
||||||
|
|
||||||
final String from;
|
factory TrainDataRoute.fromJson(Map<String, dynamic> json) => _$TrainDataRouteFromJson(json);
|
||||||
final String to;
|
|
||||||
|
|
||||||
factory Route.fromJson(Map<String, dynamic> json) => Route(
|
|
||||||
from: json["from"],
|
|
||||||
to: json["to"],
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
|
||||||
"from": from,
|
|
||||||
"to": to,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Station {
|
@freezed
|
||||||
Station({
|
class TrainDataStation with _$TrainDataStation {
|
||||||
this.arrival,
|
const factory TrainDataStation({
|
||||||
this.departure,
|
required String name,
|
||||||
required this.km,
|
required String linkName,
|
||||||
required this.name,
|
required int km,
|
||||||
this.platform,
|
int? stoppingTime,
|
||||||
this.stoppingTime,
|
String? platform,
|
||||||
});
|
StationArrDepTime? arrival,
|
||||||
|
StationArrDepTime? departure,
|
||||||
|
@TrainDataNoteConverter()
|
||||||
|
required List<TrainDataNote> notes,
|
||||||
|
}) = _TrainDataStation;
|
||||||
|
|
||||||
final StationArrDepTime? arrival;
|
factory TrainDataStation.fromJson(Map<String, dynamic> json) => _$TrainDataStationFromJson(json);
|
||||||
final StationArrDepTime? departure;
|
|
||||||
final int km;
|
|
||||||
final String name;
|
|
||||||
final String? platform;
|
|
||||||
final int? stoppingTime;
|
|
||||||
|
|
||||||
factory Station.fromJson(Map<String, dynamic> json) => Station(
|
|
||||||
arrival: json["arrival"] == null
|
|
||||||
? null
|
|
||||||
: StationArrDepTime.fromJson(json["arrival"]),
|
|
||||||
departure: json["departure"] == null
|
|
||||||
? null
|
|
||||||
: StationArrDepTime.fromJson(json["departure"]),
|
|
||||||
km: json["km"],
|
|
||||||
name: json["name"],
|
|
||||||
platform: json["platform"],
|
|
||||||
stoppingTime:
|
|
||||||
json["stoppingTime"],
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
|
||||||
"arrival": arrival?.toJson(),
|
|
||||||
"departure": departure?.toJson(),
|
|
||||||
"km": km,
|
|
||||||
"name": name,
|
|
||||||
"platform": platform,
|
|
||||||
"stoppingTime": stoppingTime,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class StationArrDepTime {
|
@freezed
|
||||||
StationArrDepTime({
|
class StationArrDepTime with _$StationArrDepTime {
|
||||||
required this.scheduleTime,
|
const factory StationArrDepTime({
|
||||||
this.status,
|
required DateTime scheduleTime,
|
||||||
});
|
StationArrDepTimeStatus? status,
|
||||||
|
}) = _StationArrDepTime;
|
||||||
|
|
||||||
final DateTime scheduleTime;
|
factory StationArrDepTime.fromJson(Map<String, dynamic> json) => _$StationArrDepTimeFromJson(json);
|
||||||
final StationArrDepTimeStatus? status;
|
|
||||||
|
|
||||||
factory StationArrDepTime.fromJson(Map<String, dynamic> json) =>
|
|
||||||
StationArrDepTime(
|
|
||||||
scheduleTime: DateTime.parse(json["scheduleTime"] as String),
|
|
||||||
status: json["status"] == null ? null : StationArrDepTimeStatus.fromJson(json["status"]),
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
|
||||||
"scheduleTime": scheduleTime.toIso8601String(),
|
|
||||||
"status": status?.toJson(),
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class StationArrDepTimeStatus {
|
@freezed
|
||||||
StationArrDepTimeStatus({
|
class StationArrDepTimeStatus with _$StationArrDepTimeStatus {
|
||||||
required this.delay,
|
const factory StationArrDepTimeStatus({
|
||||||
required this.real,
|
required int delay,
|
||||||
});
|
required bool real,
|
||||||
|
required bool cancelled,
|
||||||
|
}) = _StationArrDepTimeStatus;
|
||||||
|
|
||||||
final int delay;
|
factory StationArrDepTimeStatus.fromJson(Map<String, dynamic> json) => _$StationArrDepTimeStatusFromJson(json);
|
||||||
final bool real;
|
|
||||||
|
|
||||||
factory StationArrDepTimeStatus.fromJson(Map<String, dynamic> json) =>
|
|
||||||
StationArrDepTimeStatus(
|
|
||||||
delay: json["delay"],
|
|
||||||
real: json["real"],
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
|
||||||
"delay": delay,
|
|
||||||
"real": real,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class TrainDataStatus {
|
@freezed
|
||||||
TrainDataStatus({
|
class TrainDataStatus with _$TrainDataStatus {
|
||||||
required this.delay,
|
const TrainDataStatus._();
|
||||||
required this.state,
|
|
||||||
required this.station,
|
|
||||||
});
|
|
||||||
|
|
||||||
final int delay;
|
const factory TrainDataStatus({
|
||||||
final State state;
|
required int delay,
|
||||||
final String station;
|
required String station,
|
||||||
|
required TrainDataStatusState state,
|
||||||
|
}) = _TrainDataStatus;
|
||||||
|
|
||||||
factory TrainDataStatus.fromJson(Map<String, dynamic> json) =>
|
factory TrainDataStatus.fromJson(Map<String, dynamic> json) => _$TrainDataStatusFromJson(json);
|
||||||
TrainDataStatus(
|
|
||||||
delay: json["delay"],
|
|
||||||
state: stateValues.map[json["state"]]!,
|
|
||||||
station: json["station"],
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
|
||||||
"delay": delay,
|
|
||||||
"state": stateValues.reverse[state],
|
|
||||||
"station": station,
|
|
||||||
};
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
|
@ -190,38 +115,118 @@ class TrainDataStatus {
|
||||||
result += '${delay.abs()} min';
|
result += '${delay.abs()} min';
|
||||||
}
|
}
|
||||||
result += ' la ';
|
result += ' la ';
|
||||||
switch (state) {
|
result += switch (state) {
|
||||||
case State.PASSING:
|
TrainDataStatusState.passing => 'trecerea fără oprire prin',
|
||||||
result += 'trecerea fără oprire prin';
|
TrainDataStatusState.arrival => 'sosirea în',
|
||||||
break;
|
TrainDataStatusState.departure => 'plecarea din',
|
||||||
case State.ARRIVAL:
|
};
|
||||||
result += 'sosirea în';
|
|
||||||
break;
|
|
||||||
case State.DEPARTURE:
|
|
||||||
result += 'plecarea din';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
result += station;
|
result += station;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum State { PASSING, ARRIVAL, DEPARTURE }
|
enum TrainDataStatusState { passing, arrival, departure }
|
||||||
|
|
||||||
final stateValues = EnumValues({
|
abstract class TrainDataNote {
|
||||||
"arrival": State.ARRIVAL,
|
final String kind;
|
||||||
"departure": State.DEPARTURE,
|
|
||||||
"passing": State.PASSING
|
|
||||||
});
|
|
||||||
|
|
||||||
class EnumValues<T> {
|
const TrainDataNote({required this.kind});
|
||||||
Map<String, T> map;
|
|
||||||
Map<T, String>? reverseMap;
|
|
||||||
|
|
||||||
EnumValues(this.map);
|
Map<String, dynamic> toJson() => {
|
||||||
|
"kind": kind,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
Map<T, String> get reverse {
|
class TrainDataNoteConverter implements JsonConverter<TrainDataNote, Map<String, dynamic>> {
|
||||||
reverseMap ??= map.map((k, v) => MapEntry(v, k));
|
const TrainDataNoteConverter();
|
||||||
return reverseMap!;
|
|
||||||
|
@override
|
||||||
|
TrainDataNote fromJson(Map<String, dynamic> json) {
|
||||||
|
return switch(json['kind']) {
|
||||||
|
'trainNumberChange' => TrainDataNoteTrainNumberChange.fromJson(json),
|
||||||
|
'departsAs' => TrainDataNoteDepartsAs.fromJson(json),
|
||||||
|
'detachingWagons' => TrainDataNoteDetachingWagons.fromJson(json),
|
||||||
|
'receivingWagons' => TrainDataNoteReceivingWagons.fromJson(json),
|
||||||
|
_ => TrainDataNoteUnknown.fromJson(json),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson(TrainDataNote object) {
|
||||||
|
return object.toJson();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class TrainDataNoteTrainNumberChange with _$TrainDataNoteTrainNumberChange implements TrainDataNote {
|
||||||
|
@Implements<TrainDataNote>()
|
||||||
|
const factory TrainDataNoteTrainNumberChange({
|
||||||
|
// base
|
||||||
|
@Default("trainNumberChange")
|
||||||
|
String kind,
|
||||||
|
// impl
|
||||||
|
required String rank,
|
||||||
|
required String number,
|
||||||
|
}) = _TrainDataNoteTrainNumberChange;
|
||||||
|
|
||||||
|
factory TrainDataNoteTrainNumberChange.fromJson(Map<String, dynamic> json) => _$TrainDataNoteTrainNumberChangeFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class TrainDataNoteDepartsAs with _$TrainDataNoteDepartsAs implements TrainDataNote {
|
||||||
|
@Implements<TrainDataNote>()
|
||||||
|
const factory TrainDataNoteDepartsAs({
|
||||||
|
// base
|
||||||
|
@Default("departsAs")
|
||||||
|
String kind,
|
||||||
|
// impl
|
||||||
|
required String rank,
|
||||||
|
required String number,
|
||||||
|
required DateTime departureDate,
|
||||||
|
}) = _TrainDataNoteDepartsAs;
|
||||||
|
|
||||||
|
factory TrainDataNoteDepartsAs.fromJson(Map<String, dynamic> json) => _$TrainDataNoteDepartsAsFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class TrainDataNoteDetachingWagons with _$TrainDataNoteDetachingWagons implements TrainDataNote {
|
||||||
|
@Implements<TrainDataNote>()
|
||||||
|
const factory TrainDataNoteDetachingWagons({
|
||||||
|
// base
|
||||||
|
@Default("detachingWagons")
|
||||||
|
String kind,
|
||||||
|
// impl
|
||||||
|
required String station,
|
||||||
|
}) = _TrainDataNoteDetachingWagons;
|
||||||
|
|
||||||
|
factory TrainDataNoteDetachingWagons.fromJson(Map<String, dynamic> json) => _$TrainDataNoteDetachingWagonsFromJson(json);
|
||||||
|
}
|
||||||
|
@freezed
|
||||||
|
class TrainDataNoteReceivingWagons with _$TrainDataNoteReceivingWagons implements TrainDataNote {
|
||||||
|
@Implements<TrainDataNote>()
|
||||||
|
const factory TrainDataNoteReceivingWagons({
|
||||||
|
// base
|
||||||
|
@Default("receivingWagons")
|
||||||
|
String kind,
|
||||||
|
// impl
|
||||||
|
required String station,
|
||||||
|
}) = _TrainDataNoteReceivingWagons;
|
||||||
|
|
||||||
|
factory TrainDataNoteReceivingWagons.fromJson(Map<String, dynamic> json) => _$TrainDataNoteReceivingWagonsFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class TrainDataNoteUnknown with _$TrainDataNoteUnknown implements TrainDataNote {
|
||||||
|
@Implements<TrainDataNote>()
|
||||||
|
const factory TrainDataNoteUnknown({
|
||||||
|
// base
|
||||||
|
required String kind,
|
||||||
|
// impl
|
||||||
|
required Map<String, dynamic> extra,
|
||||||
|
}) = _TrainDataNoteUnknown;
|
||||||
|
|
||||||
|
factory TrainDataNoteUnknown.fromJson(Map<String, dynamic> json) => TrainDataNoteUnknown(
|
||||||
|
kind: json['kind'],
|
||||||
|
extra: Map.from(json)..remove('kind'),
|
||||||
|
);
|
||||||
|
}
|
2365
lib/models/train_data.freezed.dart
Normal file
2365
lib/models/train_data.freezed.dart
Normal file
File diff suppressed because it is too large
Load diff
217
lib/models/train_data.g.dart
Normal file
217
lib/models/train_data.g.dart
Normal file
|
@ -0,0 +1,217 @@
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'train_data.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
_$_TrainData _$$_TrainDataFromJson(Map<String, dynamic> json) => _$_TrainData(
|
||||||
|
rank: json['rank'] as String,
|
||||||
|
number: json['number'] as String,
|
||||||
|
date: json['date'] as String,
|
||||||
|
operator: json['operator'] as String,
|
||||||
|
groups: (json['groups'] as List<dynamic>)
|
||||||
|
.map((e) => TrainDataGroup.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataToJson(_$_TrainData instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'rank': instance.rank,
|
||||||
|
'number': instance.number,
|
||||||
|
'date': instance.date,
|
||||||
|
'operator': instance.operator,
|
||||||
|
'groups': instance.groups,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataGroup _$$_TrainDataGroupFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataGroup(
|
||||||
|
route: TrainDataRoute.fromJson(json['route'] as Map<String, dynamic>),
|
||||||
|
stations: (json['stations'] as List<dynamic>)
|
||||||
|
.map((e) => TrainDataStation.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList(),
|
||||||
|
status: json['status'] == null
|
||||||
|
? null
|
||||||
|
: TrainDataStatus.fromJson(json['status'] as Map<String, dynamic>),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataGroupToJson(_$_TrainDataGroup instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'route': instance.route,
|
||||||
|
'stations': instance.stations,
|
||||||
|
'status': instance.status,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataRoute _$$_TrainDataRouteFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataRoute(
|
||||||
|
from: json['from'] as String,
|
||||||
|
to: json['to'] as String,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataRouteToJson(_$_TrainDataRoute instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'from': instance.from,
|
||||||
|
'to': instance.to,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataStation _$$_TrainDataStationFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataStation(
|
||||||
|
name: json['name'] as String,
|
||||||
|
linkName: json['linkName'] as String,
|
||||||
|
km: json['km'] as int,
|
||||||
|
stoppingTime: json['stoppingTime'] as int?,
|
||||||
|
platform: json['platform'] as String?,
|
||||||
|
arrival: json['arrival'] == null
|
||||||
|
? null
|
||||||
|
: StationArrDepTime.fromJson(json['arrival'] as Map<String, dynamic>),
|
||||||
|
departure: json['departure'] == null
|
||||||
|
? null
|
||||||
|
: StationArrDepTime.fromJson(
|
||||||
|
json['departure'] as Map<String, dynamic>),
|
||||||
|
notes: (json['notes'] as List<dynamic>)
|
||||||
|
.map((e) => const TrainDataNoteConverter()
|
||||||
|
.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataStationToJson(_$_TrainDataStation instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'name': instance.name,
|
||||||
|
'linkName': instance.linkName,
|
||||||
|
'km': instance.km,
|
||||||
|
'stoppingTime': instance.stoppingTime,
|
||||||
|
'platform': instance.platform,
|
||||||
|
'arrival': instance.arrival,
|
||||||
|
'departure': instance.departure,
|
||||||
|
'notes':
|
||||||
|
instance.notes.map(const TrainDataNoteConverter().toJson).toList(),
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_StationArrDepTime _$$_StationArrDepTimeFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$_StationArrDepTime(
|
||||||
|
scheduleTime: DateTime.parse(json['scheduleTime'] as String),
|
||||||
|
status: json['status'] == null
|
||||||
|
? null
|
||||||
|
: StationArrDepTimeStatus.fromJson(
|
||||||
|
json['status'] as Map<String, dynamic>),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_StationArrDepTimeToJson(
|
||||||
|
_$_StationArrDepTime instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'scheduleTime': instance.scheduleTime.toIso8601String(),
|
||||||
|
'status': instance.status,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_StationArrDepTimeStatus _$$_StationArrDepTimeStatusFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
_$_StationArrDepTimeStatus(
|
||||||
|
delay: json['delay'] as int,
|
||||||
|
real: json['real'] as bool,
|
||||||
|
cancelled: json['cancelled'] as bool,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_StationArrDepTimeStatusToJson(
|
||||||
|
_$_StationArrDepTimeStatus instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'delay': instance.delay,
|
||||||
|
'real': instance.real,
|
||||||
|
'cancelled': instance.cancelled,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataStatus _$$_TrainDataStatusFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataStatus(
|
||||||
|
delay: json['delay'] as int,
|
||||||
|
station: json['station'] as String,
|
||||||
|
state: $enumDecode(_$TrainDataStatusStateEnumMap, json['state']),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataStatusToJson(_$_TrainDataStatus instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'delay': instance.delay,
|
||||||
|
'station': instance.station,
|
||||||
|
'state': _$TrainDataStatusStateEnumMap[instance.state]!,
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$TrainDataStatusStateEnumMap = {
|
||||||
|
TrainDataStatusState.passing: 'passing',
|
||||||
|
TrainDataStatusState.arrival: 'arrival',
|
||||||
|
TrainDataStatusState.departure: 'departure',
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataNoteTrainNumberChange _$$_TrainDataNoteTrainNumberChangeFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataNoteTrainNumberChange(
|
||||||
|
kind: json['kind'] as String? ?? "trainNumberChange",
|
||||||
|
rank: json['rank'] as String,
|
||||||
|
number: json['number'] as String,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataNoteTrainNumberChangeToJson(
|
||||||
|
_$_TrainDataNoteTrainNumberChange instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'kind': instance.kind,
|
||||||
|
'rank': instance.rank,
|
||||||
|
'number': instance.number,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataNoteDepartsAs _$$_TrainDataNoteDepartsAsFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataNoteDepartsAs(
|
||||||
|
kind: json['kind'] as String? ?? "departsAs",
|
||||||
|
rank: json['rank'] as String,
|
||||||
|
number: json['number'] as String,
|
||||||
|
departureDate: DateTime.parse(json['departureDate'] as String),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataNoteDepartsAsToJson(
|
||||||
|
_$_TrainDataNoteDepartsAs instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'kind': instance.kind,
|
||||||
|
'rank': instance.rank,
|
||||||
|
'number': instance.number,
|
||||||
|
'departureDate': instance.departureDate.toIso8601String(),
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataNoteDetachingWagons _$$_TrainDataNoteDetachingWagonsFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataNoteDetachingWagons(
|
||||||
|
kind: json['kind'] as String? ?? "detachingWagons",
|
||||||
|
station: json['station'] as String,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataNoteDetachingWagonsToJson(
|
||||||
|
_$_TrainDataNoteDetachingWagons instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'kind': instance.kind,
|
||||||
|
'station': instance.station,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataNoteReceivingWagons _$$_TrainDataNoteReceivingWagonsFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataNoteReceivingWagons(
|
||||||
|
kind: json['kind'] as String? ?? "receivingWagons",
|
||||||
|
station: json['station'] as String,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataNoteReceivingWagonsToJson(
|
||||||
|
_$_TrainDataNoteReceivingWagons instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'kind': instance.kind,
|
||||||
|
'station': instance.station,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$_TrainDataNoteUnknown _$$_TrainDataNoteUnknownFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
_$_TrainDataNoteUnknown(
|
||||||
|
kind: json['kind'] as String,
|
||||||
|
extra: json['extra'] as Map<String, dynamic>,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$_TrainDataNoteUnknownToJson(
|
||||||
|
_$_TrainDataNoteUnknown instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'kind': instance.kind,
|
||||||
|
'extra': instance.extra,
|
||||||
|
};
|
|
@ -1,7 +1,7 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
// ignore_for_file: type=lint
|
// ignore_for_file: type=lint
|
||||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
part of 'trains_result.dart';
|
part of 'trains_result.dart';
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,9 @@ class ViewStationPage extends HookConsumerWidget {
|
||||||
|
|
||||||
class ViewStationArguments {
|
class ViewStationArguments {
|
||||||
final String stationName;
|
final String stationName;
|
||||||
|
final DateTime? date;
|
||||||
|
|
||||||
const ViewStationArguments({required this.stationName});
|
const ViewStationArguments({required this.stationName, this.date});
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class ViewStationPageShared extends StatelessWidget {
|
abstract class ViewStationPageShared extends StatelessWidget {
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:info_tren/api/train_data.dart';
|
import 'package:info_tren/api/train_data.dart';
|
||||||
import 'package:info_tren/components/loading/loading.dart';
|
import 'package:info_tren/components/loading/loading.dart';
|
||||||
|
@ -9,59 +12,93 @@ import 'package:info_tren/pages/train_info_page/view_train/train_info_fluent.dar
|
||||||
import 'package:info_tren/pages/train_info_page/view_train/train_info_material.dart';
|
import 'package:info_tren/pages/train_info_page/view_train/train_info_material.dart';
|
||||||
import 'package:info_tren/providers.dart';
|
import 'package:info_tren/providers.dart';
|
||||||
|
|
||||||
|
class TrainInfo extends HookConsumerWidget {
|
||||||
class TrainInfo extends ConsumerWidget {
|
|
||||||
static String routeName = "/trainInfo/display";
|
static String routeName = "/trainInfo/display";
|
||||||
|
|
||||||
const TrainInfo({super.key,});
|
const TrainInfo({
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final uiDesign = ref.watch(uiDesignProvider);
|
final uiDesign = ref.watch(uiDesignProvider);
|
||||||
final args = ref.watch(trainInfoArgumentsProvider);
|
final args = ref.watch(trainInfoArgumentsProvider);
|
||||||
final trainNumber = args.trainNumber;
|
final trainNumber = args.trainNumber;
|
||||||
final date = args.date;
|
final viewYesterday = useState(false);
|
||||||
|
final date = args.date ??
|
||||||
|
DateTime.now().copyWith(
|
||||||
|
hour: 12,
|
||||||
|
minute: 0,
|
||||||
|
second: 0,
|
||||||
|
millisecond: 0,
|
||||||
|
microsecond: 0,
|
||||||
|
);
|
||||||
|
final requestDate =
|
||||||
|
viewYesterday.value ? date.subtract(const Duration(days: 1)) : date;
|
||||||
|
final trainDataAsync = ref
|
||||||
|
.watch(trainInfoProvider(trainNumber: trainNumber, date: requestDate));
|
||||||
|
|
||||||
|
Future refresh() async {
|
||||||
|
ref.invalidate(
|
||||||
|
trainInfoProvider(trainNumber: trainNumber, date: requestDate),
|
||||||
|
);
|
||||||
|
await Future.delayed(const Duration(seconds: 1));
|
||||||
|
}
|
||||||
|
|
||||||
return RefreshFutureBuilder<TrainData>(
|
|
||||||
futureCreator: () => getTrain(trainNumber, date: date),
|
|
||||||
builder: (context, refresh, replaceFutureBuilder, snapshot) {
|
|
||||||
void onViewYesterdayTrain() {
|
void onViewYesterdayTrain() {
|
||||||
replaceFutureBuilder(() => getTrain(trainNumber, date: DateTime.now().subtract(const Duration(days: 1))));
|
viewYesterday.value = !viewYesterday.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([RefreshFutureBuilderState.none, RefreshFutureBuilderState.waiting].contains(snapshot.state)) {
|
useEffect(() {
|
||||||
return TrainInfoLoading(title: trainNumber.toString(), loadingText: "Se încarcă...",);
|
final handle = Timer.periodic(const Duration(minutes: 1), (timer) {
|
||||||
}
|
refresh();
|
||||||
else if (snapshot.state == RefreshFutureBuilderState.error) {
|
});
|
||||||
return TrainInfoError(title: '$trainNumber - Error', error: snapshot.error!, refresh: refresh,);
|
return () {
|
||||||
}
|
handle.cancel();
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return trainDataAsync.when(
|
||||||
|
data: (data) {
|
||||||
switch (uiDesign) {
|
switch (uiDesign) {
|
||||||
case UiDesign.MATERIAL:
|
case UiDesign.MATERIAL:
|
||||||
return TrainInfoMaterial(
|
return TrainInfoMaterial(
|
||||||
trainData: snapshot.data!,
|
trainData: data,
|
||||||
refresh: refresh,
|
refresh: refresh,
|
||||||
isRefreshing: snapshot.state == RefreshFutureBuilderState.refreshing,
|
isRefreshing: trainDataAsync.isRefreshing,
|
||||||
onViewYesterdayTrain: onViewYesterdayTrain,
|
onViewYesterdayTrain: onViewYesterdayTrain,
|
||||||
);
|
);
|
||||||
case UiDesign.CUPERTINO:
|
case UiDesign.CUPERTINO:
|
||||||
return TrainInfoCupertino(
|
return TrainInfoCupertino(
|
||||||
trainData: snapshot.data!,
|
trainData: data,
|
||||||
refresh: refresh,
|
refresh: refresh,
|
||||||
isRefreshing: snapshot.state == RefreshFutureBuilderState.refreshing,
|
isRefreshing: trainDataAsync.isRefreshing,
|
||||||
onViewYesterdayTrain: onViewYesterdayTrain,
|
onViewYesterdayTrain: onViewYesterdayTrain,
|
||||||
);
|
);
|
||||||
case UiDesign.FLUENT:
|
case UiDesign.FLUENT:
|
||||||
return TrainInfoFluent(
|
return TrainInfoFluent(
|
||||||
trainData: snapshot.data!,
|
trainData: data,
|
||||||
refresh: refresh,
|
refresh: refresh,
|
||||||
isRefreshing: snapshot.state == RefreshFutureBuilderState.refreshing,
|
isRefreshing: trainDataAsync.isRefreshing,
|
||||||
onViewYesterdayTrain: onViewYesterdayTrain,
|
onViewYesterdayTrain: onViewYesterdayTrain,
|
||||||
);
|
);
|
||||||
default:
|
default:
|
||||||
throw UnmatchedUiDesignException(uiDesign);
|
throw UnmatchedUiDesignException(uiDesign);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
error: (e, st) {
|
||||||
|
return TrainInfoError(
|
||||||
|
title: '$trainNumber - Error',
|
||||||
|
error: e,
|
||||||
|
refresh: refresh,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
loading: () {
|
||||||
|
return TrainInfoLoading(
|
||||||
|
title: trainNumber.toString(),
|
||||||
|
loadingText: "Se încarcă...",
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -132,7 +169,9 @@ abstract class TrainInfoLoadingShared extends StatelessWidget {
|
||||||
required this.title,
|
required this.title,
|
||||||
String? loadingText,
|
String? loadingText,
|
||||||
super.key,
|
super.key,
|
||||||
}) : loadingWidget = Loading(text: loadingText,);
|
}) : loadingWidget = Loading(
|
||||||
|
text: loadingText,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
class TrainInfoError extends ConsumerWidget {
|
class TrainInfoError extends ConsumerWidget {
|
||||||
|
@ -181,7 +220,12 @@ abstract class TrainInfoErrorShared extends StatelessWidget {
|
||||||
final Object error;
|
final Object error;
|
||||||
final Future Function()? refresh;
|
final Future Function()? refresh;
|
||||||
|
|
||||||
const TrainInfoErrorShared({required this.title, required this.error, this.refresh, super.key,});
|
const TrainInfoErrorShared({
|
||||||
|
required this.title,
|
||||||
|
required this.error,
|
||||||
|
this.refresh,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
class TrainInfoBody extends ConsumerWidget {
|
class TrainInfoBody extends ConsumerWidget {
|
||||||
|
@ -246,10 +290,15 @@ abstract class TrainInfoBodyShared extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class DisplayTrainYesterdayWarningCommon extends StatelessWidget {
|
abstract class DisplayTrainYesterdayWarningCommon extends StatelessWidget {
|
||||||
static const trainDidNotDepart = 'Acest tren nu a plecat încă din prima gară.';
|
static const trainDidNotDepart =
|
||||||
static const seeYesterdayTrain = 'Apasă aici pentru a vedea trenul care a plecat ieri.';
|
'Acest tren nu a plecat încă din prima gară.';
|
||||||
|
static const seeYesterdayTrain =
|
||||||
|
'Apasă aici pentru a vedea trenul care a plecat ieri.';
|
||||||
|
|
||||||
final void Function() onViewYesterdayTrain;
|
final void Function() onViewYesterdayTrain;
|
||||||
|
|
||||||
const DisplayTrainYesterdayWarningCommon(this.onViewYesterdayTrain, {super.key,});
|
const DisplayTrainYesterdayWarningCommon(
|
||||||
|
this.onViewYesterdayTrain, {
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1051,8 +1051,8 @@ class DisplayTrainYesterdayWarningCupertino extends DisplayTrainYesterdayWarning
|
||||||
const TextSpan(text: '\n'),
|
const TextSpan(text: '\n'),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: DisplayTrainYesterdayWarningCommon.seeYesterdayTrain,
|
text: DisplayTrainYesterdayWarningCommon.seeYesterdayTrain,
|
||||||
style: const TextStyle(
|
style: TextStyle(
|
||||||
color: CupertinoColors.link,
|
color: CupertinoTheme.of(context).primaryColor,
|
||||||
),
|
),
|
||||||
recognizer: TapGestureRecognizer()
|
recognizer: TapGestureRecognizer()
|
||||||
..onTap = onViewYesterdayTrain,
|
..onTap = onViewYesterdayTrain,
|
||||||
|
|
|
@ -1,13 +1,18 @@
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:info_tren/components/badge/badge.dart';
|
import 'package:info_tren/components/badge/badge.dart';
|
||||||
|
import 'package:info_tren/components/cupertino_divider.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/providers.dart';
|
import 'package:info_tren/providers.dart';
|
||||||
|
|
||||||
class DisplayTrainStation extends StatelessWidget {
|
class DisplayTrainStation extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const DisplayTrainStation({required this.station, super.key,});
|
const DisplayTrainStation({
|
||||||
|
required this.station,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -15,6 +20,26 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
if (station.notes.whereType<TrainDataNoteDepartsAs>().isNotEmpty) ...[
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note =
|
||||||
|
station.notes.whereType<TrainDataNoteDepartsAs>().first;
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(2.0),
|
||||||
|
child: Text.rich(
|
||||||
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
const TextSpan(text: 'Trenul pleacă cu numărul '),
|
||||||
|
trainIdSpan(rank: note.rank, number: note.number),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const CupertinoDivider(),
|
||||||
|
],
|
||||||
Row(
|
Row(
|
||||||
mainAxisSize: MainAxisSize.max,
|
mainAxisSize: MainAxisSize.max,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
@ -22,8 +47,7 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: Builder(
|
child: Builder(builder: (context) {
|
||||||
builder: (context) {
|
|
||||||
final departureStatus = station.departure?.status;
|
final departureStatus = station.departure?.status;
|
||||||
final arrivalStatus = station.arrival?.status;
|
final arrivalStatus = station.arrival?.status;
|
||||||
int delay;
|
int delay;
|
||||||
|
@ -31,12 +55,10 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
if (departureStatus == null) {
|
if (departureStatus == null) {
|
||||||
delay = arrivalStatus?.delay ?? 0;
|
delay = arrivalStatus?.delay ?? 0;
|
||||||
real = arrivalStatus?.real ?? false;
|
real = arrivalStatus?.real ?? false;
|
||||||
}
|
} else if (arrivalStatus == null) {
|
||||||
else if (arrivalStatus == null) {
|
|
||||||
delay = departureStatus.delay;
|
delay = departureStatus.delay;
|
||||||
real = departureStatus.real;
|
real = departureStatus.real;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
delay = departureStatus.delay;
|
delay = departureStatus.delay;
|
||||||
real = departureStatus.real;
|
real = departureStatus.real;
|
||||||
if (!real && arrivalStatus.real) {
|
if (!real && arrivalStatus.real) {
|
||||||
|
@ -56,8 +78,7 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
isDelayed: isDelayed,
|
isDelayed: isDelayed,
|
||||||
isOnTime: isOnTime,
|
isOnTime: isOnTime,
|
||||||
);
|
);
|
||||||
}
|
}),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Title(
|
Title(
|
||||||
|
@ -67,7 +88,9 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.centerRight,
|
alignment: Alignment.centerRight,
|
||||||
child: station.platform == null ? Container() : Badge(text: station.platform!, caption: 'linia'),
|
child: station.platform == null
|
||||||
|
? Container()
|
||||||
|
: Badge(text: station.platform!, caption: 'linia'),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -75,16 +98,61 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
Time(
|
Time(
|
||||||
station: station,
|
station: station,
|
||||||
),
|
),
|
||||||
|
if (station.notes.whereType<TrainDataNoteDetachingWagons>().isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note =
|
||||||
|
station.notes.whereType<TrainDataNoteDetachingWagons>().first;
|
||||||
|
return Text(
|
||||||
|
'Trenul detașează vagoane către ${note.station}',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
if (station.notes.whereType<TrainDataNoteReceivingWagons>().isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note =
|
||||||
|
station.notes.whereType<TrainDataNoteReceivingWagons>().first;
|
||||||
|
return Text(
|
||||||
|
'Trenul primește vagoane de la ${note.station}',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
Delay(
|
Delay(
|
||||||
station: station,
|
station: station,
|
||||||
),
|
),
|
||||||
|
if (station.notes
|
||||||
|
.whereType<TrainDataNoteTrainNumberChange>()
|
||||||
|
.isNotEmpty) ...[
|
||||||
|
const CupertinoDivider(),
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note = station.notes
|
||||||
|
.whereType<TrainDataNoteTrainNumberChange>()
|
||||||
|
.first;
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(2.0),
|
||||||
|
child: Text.rich(
|
||||||
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
const TextSpan(text: 'Trenul își schimbă numărul în '),
|
||||||
|
trainIdSpan(rank: note.rank, number: note.number),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Title extends StatelessWidget {
|
class Title extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Title({
|
const Title({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -97,7 +165,9 @@ class Title extends StatelessWidget {
|
||||||
station.name,
|
station.name,
|
||||||
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
|
||||||
fontSize: 22,
|
fontSize: 22,
|
||||||
fontWeight: MediaQuery.of(context).boldText ? FontWeight.w500 : FontWeight.w300,
|
fontWeight: MediaQuery.of(context).boldText
|
||||||
|
? FontWeight.w500
|
||||||
|
: FontWeight.w300,
|
||||||
// fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal,
|
// fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal,
|
||||||
),
|
),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
@ -106,7 +176,7 @@ class Title extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Time extends StatelessWidget {
|
class Time extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Time({
|
const Time({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -140,13 +210,27 @@ class Time extends StatelessWidget {
|
||||||
fontSize: 22,
|
fontSize: 22,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(width: 2,),
|
Container(
|
||||||
ArrivalTime(station: station,),
|
width: 2,
|
||||||
Expanded(child: Container(),),
|
),
|
||||||
StopTime(station: station,),
|
ArrivalTime(
|
||||||
Expanded(child: Container(),),
|
station: station,
|
||||||
DepartureTime(station: station,),
|
),
|
||||||
Container(width: 2,),
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
|
StopTime(
|
||||||
|
station: station,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
|
DepartureTime(
|
||||||
|
station: station,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
Text(
|
Text(
|
||||||
"→",
|
"→",
|
||||||
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
|
||||||
|
@ -159,7 +243,7 @@ class Time extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ArrivalTime extends ConsumerWidget {
|
class ArrivalTime extends ConsumerWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
final bool finalStation;
|
final bool finalStation;
|
||||||
|
|
||||||
const ArrivalTime({
|
const ArrivalTime({
|
||||||
|
@ -182,21 +266,26 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
fontSize: 22,
|
fontSize: 22,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(width: 2,),
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
const Text("sosire la "),
|
const Text("sosire la "),
|
||||||
ArrivalTime(station: station,),
|
ArrivalTime(
|
||||||
Expanded(child: Container(),),
|
station: station,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final delay = station.arrival!.status?.delay ?? 0;
|
final delay = station.arrival!.status?.delay ?? 0;
|
||||||
final time = tz.convertDateTime(station.arrival!.scheduleTime);
|
final time = tz.convertDateTime(station.arrival!.scheduleTime);
|
||||||
|
|
||||||
if (delay == 0) {
|
if (delay == 0) {
|
||||||
return Text("${time.hour.toString().padLeft(2, "0")}:${time.minute.toString().padLeft(2, "0")}");
|
return Text(
|
||||||
}
|
"${time.hour.toString().padLeft(2, "0")}:${time.minute.toString().padLeft(2, "0")}");
|
||||||
else if (delay > 0) {
|
} else if (delay > 0) {
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -217,8 +306,7 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -245,7 +333,7 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class StopTime extends StatelessWidget {
|
class StopTime extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const StopTime({
|
const StopTime({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -275,14 +363,12 @@ class StopTime extends StatelessWidget {
|
||||||
minutes ? '1 minut' : '1 secundă',
|
minutes ? '1 minut' : '1 secundă',
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
);
|
);
|
||||||
}
|
} else if (stopsForInt < 20) {
|
||||||
else if (stopsForInt < 20) {
|
|
||||||
return Text(
|
return Text(
|
||||||
'$stopsForInt ${minutes ? 'minute' : 'seconde'}',
|
'$stopsForInt ${minutes ? 'minute' : 'seconde'}',
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return Text(
|
return Text(
|
||||||
'$stopsForInt de ${minutes ? 'minute' : 'secunde'}',
|
'$stopsForInt de ${minutes ? 'minute' : 'secunde'}',
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
@ -296,7 +382,7 @@ class StopTime extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class DepartureTime extends ConsumerWidget {
|
class DepartureTime extends ConsumerWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
final bool firstStation;
|
final bool firstStation;
|
||||||
|
|
||||||
const DepartureTime({
|
const DepartureTime({
|
||||||
|
@ -312,10 +398,16 @@ class DepartureTime extends ConsumerWidget {
|
||||||
return Row(
|
return Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Expanded(child: Container(),),
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
const Text("plecare la "),
|
const Text("plecare la "),
|
||||||
DepartureTime(station: station,),
|
DepartureTime(
|
||||||
Container(width: 2,),
|
station: station,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
Text(
|
Text(
|
||||||
"→",
|
"→",
|
||||||
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
|
||||||
|
@ -324,15 +416,14 @@ class DepartureTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final delay = station.departure!.status?.delay ?? 0;
|
final delay = station.departure!.status?.delay ?? 0;
|
||||||
final time = tz.convertDateTime(station.departure!.scheduleTime);
|
final time = tz.convertDateTime(station.departure!.scheduleTime);
|
||||||
|
|
||||||
if (delay == 0) {
|
if (delay == 0) {
|
||||||
return Text("${time.hour.toString().padLeft(2, "0")}:${time.minute.toString().padLeft(2, "0")}");
|
return Text(
|
||||||
}
|
"${time.hour.toString().padLeft(2, "0")}:${time.minute.toString().padLeft(2, "0")}");
|
||||||
else if (delay > 0) {
|
} else if (delay > 0) {
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -353,8 +444,7 @@ class DepartureTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -381,7 +471,7 @@ class DepartureTime extends ConsumerWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Delay extends StatelessWidget {
|
class Delay extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Delay({
|
const Delay({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -409,8 +499,7 @@ class Delay extends StatelessWidget {
|
||||||
fontStyle: FontStyle.italic,
|
fontStyle: FontStyle.italic,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
} else if (delay < 0) {
|
||||||
else if (delay < 0) {
|
|
||||||
return Text(
|
return Text(
|
||||||
"${-delay} ${delay == -1 ? 'minut' : 'minute'} mai devreme",
|
"${-delay} ${delay == -1 ? 'minut' : 'minute'} mai devreme",
|
||||||
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
|
||||||
|
|
|
@ -748,7 +748,7 @@ class DisplayTrainYesterdayWarningFluent
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: DisplayTrainYesterdayWarningCommon.seeYesterdayTrain,
|
text: DisplayTrainYesterdayWarningCommon.seeYesterdayTrain,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.blue,
|
color: FluentTheme.of(context).accentColor,// Colors.blue,
|
||||||
),
|
),
|
||||||
recognizer: TapGestureRecognizer()
|
recognizer: TapGestureRecognizer()
|
||||||
..onTap = onViewYesterdayTrain,
|
..onTap = onViewYesterdayTrain,
|
||||||
|
|
|
@ -1,18 +1,44 @@
|
||||||
import 'package:fluent_ui/fluent_ui.dart';
|
import 'package:fluent_ui/fluent_ui.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:info_tren/components/badge/badge.dart';
|
import 'package:info_tren/components/badge/badge.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/providers.dart';
|
import 'package:info_tren/providers.dart';
|
||||||
|
|
||||||
class DisplayTrainStation extends StatelessWidget {
|
class DisplayTrainStation extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
final void Function()? onTap;
|
final void Function()? onTap;
|
||||||
|
|
||||||
const DisplayTrainStation({required this.station, this.onTap, super.key,});
|
const DisplayTrainStation({
|
||||||
|
required this.station,
|
||||||
|
this.onTap,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
if (station.notes.whereType<TrainDataNoteDepartsAs>().isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note =
|
||||||
|
station.notes.whereType<TrainDataNoteDepartsAs>().first;
|
||||||
return Padding(
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(2.0),
|
||||||
|
child: Text.rich(
|
||||||
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
const TextSpan(text: 'Trenul pleacă cu numărul '),
|
||||||
|
trainIdSpan(rank: note.rank, number: note.number),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
padding: const EdgeInsets.all(2),
|
padding: const EdgeInsets.all(2),
|
||||||
child: HoverButton(
|
child: HoverButton(
|
||||||
onPressed: onTap,
|
onPressed: onTap,
|
||||||
|
@ -30,8 +56,7 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: Builder(
|
child: Builder(builder: (context) {
|
||||||
builder: (context) {
|
|
||||||
final departureStatus = station.departure?.status;
|
final departureStatus = station.departure?.status;
|
||||||
final arrivalStatus = station.arrival?.status;
|
final arrivalStatus = station.arrival?.status;
|
||||||
int delay;
|
int delay;
|
||||||
|
@ -39,12 +64,10 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
if (departureStatus == null) {
|
if (departureStatus == null) {
|
||||||
delay = arrivalStatus?.delay ?? 0;
|
delay = arrivalStatus?.delay ?? 0;
|
||||||
real = arrivalStatus?.real ?? false;
|
real = arrivalStatus?.real ?? false;
|
||||||
}
|
} else if (arrivalStatus == null) {
|
||||||
else if (arrivalStatus == null) {
|
|
||||||
delay = departureStatus.delay;
|
delay = departureStatus.delay;
|
||||||
real = departureStatus.real;
|
real = departureStatus.real;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
delay = departureStatus.delay;
|
delay = departureStatus.delay;
|
||||||
real = departureStatus.real;
|
real = departureStatus.real;
|
||||||
if (!real && arrivalStatus.real) {
|
if (!real && arrivalStatus.real) {
|
||||||
|
@ -64,8 +87,7 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
isDelayed: isDelayed,
|
isDelayed: isDelayed,
|
||||||
isOnTime: isOnTime,
|
isOnTime: isOnTime,
|
||||||
);
|
);
|
||||||
}
|
}),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Title(
|
Title(
|
||||||
|
@ -77,7 +99,10 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
? Container()
|
? Container()
|
||||||
: Align(
|
: Align(
|
||||||
alignment: Alignment.centerRight,
|
alignment: Alignment.centerRight,
|
||||||
child: Badge(text: station.platform!, caption: 'linia',),
|
child: Badge(
|
||||||
|
text: station.platform!,
|
||||||
|
caption: 'linia',
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -85,6 +110,34 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
Time(
|
Time(
|
||||||
station: station,
|
station: station,
|
||||||
),
|
),
|
||||||
|
if (station.notes
|
||||||
|
.whereType<TrainDataNoteDetachingWagons>()
|
||||||
|
.isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note = station.notes
|
||||||
|
.whereType<TrainDataNoteDetachingWagons>()
|
||||||
|
.first;
|
||||||
|
return Text(
|
||||||
|
'Trenul detașează vagoane către ${note.station}',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
if (station.notes
|
||||||
|
.whereType<TrainDataNoteReceivingWagons>()
|
||||||
|
.isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note = station.notes
|
||||||
|
.whereType<TrainDataNoteReceivingWagons>()
|
||||||
|
.first;
|
||||||
|
return Text(
|
||||||
|
'Trenul primește vagoane de la ${note.station}',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
Delay(
|
Delay(
|
||||||
station: station,
|
station: station,
|
||||||
),
|
),
|
||||||
|
@ -93,12 +146,35 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
if (station.notes
|
||||||
|
.whereType<TrainDataNoteTrainNumberChange>()
|
||||||
|
.isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note = station.notes
|
||||||
|
.whereType<TrainDataNoteTrainNumberChange>()
|
||||||
|
.first;
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(2.0),
|
||||||
|
child: Text.rich(
|
||||||
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
const TextSpan(text: 'Trenul își schimbă numărul în '),
|
||||||
|
trainIdSpan(rank: note.rank, number: note.number),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Title extends StatelessWidget {
|
class Title extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Title({
|
const Title({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -111,7 +187,9 @@ class Title extends StatelessWidget {
|
||||||
station.name,
|
station.name,
|
||||||
style: FluentTheme.of(context).typography.body?.copyWith(
|
style: FluentTheme.of(context).typography.body?.copyWith(
|
||||||
fontSize: 22,
|
fontSize: 22,
|
||||||
fontWeight: MediaQuery.of(context).boldText ? FontWeight.w500 : FontWeight.w300,
|
fontWeight: MediaQuery.of(context).boldText
|
||||||
|
? FontWeight.w500
|
||||||
|
: FontWeight.w300,
|
||||||
// fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal,
|
// fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal,
|
||||||
),
|
),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
@ -120,7 +198,7 @@ class Title extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Time extends StatelessWidget {
|
class Time extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Time({
|
const Time({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -154,13 +232,27 @@ class Time extends StatelessWidget {
|
||||||
fontSize: 22,
|
fontSize: 22,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(width: 2,),
|
Container(
|
||||||
ArrivalTime(station: station,),
|
width: 2,
|
||||||
Expanded(child: Container(),),
|
),
|
||||||
StopTime(station: station,),
|
ArrivalTime(
|
||||||
Expanded(child: Container(),),
|
station: station,
|
||||||
DepartureTime(station: station,),
|
),
|
||||||
Container(width: 2,),
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
|
StopTime(
|
||||||
|
station: station,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
|
DepartureTime(
|
||||||
|
station: station,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
Text(
|
Text(
|
||||||
"→",
|
"→",
|
||||||
style: FluentTheme.of(context).typography.body?.copyWith(
|
style: FluentTheme.of(context).typography.body?.copyWith(
|
||||||
|
@ -173,7 +265,7 @@ class Time extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ArrivalTime extends ConsumerWidget {
|
class ArrivalTime extends ConsumerWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
final bool finalStation;
|
final bool finalStation;
|
||||||
|
|
||||||
const ArrivalTime({
|
const ArrivalTime({
|
||||||
|
@ -198,21 +290,26 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
fontSize: 22,
|
fontSize: 22,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(width: 2,),
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
const Text("sosire la "),
|
const Text("sosire la "),
|
||||||
ArrivalTime(station: station,),
|
ArrivalTime(
|
||||||
Expanded(child: Container(),),
|
station: station,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final delay = station.arrival!.status?.delay ?? 0;
|
final delay = station.arrival!.status?.delay ?? 0;
|
||||||
final time = tz.convertDateTime(station.arrival!.scheduleTime);
|
final time = tz.convertDateTime(station.arrival!.scheduleTime);
|
||||||
|
|
||||||
if (delay == 0) {
|
if (delay == 0) {
|
||||||
return Text("${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}");
|
return Text(
|
||||||
}
|
"${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}");
|
||||||
else if (delay > 0) {
|
} else if (delay > 0) {
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -234,8 +331,7 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -263,7 +359,7 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class StopTime extends StatelessWidget {
|
class StopTime extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const StopTime({
|
const StopTime({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -292,14 +388,12 @@ class StopTime extends StatelessWidget {
|
||||||
"1 ${minutes ? 'minut' : 'secundă'}",
|
"1 ${minutes ? 'minut' : 'secundă'}",
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
);
|
);
|
||||||
}
|
} else if (stopsForInt < 20) {
|
||||||
else if (stopsForInt < 20) {
|
|
||||||
return Text(
|
return Text(
|
||||||
"$stopsForInt ${minutes ? 'minute' : 'secunde'}",
|
"$stopsForInt ${minutes ? 'minute' : 'secunde'}",
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return Text(
|
return Text(
|
||||||
"$stopsForInt de ${minutes ? 'minute' : 'secunde'}",
|
"$stopsForInt de ${minutes ? 'minute' : 'secunde'}",
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
@ -313,7 +407,7 @@ class StopTime extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class DepartureTime extends ConsumerWidget {
|
class DepartureTime extends ConsumerWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
final bool firstStation;
|
final bool firstStation;
|
||||||
|
|
||||||
const DepartureTime({
|
const DepartureTime({
|
||||||
|
@ -332,10 +426,16 @@ class DepartureTime extends ConsumerWidget {
|
||||||
return Row(
|
return Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Expanded(child: Container(),),
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
const Text("plecare la "),
|
const Text("plecare la "),
|
||||||
DepartureTime(station: station,),
|
DepartureTime(
|
||||||
Container(width: 2,),
|
station: station,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
Text(
|
Text(
|
||||||
"→",
|
"→",
|
||||||
style: FluentTheme.of(context).typography.body?.copyWith(
|
style: FluentTheme.of(context).typography.body?.copyWith(
|
||||||
|
@ -344,15 +444,14 @@ class DepartureTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final delay = station.departure!.status?.delay ?? 0;
|
final delay = station.departure!.status?.delay ?? 0;
|
||||||
final time = tz.convertDateTime(station.departure!.scheduleTime);
|
final time = tz.convertDateTime(station.departure!.scheduleTime);
|
||||||
|
|
||||||
if (delay == 0) {
|
if (delay == 0) {
|
||||||
return Text("${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}");
|
return Text(
|
||||||
}
|
"${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}");
|
||||||
else if (delay > 0) {
|
} else if (delay > 0) {
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -374,8 +473,7 @@ class DepartureTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -402,9 +500,8 @@ class DepartureTime extends ConsumerWidget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Delay extends StatelessWidget {
|
class Delay extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Delay({
|
const Delay({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -433,8 +530,7 @@ class Delay extends StatelessWidget {
|
||||||
fontStyle: FontStyle.italic,
|
fontStyle: FontStyle.italic,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
} else if (delay < 0) {
|
||||||
else if (delay < 0) {
|
|
||||||
return Text(
|
return Text(
|
||||||
"${-delay} ${delay == -1 ? 'minut' : 'minute'} mai devreme",
|
"${-delay} ${delay == -1 ? 'minut' : 'minute'} mai devreme",
|
||||||
style: FluentTheme.of(context).typography.body?.copyWith(
|
style: FluentTheme.of(context).typography.body?.copyWith(
|
||||||
|
|
|
@ -9,7 +9,11 @@ import 'package:info_tren/pages/train_info_page/view_train/train_info_material_D
|
||||||
import 'package:info_tren/utils/state_to_string.dart';
|
import 'package:info_tren/utils/state_to_string.dart';
|
||||||
|
|
||||||
class TrainInfoLoadingMaterial extends TrainInfoLoadingShared {
|
class TrainInfoLoadingMaterial extends TrainInfoLoadingShared {
|
||||||
TrainInfoLoadingMaterial({required super.title, super.loadingText, super.key,});
|
TrainInfoLoadingMaterial({
|
||||||
|
required super.title,
|
||||||
|
super.loadingText,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -81,8 +85,29 @@ class TrainInfoMaterial extends TrainInfoShared {
|
||||||
: AppBar(
|
: AppBar(
|
||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
title: Text(
|
title: Text(
|
||||||
"Informații despre ${trainData.rank} ${trainData.number}",
|
'Informații despre ${trainData.rank} ${trainData.number}',
|
||||||
),
|
),
|
||||||
|
actions: [
|
||||||
|
IconButton(
|
||||||
|
tooltip: 'Reîncarcă',
|
||||||
|
icon: (isRefreshing ?? false)
|
||||||
|
? const Center(
|
||||||
|
child: SizedBox(
|
||||||
|
height: 16,
|
||||||
|
width: 16,
|
||||||
|
child: CircularProgressIndicator(
|
||||||
|
strokeWidth: 2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: const Icon(Icons.refresh),
|
||||||
|
onPressed: (isRefreshing ?? false)
|
||||||
|
? null
|
||||||
|
: () {
|
||||||
|
refresh?.call();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
body: Column(
|
body: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
@ -172,8 +197,7 @@ class TrainInfoBodyMaterial extends TrainInfoBodyShared {
|
||||||
if (onViewYesterdayTrain != null &&
|
if (onViewYesterdayTrain != null &&
|
||||||
trainData.stations.first.departure!.scheduleTime
|
trainData.stations.first.departure!.scheduleTime
|
||||||
.compareTo(DateTime.now()) >
|
.compareTo(DateTime.now()) >
|
||||||
0)
|
0) ...[
|
||||||
...[
|
|
||||||
DisplayTrainYesterdayWarningMaterial(
|
DisplayTrainYesterdayWarningMaterial(
|
||||||
onViewYesterdayTrain!,
|
onViewYesterdayTrain!,
|
||||||
),
|
),
|
||||||
|
@ -193,10 +217,7 @@ class TrainInfoBodyMaterial extends TrainInfoBodyShared {
|
||||||
),
|
),
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: MediaQuery
|
height: MediaQuery.of(context).viewPadding.bottom,
|
||||||
.of(context)
|
|
||||||
.viewPadding
|
|
||||||
.bottom,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -204,8 +225,7 @@ class TrainInfoBodyMaterial extends TrainInfoBodyShared {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return CustomScrollView(
|
return CustomScrollView(
|
||||||
slivers: <Widget>[
|
slivers: <Widget>[
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
|
@ -284,8 +304,8 @@ class TrainInfoBodyMaterial extends TrainInfoBodyShared {
|
||||||
.compareTo(DateTime.now()) >
|
.compareTo(DateTime.now()) >
|
||||||
0) ...[
|
0) ...[
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: DisplayTrainYesterdayWarningMaterial(
|
child:
|
||||||
onViewYesterdayTrain!),
|
DisplayTrainYesterdayWarningMaterial(onViewYesterdayTrain!),
|
||||||
),
|
),
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: Divider(
|
child: Divider(
|
||||||
|
@ -299,10 +319,7 @@ class TrainInfoBodyMaterial extends TrainInfoBodyShared {
|
||||||
),
|
),
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: MediaQuery
|
height: MediaQuery.of(context).viewPadding.bottom,
|
||||||
.of(context)
|
|
||||||
.viewPadding
|
|
||||||
.bottom,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -314,7 +331,10 @@ class TrainInfoBodyMaterial extends TrainInfoBodyShared {
|
||||||
class DisplayTrainID extends StatelessWidget {
|
class DisplayTrainID extends StatelessWidget {
|
||||||
final TrainData trainData;
|
final TrainData trainData;
|
||||||
|
|
||||||
const DisplayTrainID({required this.trainData, super.key,});
|
const DisplayTrainID({
|
||||||
|
required this.trainData,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -335,7 +355,10 @@ class DisplayTrainID extends StatelessWidget {
|
||||||
class DisplayTrainOperator extends StatelessWidget {
|
class DisplayTrainOperator extends StatelessWidget {
|
||||||
final TrainData trainData;
|
final TrainData trainData;
|
||||||
|
|
||||||
const DisplayTrainOperator({required this.trainData, super.key,});
|
const DisplayTrainOperator({
|
||||||
|
required this.trainData,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -353,7 +376,10 @@ class DisplayTrainOperator extends StatelessWidget {
|
||||||
class DisplayTrainRoute extends StatelessWidget {
|
class DisplayTrainRoute extends StatelessWidget {
|
||||||
final TrainData trainData;
|
final TrainData trainData;
|
||||||
|
|
||||||
const DisplayTrainRoute({required this.trainData, super.key,});
|
const DisplayTrainRoute({
|
||||||
|
required this.trainData,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -418,7 +444,10 @@ class DisplayTrainDeparture extends StatelessWidget {
|
||||||
class DisplayTrainLastInfo extends StatelessWidget {
|
class DisplayTrainLastInfo extends StatelessWidget {
|
||||||
final TrainData trainData;
|
final TrainData trainData;
|
||||||
|
|
||||||
const DisplayTrainLastInfo({required this.trainData, super.key,});
|
const DisplayTrainLastInfo({
|
||||||
|
required this.trainData,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -610,7 +639,10 @@ class DisplayTrainLastInfo extends StatelessWidget {
|
||||||
class DisplayTrainDestination extends StatelessWidget {
|
class DisplayTrainDestination extends StatelessWidget {
|
||||||
final TrainData trainData;
|
final TrainData trainData;
|
||||||
|
|
||||||
const DisplayTrainDestination({required this.trainData, super.key,});
|
const DisplayTrainDestination({
|
||||||
|
required this.trainData,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -714,7 +746,10 @@ class DisplayTrainDestination extends StatelessWidget {
|
||||||
class DisplayTrainRouteDistance extends StatelessWidget {
|
class DisplayTrainRouteDistance extends StatelessWidget {
|
||||||
final TrainData trainData;
|
final TrainData trainData;
|
||||||
|
|
||||||
const DisplayTrainRouteDistance({required this.trainData, super.key,});
|
const DisplayTrainRouteDistance({
|
||||||
|
required this.trainData,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -751,7 +786,10 @@ class DisplayTrainRouteDistance extends StatelessWidget {
|
||||||
class DisplayTrainRouteDuration extends StatelessWidget {
|
class DisplayTrainRouteDuration extends StatelessWidget {
|
||||||
final TrainData trainData;
|
final TrainData trainData;
|
||||||
|
|
||||||
const DisplayTrainRouteDuration({required this.trainData, super.key,});
|
const DisplayTrainRouteDuration({
|
||||||
|
required this.trainData,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -834,7 +872,10 @@ class DisplayTrainRouteDuration extends StatelessWidget {
|
||||||
|
|
||||||
class DisplayTrainYesterdayWarningMaterial
|
class DisplayTrainYesterdayWarningMaterial
|
||||||
extends DisplayTrainYesterdayWarningCommon {
|
extends DisplayTrainYesterdayWarningCommon {
|
||||||
const DisplayTrainYesterdayWarningMaterial(super.onViewYesterdayTrain, {super.key,});
|
const DisplayTrainYesterdayWarningMaterial(
|
||||||
|
super.onViewYesterdayTrain, {
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -870,7 +911,10 @@ class DisplayTrainYesterdayWarningMaterial
|
||||||
|
|
||||||
class DisplayTrainStations extends StatelessWidget {
|
class DisplayTrainStations extends StatelessWidget {
|
||||||
final TrainData trainData;
|
final TrainData trainData;
|
||||||
const DisplayTrainStations({required this.trainData, super.key,});
|
const DisplayTrainStations({
|
||||||
|
required this.trainData,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -884,7 +928,8 @@ class DisplayTrainStations extends StatelessWidget {
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.of(context).pushNamed(
|
Navigator.of(context).pushNamed(
|
||||||
ViewStationPage.routeName,
|
ViewStationPage.routeName,
|
||||||
arguments: ViewStationArguments(stationName: trainData.stations[index].name),
|
arguments: ViewStationArguments(
|
||||||
|
stationName: trainData.stations[index].name),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,19 +1,45 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart' hide Badge;
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/components/badge/badge.dart';
|
import 'package:info_tren/components/badge/badge.dart';
|
||||||
import 'package:info_tren/pages/train_info_page/view_train/train_info_material.dart';
|
import 'package:info_tren/pages/train_info_page/view_train/train_info_material.dart';
|
||||||
import 'package:info_tren/providers.dart';
|
import 'package:info_tren/providers.dart';
|
||||||
|
|
||||||
class DisplayTrainStation extends StatelessWidget {
|
class DisplayTrainStation extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
final void Function()? onTap;
|
final void Function()? onTap;
|
||||||
|
|
||||||
const DisplayTrainStation({required this.station, this.onTap, super.key,});
|
const DisplayTrainStation({
|
||||||
|
required this.station,
|
||||||
|
this.onTap,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Card(
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
if (station.notes.whereType<TrainDataNoteDepartsAs>().isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note =
|
||||||
|
station.notes.whereType<TrainDataNoteDepartsAs>().first;
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(2.0),
|
||||||
|
child: Text.rich(
|
||||||
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
const TextSpan(text: 'Trenul pleacă cu numărul '),
|
||||||
|
trainIdSpan(rank: note.rank, number: note.number),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Card(
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
|
@ -29,8 +55,7 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: Builder(
|
child: Builder(builder: (context) {
|
||||||
builder: (context) {
|
|
||||||
final departureStatus = station.departure?.status;
|
final departureStatus = station.departure?.status;
|
||||||
final arrivalStatus = station.arrival?.status;
|
final arrivalStatus = station.arrival?.status;
|
||||||
int delay;
|
int delay;
|
||||||
|
@ -38,12 +63,10 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
if (departureStatus == null) {
|
if (departureStatus == null) {
|
||||||
delay = arrivalStatus?.delay ?? 0;
|
delay = arrivalStatus?.delay ?? 0;
|
||||||
real = arrivalStatus?.real ?? false;
|
real = arrivalStatus?.real ?? false;
|
||||||
}
|
} else if (arrivalStatus == null) {
|
||||||
else if (arrivalStatus == null) {
|
|
||||||
delay = departureStatus.delay;
|
delay = departureStatus.delay;
|
||||||
real = departureStatus.real;
|
real = departureStatus.real;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
delay = departureStatus.delay;
|
delay = departureStatus.delay;
|
||||||
real = departureStatus.real;
|
real = departureStatus.real;
|
||||||
if (!real && arrivalStatus.real) {
|
if (!real && arrivalStatus.real) {
|
||||||
|
@ -63,8 +86,7 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
isDelayed: isDelayed,
|
isDelayed: isDelayed,
|
||||||
isOnTime: isOnTime,
|
isOnTime: isOnTime,
|
||||||
);
|
);
|
||||||
}
|
}),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Title(
|
Title(
|
||||||
|
@ -76,7 +98,10 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
? Container()
|
? Container()
|
||||||
: Align(
|
: Align(
|
||||||
alignment: Alignment.centerRight,
|
alignment: Alignment.centerRight,
|
||||||
child: Badge(text: station.platform!, caption: 'linia',),
|
child: Badge(
|
||||||
|
text: station.platform!,
|
||||||
|
caption: 'linia',
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -84,6 +109,34 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
Time(
|
Time(
|
||||||
station: station,
|
station: station,
|
||||||
),
|
),
|
||||||
|
if (station.notes
|
||||||
|
.whereType<TrainDataNoteDetachingWagons>()
|
||||||
|
.isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note = station.notes
|
||||||
|
.whereType<TrainDataNoteDetachingWagons>()
|
||||||
|
.first;
|
||||||
|
return Text(
|
||||||
|
'Trenul detașează vagoane către ${note.station}',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
if (station.notes
|
||||||
|
.whereType<TrainDataNoteReceivingWagons>()
|
||||||
|
.isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note = station.notes
|
||||||
|
.whereType<TrainDataNoteReceivingWagons>()
|
||||||
|
.first;
|
||||||
|
return Text(
|
||||||
|
'Trenul primește vagoane de la ${note.station}',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
Delay(
|
Delay(
|
||||||
station: station,
|
station: station,
|
||||||
),
|
),
|
||||||
|
@ -91,12 +144,35 @@ class DisplayTrainStation extends StatelessWidget {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
if (station.notes
|
||||||
|
.whereType<TrainDataNoteTrainNumberChange>()
|
||||||
|
.isNotEmpty)
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final note = station.notes
|
||||||
|
.whereType<TrainDataNoteTrainNumberChange>()
|
||||||
|
.first;
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(2.0),
|
||||||
|
child: Text.rich(
|
||||||
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
const TextSpan(text: 'Trenul își schimbă numărul în '),
|
||||||
|
trainIdSpan(rank: note.rank, number: note.number),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Title extends StatelessWidget {
|
class Title extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Title({
|
const Title({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -109,7 +185,9 @@ class Title extends StatelessWidget {
|
||||||
station.name,
|
station.name,
|
||||||
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
||||||
fontSize: isSmallScreen(context) ? 18 : 22,
|
fontSize: isSmallScreen(context) ? 18 : 22,
|
||||||
fontWeight: MediaQuery.of(context).boldText ? FontWeight.w500 : FontWeight.w300,
|
fontWeight: MediaQuery.of(context).boldText
|
||||||
|
? FontWeight.w500
|
||||||
|
: FontWeight.w300,
|
||||||
// fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal,
|
// fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal,
|
||||||
),
|
),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
@ -118,7 +196,7 @@ class Title extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Time extends StatelessWidget {
|
class Time extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Time({
|
const Time({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -152,13 +230,27 @@ class Time extends StatelessWidget {
|
||||||
fontSize: isSmallScreen(context) ? 18 : 22,
|
fontSize: isSmallScreen(context) ? 18 : 22,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(width: 2,),
|
Container(
|
||||||
ArrivalTime(station: station,),
|
width: 2,
|
||||||
Expanded(child: Container(),),
|
),
|
||||||
StopTime(station: station,),
|
ArrivalTime(
|
||||||
Expanded(child: Container(),),
|
station: station,
|
||||||
DepartureTime(station: station,),
|
),
|
||||||
Container(width: 2,),
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
|
StopTime(
|
||||||
|
station: station,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
|
DepartureTime(
|
||||||
|
station: station,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
Text(
|
Text(
|
||||||
"→",
|
"→",
|
||||||
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
||||||
|
@ -171,7 +263,7 @@ class Time extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ArrivalTime extends ConsumerWidget {
|
class ArrivalTime extends ConsumerWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
final bool finalStation;
|
final bool finalStation;
|
||||||
|
|
||||||
const ArrivalTime({
|
const ArrivalTime({
|
||||||
|
@ -196,21 +288,26 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
fontSize: isSmallScreen(context) ? 18 : 22,
|
fontSize: isSmallScreen(context) ? 18 : 22,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(width: 2,),
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
const Text("sosire la "),
|
const Text("sosire la "),
|
||||||
ArrivalTime(station: station,),
|
ArrivalTime(
|
||||||
Expanded(child: Container(),),
|
station: station,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final delay = station.arrival!.status?.delay ?? 0;
|
final delay = station.arrival!.status?.delay ?? 0;
|
||||||
final time = tz.convertDateTime(station.arrival!.scheduleTime);
|
final time = tz.convertDateTime(station.arrival!.scheduleTime);
|
||||||
|
|
||||||
if (delay == 0) {
|
if (delay == 0) {
|
||||||
return Text("${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}");
|
return Text(
|
||||||
}
|
"${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}");
|
||||||
else if (delay > 0) {
|
} else if (delay > 0) {
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -231,8 +328,7 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -259,7 +355,7 @@ class ArrivalTime extends ConsumerWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class StopTime extends StatelessWidget {
|
class StopTime extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const StopTime({
|
const StopTime({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -288,14 +384,12 @@ class StopTime extends StatelessWidget {
|
||||||
"1 ${minutes ? 'minut' : 'secundă'}",
|
"1 ${minutes ? 'minut' : 'secundă'}",
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
);
|
);
|
||||||
}
|
} else if (stopsForInt < 20) {
|
||||||
else if (stopsForInt < 20) {
|
|
||||||
return Text(
|
return Text(
|
||||||
"$stopsForInt ${minutes ? 'minute' : 'secunde'}",
|
"$stopsForInt ${minutes ? 'minute' : 'secunde'}",
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return Text(
|
return Text(
|
||||||
"$stopsForInt de ${minutes ? 'minute' : 'secunde'}",
|
"$stopsForInt de ${minutes ? 'minute' : 'secunde'}",
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
@ -309,7 +403,7 @@ class StopTime extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class DepartureTime extends ConsumerWidget {
|
class DepartureTime extends ConsumerWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
final bool firstStation;
|
final bool firstStation;
|
||||||
|
|
||||||
const DepartureTime({
|
const DepartureTime({
|
||||||
|
@ -328,10 +422,16 @@ class DepartureTime extends ConsumerWidget {
|
||||||
return Row(
|
return Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Expanded(child: Container(),),
|
Expanded(
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
const Text("plecare la "),
|
const Text("plecare la "),
|
||||||
DepartureTime(station: station,),
|
DepartureTime(
|
||||||
Container(width: 2,),
|
station: station,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
Text(
|
Text(
|
||||||
"→",
|
"→",
|
||||||
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
||||||
|
@ -340,15 +440,14 @@ class DepartureTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final delay = station.departure!.status?.delay ?? 0;
|
final delay = station.departure!.status?.delay ?? 0;
|
||||||
final time = tz.convertDateTime(station.departure!.scheduleTime);
|
final time = tz.convertDateTime(station.departure!.scheduleTime);
|
||||||
|
|
||||||
if (delay == 0) {
|
if (delay == 0) {
|
||||||
return Text("${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}");
|
return Text(
|
||||||
}
|
"${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}");
|
||||||
else if (delay > 0) {
|
} else if (delay > 0) {
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -369,8 +468,7 @@ class DepartureTime extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
final oldDate = time;
|
final oldDate = time;
|
||||||
final newDate = oldDate.add(Duration(minutes: delay));
|
final newDate = oldDate.add(Duration(minutes: delay));
|
||||||
|
|
||||||
|
@ -396,9 +494,8 @@ class DepartureTime extends ConsumerWidget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Delay extends StatelessWidget {
|
class Delay extends StatelessWidget {
|
||||||
final Station station;
|
final TrainDataStation station;
|
||||||
|
|
||||||
const Delay({
|
const Delay({
|
||||||
required this.station,
|
required this.station,
|
||||||
|
@ -426,8 +523,7 @@ class Delay extends StatelessWidget {
|
||||||
fontStyle: FontStyle.italic,
|
fontStyle: FontStyle.italic,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
} else if (delay < 0) {
|
||||||
else if (delay < 0) {
|
|
||||||
return Text(
|
return Text(
|
||||||
"${-delay} ${delay == -1 ? 'minut' : 'minute'} mai devreme",
|
"${-delay} ${delay == -1 ? 'minut' : 'minute'} mai devreme",
|
||||||
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
||||||
|
|
|
@ -3,13 +3,17 @@ import 'dart:developer';
|
||||||
|
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:info_tren/api/station_data.dart';
|
import 'package:info_tren/api/station_data.dart';
|
||||||
|
import 'package:info_tren/api/train_data.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
||||||
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
|
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
|
||||||
import 'package:info_tren/utils/default_ui_design.dart';
|
import 'package:info_tren/utils/default_ui_design.dart';
|
||||||
import 'package:info_tren/utils/iterable_extensions.dart';
|
import 'package:info_tren/utils/iterable_extensions.dart';
|
||||||
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
part 'providers.g.dart';
|
||||||
|
|
||||||
final sharedPreferencesProvider = Provider<SharedPreferences>(
|
final sharedPreferencesProvider = Provider<SharedPreferences>(
|
||||||
(_) => throw UnimplementedError('Please override in ProviderScope'),
|
(_) => throw UnimplementedError('Please override in ProviderScope'),
|
||||||
);
|
);
|
||||||
|
@ -76,8 +80,8 @@ final trainInfoArgumentsProvider = Provider<TrainInfoArguments>(
|
||||||
(_) => throw UnimplementedError('Please override in ProviderScope'),
|
(_) => throw UnimplementedError('Please override in ProviderScope'),
|
||||||
);
|
);
|
||||||
|
|
||||||
final stationDataProvider = FutureProvider.family((ref, String stationName) async {
|
final stationDataProvider = FutureProvider.family((ref, ViewStationArguments args) async {
|
||||||
final data = await getStationData(stationName);
|
final data = await getStationData(args.stationName, args.date);
|
||||||
|
|
||||||
final timer = Timer(const Duration(minutes: 2), () {
|
final timer = Timer(const Duration(minutes: 2), () {
|
||||||
ref.invalidateSelf();
|
ref.invalidateSelf();
|
||||||
|
@ -93,6 +97,9 @@ final viewStationArgumentsProvider = Provider<ViewStationArguments>(
|
||||||
);
|
);
|
||||||
final viewStationDataProvider = Provider((ref) {
|
final viewStationDataProvider = Provider((ref) {
|
||||||
final args = ref.watch(viewStationArgumentsProvider);
|
final args = ref.watch(viewStationArgumentsProvider);
|
||||||
final data = ref.watch(stationDataProvider(args.stationName));
|
final data = ref.watch(stationDataProvider(args));
|
||||||
return data;
|
return data;
|
||||||
}, dependencies: [viewStationArgumentsProvider, stationDataProvider]);
|
}, dependencies: [viewStationArgumentsProvider, stationDataProvider]);
|
||||||
|
|
||||||
|
@Riverpod(keepAlive: true)
|
||||||
|
Future<TrainData> trainInfo(TrainInfoRef ref, {required String trainNumber, DateTime? date}) => getTrain(trainNumber, date: date);
|
||||||
|
|
120
lib/providers.g.dart
Normal file
120
lib/providers.g.dart
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'providers.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// RiverpodGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
String _$trainInfoHash() => r'd25aabc3ba656acf6497ec6831e11892178b22c9';
|
||||||
|
|
||||||
|
/// Copied from Dart SDK
|
||||||
|
class _SystemHash {
|
||||||
|
_SystemHash._();
|
||||||
|
|
||||||
|
static int combine(int hash, int value) {
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + value);
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||||
|
return hash ^ (hash >> 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int finish(int hash) {
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = hash ^ (hash >> 11);
|
||||||
|
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef TrainInfoRef = FutureProviderRef<TrainData>;
|
||||||
|
|
||||||
|
/// See also [trainInfo].
|
||||||
|
@ProviderFor(trainInfo)
|
||||||
|
const trainInfoProvider = TrainInfoFamily();
|
||||||
|
|
||||||
|
/// See also [trainInfo].
|
||||||
|
class TrainInfoFamily extends Family<AsyncValue<TrainData>> {
|
||||||
|
/// See also [trainInfo].
|
||||||
|
const TrainInfoFamily();
|
||||||
|
|
||||||
|
/// See also [trainInfo].
|
||||||
|
TrainInfoProvider call({
|
||||||
|
required String trainNumber,
|
||||||
|
DateTime? date,
|
||||||
|
}) {
|
||||||
|
return TrainInfoProvider(
|
||||||
|
trainNumber: trainNumber,
|
||||||
|
date: date,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
TrainInfoProvider getProviderOverride(
|
||||||
|
covariant TrainInfoProvider provider,
|
||||||
|
) {
|
||||||
|
return call(
|
||||||
|
trainNumber: provider.trainNumber,
|
||||||
|
date: provider.date,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||||
|
|
||||||
|
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||||
|
_allTransitiveDependencies;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String? get name => r'trainInfoProvider';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [trainInfo].
|
||||||
|
class TrainInfoProvider extends FutureProvider<TrainData> {
|
||||||
|
/// See also [trainInfo].
|
||||||
|
TrainInfoProvider({
|
||||||
|
required this.trainNumber,
|
||||||
|
this.date,
|
||||||
|
}) : super.internal(
|
||||||
|
(ref) => trainInfo(
|
||||||
|
ref,
|
||||||
|
trainNumber: trainNumber,
|
||||||
|
date: date,
|
||||||
|
),
|
||||||
|
from: trainInfoProvider,
|
||||||
|
name: r'trainInfoProvider',
|
||||||
|
debugGetCreateSourceHash:
|
||||||
|
const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$trainInfoHash,
|
||||||
|
dependencies: TrainInfoFamily._dependencies,
|
||||||
|
allTransitiveDependencies: TrainInfoFamily._allTransitiveDependencies,
|
||||||
|
);
|
||||||
|
|
||||||
|
final String trainNumber;
|
||||||
|
final DateTime? date;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return other is TrainInfoProvider &&
|
||||||
|
other.trainNumber == trainNumber &&
|
||||||
|
other.date == date;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, trainNumber.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, date.hashCode);
|
||||||
|
|
||||||
|
return _SystemHash.finish(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions
|
Loading…
Add table
Reference in a new issue