some issues fixed
This commit is contained in:
@@ -16,6 +16,8 @@ class OverviewFavourite {
|
||||
this.flow = TxFlowFilter.expense,
|
||||
this.barStyle = LabelChartBarStyle.parallel,
|
||||
this.invertExpensePerspective = false,
|
||||
this.updatedAt = 0,
|
||||
this.deleted = false,
|
||||
});
|
||||
|
||||
final String id;
|
||||
@@ -34,6 +36,12 @@ class OverviewFavourite {
|
||||
final LabelChartBarStyle barStyle;
|
||||
final bool invertExpensePerspective;
|
||||
|
||||
/// Epoch ms; used for last-write-wins sync across devices.
|
||||
final int updatedAt;
|
||||
|
||||
/// Soft-delete so removals propagate via sync instead of being recreated.
|
||||
final bool deleted;
|
||||
|
||||
OverviewFavourite copyWith({
|
||||
String? id,
|
||||
String? name,
|
||||
@@ -44,6 +52,9 @@ class OverviewFavourite {
|
||||
TxFlowFilter? flow,
|
||||
LabelChartBarStyle? barStyle,
|
||||
bool? invertExpensePerspective,
|
||||
int? updatedAt,
|
||||
bool? deleted,
|
||||
bool touchUpdatedAt = false,
|
||||
}) {
|
||||
return OverviewFavourite(
|
||||
id: id ?? this.id,
|
||||
@@ -56,6 +67,10 @@ class OverviewFavourite {
|
||||
barStyle: barStyle ?? this.barStyle,
|
||||
invertExpensePerspective:
|
||||
invertExpensePerspective ?? this.invertExpensePerspective,
|
||||
updatedAt: touchUpdatedAt
|
||||
? DateTime.now().millisecondsSinceEpoch
|
||||
: (updatedAt ?? this.updatedAt),
|
||||
deleted: deleted ?? this.deleted,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -69,9 +84,18 @@ class OverviewFavourite {
|
||||
'flow': flow.name,
|
||||
'barStyle': barStyle.name,
|
||||
'invertExpensePerspective': invertExpensePerspective,
|
||||
'updatedAt': updatedAt,
|
||||
'deleted': deleted,
|
||||
};
|
||||
|
||||
factory OverviewFavourite.fromJson(Map<String, dynamic> json) {
|
||||
final rawUpdated = json['updatedAt'] ?? json['updated_at'];
|
||||
final updatedAt = switch (rawUpdated) {
|
||||
int n => n,
|
||||
num n => n.round(),
|
||||
String s => int.tryParse(s) ?? 0,
|
||||
_ => 0,
|
||||
};
|
||||
return OverviewFavourite(
|
||||
id: json['id'] as String? ?? 'fav_${DateTime.now().millisecondsSinceEpoch}',
|
||||
name: (json['name'] as String?)?.trim().isNotEmpty == true
|
||||
@@ -100,6 +124,8 @@ class OverviewFavourite {
|
||||
),
|
||||
invertExpensePerspective:
|
||||
json['invertExpensePerspective'] as bool? ?? false,
|
||||
updatedAt: updatedAt,
|
||||
deleted: json['deleted'] as bool? ?? false,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -107,3 +133,25 @@ class OverviewFavourite {
|
||||
enum OverviewMetricMode { flow, labels }
|
||||
|
||||
enum OverviewPeriodMode { monthly, yearly }
|
||||
|
||||
/// Union favourites by id with last-write-wins on [OverviewFavourite.updatedAt].
|
||||
List<OverviewFavourite> mergeOverviewFavourites(
|
||||
List<OverviewFavourite> local,
|
||||
List<OverviewFavourite> remote,
|
||||
) {
|
||||
final byId = <String, OverviewFavourite>{};
|
||||
void put(OverviewFavourite fav) {
|
||||
final existing = byId[fav.id];
|
||||
if (existing == null || fav.updatedAt >= existing.updatedAt) {
|
||||
byId[fav.id] = fav;
|
||||
}
|
||||
}
|
||||
|
||||
for (final fav in remote) {
|
||||
put(fav);
|
||||
}
|
||||
for (final fav in local) {
|
||||
put(fav);
|
||||
}
|
||||
return byId.values.toList(growable: false);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user