health_trend_control.dart
2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import 'package:get/get.dart';
import '../../report_common/config/report_date_range_config.dart';
import '../../report_common/models/report_period.dart';
mixin HealthTrendControl on GetxController {
static const int typeCount = 3;
final selectedTypeIndex = 0.obs;
final selectedPeriod = ReportPeriod.week.obs;
final selectedDate = ReportDateRangeConfig.clampDate(DateTime.now()).obs;
final List<ReportPeriod> _periodsByType = List.of(const [
ReportPeriod.week,
ReportPeriod.day,
ReportPeriod.day,
]);
final List<DateTime> _datesByType = List.generate(
typeCount,
(_) => ReportDateRangeConfig.clampDate(DateTime.now()),
);
void changeType(int index) {
final nextIndex = normalizeTypeIndex(index);
selectedTypeIndex.value = nextIndex;
_periodsByType[nextIndex] =
normalizePeriod(nextIndex, _periodsByType[nextIndex]);
selectedPeriod.value = _periodsByType[nextIndex];
selectedDate.value = _datesByType[nextIndex];
}
void changePeriod(ReportPeriod period) {
final typeIndex = normalizeTypeIndex(selectedTypeIndex.value);
final nextPeriod = normalizePeriod(typeIndex, period);
_periodsByType[typeIndex] = nextPeriod;
selectedPeriod.value = nextPeriod;
}
void changeDate(DateTime date) {
final typeIndex = normalizeTypeIndex(selectedTypeIndex.value);
final nextDate = ReportDateRangeConfig.clampDate(date);
_datesByType[typeIndex] = nextDate;
selectedDate.value = nextDate;
}
ReportPeriod periodForType(int typeIndex) {
final normalizedIndex = normalizeTypeIndex(typeIndex);
return normalizePeriod(normalizedIndex, _periodsByType[normalizedIndex]);
}
DateTime dateForType(int typeIndex) {
return _datesByType[normalizeTypeIndex(typeIndex)];
}
int normalizeTypeIndex(int index) =>
index >= 0 && index < typeCount ? index : 0;
ReportPeriod normalizePeriod(int typeIndex, ReportPeriod period) {
final periods = supportedPeriods(normalizeTypeIndex(typeIndex));
return periods.contains(period) ? period : periods.first;
}
List<ReportPeriod> supportedPeriods(int typeIndex) {
return normalizeTypeIndex(typeIndex) == 0
? const [ReportPeriod.week, ReportPeriod.month, ReportPeriod.year]
: const [ReportPeriod.day, ReportPeriod.week, ReportPeriod.month];
}
}