fix leaderboard formatting, save shared users to drafts, display shared legs
All checks were successful
Release / meta (push) Successful in 8s
Release / linux-build (push) Successful in 6m59s
Release / web-build (push) Successful in 6m37s
Release / android-build (push) Successful in 18m3s
Release / release-master (push) Successful in 23s
Release / release-dev (push) Successful in 25s

This commit is contained in:
2026-01-03 14:14:31 +00:00
parent 69bd6f688a
commit ff38c3f838
4 changed files with 185 additions and 43 deletions

View File

@@ -1061,6 +1061,8 @@ class Leg {
final String origin, destination;
final List<String> route;
final String? legShareId;
final LegShareMeta? sharedFrom;
final List<LegShareMeta> sharedTo;
final DateTime beginTime;
final DateTime? endTime;
final DateTime? originTime;
@@ -1092,6 +1094,8 @@ class Leg {
this.origin = '',
this.destination = '',
this.legShareId,
this.sharedFrom,
this.sharedTo = const [],
});
factory Leg.fromJson(Map<String, dynamic> json) {
@@ -1099,6 +1103,25 @@ class Leg {
final parsedEndTime = (endTimeRaw == null || '$endTimeRaw'.isEmpty)
? null
: _asDateTime(endTimeRaw);
LegShareMeta? sharedFrom;
final sharedFromJson = json['shared_from'];
if (sharedFromJson is Map) {
sharedFrom = LegShareMeta.fromJson(
sharedFromJson.map((k, v) => MapEntry(k.toString(), v)),
);
}
List<LegShareMeta> sharedTo = const [];
final sharedToJson = json['shared_to'];
if (sharedToJson is List) {
sharedTo = sharedToJson
.whereType<Map>()
.map(
(e) => LegShareMeta.fromJson(
e.map((k, v) => MapEntry(k.toString(), v)),
),
)
.toList();
}
return Leg(
id: _asInt(json['leg_id']),
tripId: _asInt(json['leg_trip']),
@@ -1133,10 +1156,73 @@ class Leg {
origin: _asString(json['leg_origin']),
destination: _asString(json['leg_destination']),
legShareId: _asString(json['leg_share_id']),
sharedFrom: sharedFrom,
sharedTo: sharedTo,
);
}
}
class LegShareMeta {
final int? legShareId;
final int? legId;
final String sharedToUserId;
final String sharedByUserId;
final String status;
final DateTime? respondedAt;
final bool? acceptedEdits;
final DateTime? sharedAt;
final String sharedToUsername;
final String sharedToFullName;
final String sharedByUsername;
final String sharedByFullName;
LegShareMeta({
this.legShareId,
this.legId,
required this.sharedToUserId,
required this.sharedByUserId,
required this.status,
this.respondedAt,
this.acceptedEdits,
this.sharedAt,
this.sharedToUsername = '',
this.sharedToFullName = '',
this.sharedByUsername = '',
this.sharedByFullName = '',
});
factory LegShareMeta.fromJson(Map<String, dynamic> json) {
DateTime? parseDate(dynamic raw) {
if (raw == null) return null;
if (raw is DateTime) return raw;
return DateTime.tryParse(raw.toString());
}
return LegShareMeta(
legShareId: _asInt(json['leg_share_id']),
legId: _asInt(json['leg_id']),
sharedToUserId: _asString(json['shared_to_user_id']),
sharedByUserId: _asString(json['shared_by_user_id']),
status: _asString(json['status'], 'pending'),
respondedAt: parseDate(json['responded_at']),
acceptedEdits: json['accepted_edits'] == null
? null
: _asBool(json['accepted_edits'], false),
sharedAt: parseDate(json['shared_at']),
sharedToUsername: _asString(json['shared_to_username']),
sharedToFullName: _asString(json['shared_to_full_name']),
sharedByUsername: _asString(json['shared_by_username']),
sharedByFullName: _asString(json['shared_by_full_name']),
);
}
String get sharedFromDisplay =>
sharedByFullName.isNotEmpty ? sharedByFullName : sharedByUsername;
String get sharedToDisplay =>
sharedToFullName.isNotEmpty ? sharedToFullName : sharedToUsername;
}
class LegShareData {
final String id;
final Leg entry;