diff --git a/lib/data/models/expense_model.dart b/lib/data/models/expense_model.dart index 6e3713acc..fbf2eda4b 100644 --- a/lib/data/models/expense_model.dart +++ b/lib/data/models/expense_model.dart @@ -604,11 +604,26 @@ abstract class ExpenseEntity extends Object @override String get listDisplayName => number ?? ''; + @nullable + @BuiltValueField(compare: false) + int get loadedAt; + bool isBetween(String startDate, String endDate) { return (startDate ?? '').compareTo(date ?? '') <= 0 && (endDate ?? '').compareTo(date ?? '') >= 0; } + bool get isLoaded => loadedAt != null && loadedAt > 0; + + bool get isStale { + if (!isLoaded) { + return true; + } + + return DateTime.now().millisecondsSinceEpoch - loadedAt > + kMillisecondsToRefreshActivities; + } + bool get isUpcoming => convertSqlDateToDateTime(date).isAfter(DateTime.now()); bool get isRecurring => [EntityType.recurringExpense].contains(entityType); diff --git a/lib/data/models/expense_model.g.dart b/lib/data/models/expense_model.g.dart index f3d7f4d4f..ba1d8426b 100644 --- a/lib/data/models/expense_model.g.dart +++ b/lib/data/models/expense_model.g.dart @@ -302,6 +302,12 @@ class _$ExpenseEntitySerializer implements StructuredSerializer { specifiedType: const FullType( BuiltList, const [const FullType(ExpenseScheduleEntity)]))); } + value = object.loadedAt; + if (value != null) { + result + ..add('loadedAt') + ..add(serializers.serialize(value, specifiedType: const FullType(int))); + } value = object.isChanged; if (value != null) { result @@ -528,6 +534,10 @@ class _$ExpenseEntitySerializer implements StructuredSerializer { BuiltList, const [const FullType(ExpenseScheduleEntity)])) as BuiltList); break; + case 'loadedAt': + result.loadedAt = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; case 'isChanged': result.isChanged = serializers.deserialize(value, specifiedType: const FullType(bool)) as bool; @@ -941,6 +951,8 @@ class _$ExpenseEntity extends ExpenseEntity { @override final BuiltList recurringDates; @override + final int loadedAt; + @override final bool isChanged; @override final int createdAt; @@ -1006,6 +1018,7 @@ class _$ExpenseEntity extends ExpenseEntity { this.nextSendDate, this.remainingCycles, this.recurringDates, + this.loadedAt, this.isChanged, this.createdAt, this.updatedAt, @@ -1244,6 +1257,7 @@ class _$ExpenseEntity extends ExpenseEntity { ..add('nextSendDate', nextSendDate) ..add('remainingCycles', remainingCycles) ..add('recurringDates', recurringDates) + ..add('loadedAt', loadedAt) ..add('isChanged', isChanged) ..add('createdAt', createdAt) ..add('updatedAt', updatedAt) @@ -1446,6 +1460,10 @@ class ExpenseEntityBuilder set recurringDates(ListBuilder recurringDates) => _$this._recurringDates = recurringDates; + int _loadedAt; + int get loadedAt => _$this._loadedAt; + set loadedAt(int loadedAt) => _$this._loadedAt = loadedAt; + bool _isChanged; bool get isChanged => _$this._isChanged; set isChanged(bool isChanged) => _$this._isChanged = isChanged; @@ -1534,6 +1552,7 @@ class ExpenseEntityBuilder _nextSendDate = $v.nextSendDate; _remainingCycles = $v.remainingCycles; _recurringDates = $v.recurringDates?.toBuilder(); + _loadedAt = $v.loadedAt; _isChanged = $v.isChanged; _createdAt = $v.createdAt; _updatedAt = $v.updatedAt; @@ -1615,6 +1634,7 @@ class ExpenseEntityBuilder nextSendDate: BuiltValueNullFieldError.checkNotNull(nextSendDate, 'ExpenseEntity', 'nextSendDate'), remainingCycles: BuiltValueNullFieldError.checkNotNull(remainingCycles, 'ExpenseEntity', 'remainingCycles'), recurringDates: _recurringDates?.build(), + loadedAt: loadedAt, isChanged: isChanged, createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, 'ExpenseEntity', 'createdAt'), updatedAt: BuiltValueNullFieldError.checkNotNull(updatedAt, 'ExpenseEntity', 'updatedAt'), diff --git a/lib/ui/expense/view/expense_view.dart b/lib/ui/expense/view/expense_view.dart index a064b0609..2c0164d10 100644 --- a/lib/ui/expense/view/expense_view.dart +++ b/lib/ui/expense/view/expense_view.dart @@ -92,6 +92,10 @@ class _ExpenseViewState extends State ? localization.documents : '${localization.documents} (${expense.documents.length})', ), + if (expense.isRecurring) + Tab( + text: localization.schedule, + ) ], ), body: Builder(builder: (context) { @@ -113,6 +117,12 @@ class _ExpenseViewState extends State child: ExpenseViewDocuments( viewModel: viewModel, expense: viewModel.expense), ), + if (expense.isRecurring) + RefreshIndicator( + onRefresh: () => viewModel.onRefreshed(context), + child: ExpenseViewDocuments( + viewModel: viewModel, expense: viewModel.expense), + ), ], ), ),