diff --git a/lib/data/models/task_model.dart b/lib/data/models/task_model.dart index 758ab94c1..4c3009fd6 100644 --- a/lib/data/models/task_model.dart +++ b/lib/data/models/task_model.dart @@ -7,10 +7,12 @@ import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:collection/collection.dart'; import 'package:diacritic/diacritic.dart'; +import 'package:flutter_redux/flutter_redux.dart'; // Project imports: import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; +import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/task_status/task_status_selectors.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -106,10 +108,26 @@ abstract class TaskTime implements Built { Duration get duration => (endDate ?? DateTime.now()).difference(startDate); - List get asList => [ - (startDate.millisecondsSinceEpoch / 1000).floor(), - endDate != null ? (endDate.millisecondsSinceEpoch / 1000).floor() : 0 - ]; + List get asList { + final startTime = (startDate.millisecondsSinceEpoch / 1000).floor(); + var endTime = + endDate != null ? (endDate.millisecondsSinceEpoch / 1000).floor() : 0; + + final store = StoreProvider.of(navigatorKey.currentContext); + final company = store.state.company; + + // Handle the end time being before the start time + if (!company.showTaskEndDate && endTime != 0) { + const oneDay = 24 * 60 * 60; + if (endTime < startTime) { + endTime += oneDay; + } else if (endTime - startTime > oneDay) { + endTime -= oneDay; + } + } + + return [startTime, endTime]; + } TaskTime get stop => rebuild((b) => b..endDate = DateTime.now().toUtc()); diff --git a/lib/ui/task/edit/task_edit_times.dart b/lib/ui/task/edit/task_edit_times.dart index 4f933b5aa..2d5ca227a 100644 --- a/lib/ui/task/edit/task_edit_times.dart +++ b/lib/ui/task/edit/task_edit_times.dart @@ -126,6 +126,10 @@ class TimeEditDetailsState extends State { final company = viewModel.company; final showEndDate = company.showTaskEndDate; + // Handle the end time being before the start time + final times = _taskTime.asList; + final duration = Duration(seconds: times[1] - times[0]); + return AlertDialog( content: SingleChildScrollView( child: Column( @@ -203,7 +207,7 @@ class TimeEditDetailsState extends State { selectedDuration: (_taskTime.startDate == null || _taskTime.endDate == null) ? null - : _taskTime.duration, + : duration, ), ], ),